php 카스로 SSO 싱글 로그인 및 로그아웃 기능 구현
1.CAS 서버 구축
CAS 서버 측 다운로드 주소: http://downloads.jasig.org/cas/
압축 풀기cas-server-4.0.0-release.zip은 modul을 사용합니다.es 디렉토리 아래의 cas-server-webapp-4.0.0.war를 cas.war 복사라고 개명하다tomcat의 webapps에서, tomcat을 기동하고, 접속: http://localhost:8080/cas/login으로 로그인 인터페이스를 볼 수 있습니다
http://blog.csdn.net/haydenwang8287/archive/2010/07/26/5765941.aspx
1. HTTP 인증을 사용하지 않을 경우 서버는 다음과 같이 구성해야 합니다.
파일 cas/WEB-INF/deployerConfigContext.xml를 찾습니다.
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
04.p:httpClient-ref="httpClient"/>
추가 파라미터 p:requireSecure="false"는 보안 검증이 필요한지 여부, 즉 HTTPS, false는 채택되지 않으며, 이를 더하면 다음과 같다
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient" p:requireSecure="false"/>
파일 찾기:cas/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml:
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas" />
파라미터 p:cookieSecure="true"는 HTTPS 검증에 관한 것으로, TRUE는 HTTPS 검증을, FALSE는 https 검증을 사용하지 않는다.
파라미터 p:cookieMaxAge="-1", 간단히 말해서 COKIE의 최대 라이프사이클, -1은 무라이프사이클, 즉 현재 열려 있는 IE창에서만 유효, IE가 닫히거나 무겁습니다.다른 창을 열어도 계속 확인됩니다.3600 등 필요에 따라 0보다 큰 숫자로 수정할 수 있습니다. 3600초 이내에 임의의 IE 창을 열어 놓고 검증할 필요가 없다는 의미입니다.
서버 종료 주소: http://localhost:8080/cas/logout, 그림과 같이:
종료 후 다시 돌아가려면 서비스 측 cas-servlet.xml 설정이 필요합니다
<bean id="logoutController" class="org.jasig.cas.web.logoutController".../>
속성 p:followServiceRedirects="true"
종료 링크: http://localhost:8080/cas/logout?service=http://localhost:8080/Casclient/index.jsp
2.서버 인증방식 변경, 데이터베이스 인증 적용
설정 파일 수정deployerConfigContext.xml, 추가dbcp 연결 풀: (oracle의 경우)
<bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@192.168.18.26:1521:orcl</value>
</property>
<property name="username">
<value>test</value>
</property>
<property name="password">
<value>test</value>
</property>
</bean>
필요한 jar 패킷은 (cas-server-support-jdbc-3.4.4.4.jar, comons-dbcp-1.2.1.jar, comons-pool-1.3.jar, ojdbc14_g.jar)이다.
암호화 방식을 배치하고, cas에 내장된 MD5 암호화도 자신의 암호화 클래스를 쓸 수 있으며, org.jasig.cas.authentication.handler.PasswordEncoder 인터페이스를 구현하면 된다
<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
<constructor-arg value="MD5"/>
</bean>
데이터베이스 질의로 인증하기 위해 기본 인증 방법을 설명하지 않습니다.
<property name="authenticationHandlers">
<list>
<!----여기의 기본 인증 방식을 참고하지 않고 다음과 같이 인증합니다QueryDatabaseAuthenticationHandler-->
<!-- <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /> -->
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="casDataSource" />
<property name="sql"
value="select password from userinfo where lower(username) = lower(?)" />
<property name="passwordEncoder" ref="passwordEncoder"/>
</bean>
</list>
</property>
서버 설정 완료
2.PHP 고객 설정계정
PHP 클라이언트 다운로드주소: http://downloads.jasig.org/cas-clients/php/, 현재 최신 버전은 CAS-1.2.0.ORC2입니다.
새 항목: phpCasClient. C를AS 폴더와 CAS.php를 프로젝트에 복사하여 CAS/client.php를 수정하고 HTTP로 변경하며, 새 php 파일:user.php. 이 파일은 처리 주문서에 사용됩니다.다음과 같은 내용을 담고 있다.
</pre><p><pre name="code" class="php"><pre name="code" class="php"><?php
class user
{
/**
* Logs out the current user and redirect to homepage.
*/
public function logout()
{
session_start();
//싱글 사인온 사용 시 통합 인증 센터에서 로그아웃해야 합니다 && isset($_SESSION['phpCAS']) && $_SESSION['phpCAS']['auth_checked'] == '1'
//引人cas
include_once '/CAS-1.2.0/CAS.php';
// initialize phpCAS
//phpCAS::client(CAS_VERSION_2_0,서비스 주소, 포트 번호, 'cas의 액세스 주소')
phpCAS::client(CAS_VERSION_2_0,"192.168.142.1","80","/cas");
//방법 1: 등록 후 점프할 주소 -- 등록 방법에 이 문장을 추가합니다.
/*
phpCAS::setServerLoginUrl("https://192.168.142.1:80/cas/logout?embed=true&service=http://localhost/phpCasClient/user.php?a=login");
//no SSL validation for the CAS server
phpCAS::setNoCasServerValidation();
phpCAS::logout();*/
//방법 2: 로그인을 종료하고 주소를 반환합니다. -- 로그아웃 방법에 이 문장을 추가합니다
phpCAS::setNoCasServerValidation();$param=array("service"=>"http://localhost/phpCasClient/user.php?a=login");
phpCAS::logout($param);
}
/**
* @desc LoginCas()원포인트 랜딩
*/
public function loginCas(){
Header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
//引人cas
include 'CAS-1.2.0/CAS.php';
// initialize phpCAS
//phpCAS::client(CAS_VERSION_2_0,'서비스 주소, 포트 번호, 'cas의 액세스 주소');
phpCAS::client(CAS_VERSION_2_0,"192.168.142.1","80","/cas",true);
//디버깅용으로 사용하지 않고 서비스 측의 cas.log를 통해 검증 과정을 볼 수 있다。
// phpCAS::setDebug();
//성공적으로 로그인한 후 점프할 주소 - 로그인 방법에 이 문장을 추가합니다
phpCAS::setServerLoginUrl("https://192.168.142.1:80/cas/login?embed=true&cssUrl=http://localhost/phpCasClient/style/login.css&service=http://localhost/phpCasClient/user.php?a=loginCas");
//no SSL validation for the CAS server SSL 서비스 검사 사용하지 않기
phpCAS::setNoCasServerValidation();
//여기서 서버 측의 퇴출 통지를 감지하면 php와 다른 언어 플랫폼 간에 동시 로그인이 가능하다
phpCAS::handleLogoutRequests();
if(phpCAS::checkAuthentication()){
//로그인한 사용자 이름 가져오기
$username=phpCAS::getUser();
//사용자가 성공적으로 로그인한 후 js를 이용하여 페이지 이동을 한다
echo "<script language=\"javascript\">parent.location.href='http://localhost/phpCasClient/home.php';</script>";
}else{
// CAS 접근 인증
phpCAS::forceAuthentication();
}
exit;
}
}
?>
새 보기 계층, login.html. 이 페이지는 다음과 같은 단일 로그인 페이지입니다
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>싱글 포인트 랜딩 인터페이스</title>
</head>
<body>
<div class="view">
<table style="width:600; height:333; border:1; align:center; cellpadding:4; bordercolor:#CCCCCC;">
<tr>
<td style="width: 50%;align:center;">
로그인 정보를 입력하세요:
</td>
<td style="width: 50%;">
<div id="maincol" style="border: 1px solid #ccc;float: left;width: 400px;height: 219px; overflow: hidden;">
<iframe id="auth-login-iframe" name="auth-login-iframe" style="width:100%; height:100%; marginwidth:0; marginheight:0; frameborder:0; scrolling:no;" src="http://localhost/phpCasClient/user.php?a=loginCas"></iframe>
</div>
</td>
</tr>
<tr>
<span style="white-space:pre"> </span><td><a href="http://localhost/phpCasClient/user.php?a=logout">登出</a></td>
</tr>
</table>
</div>
</body>
</html>
참고: php 프로필 php.ini를 php_curl을 찾아야 합니다. extension=php_curl.dll, 문장 앞의 세미콜론을 제거하고 extension=php_curl.dll로 바꿉니다.
이때 login.html에 접속하면 싱글 사인온 인터페이스를 볼 수 있으며, 로그인 성공 후 홈.php로 이동한다.
로그아웃을 누르면 제어 계층이 user.php에 로그아웃을 요청하는 방법, 로그아웃 요청을 처리한다. 로그아웃이 성공하면 페이지는 login.html로 넘어가 사용자에게 로그인을 요청한다.
이로써 php는 CAS를 이용한 싱글 사인온으로 로그아웃이 완료되었다.
'개발 꿀팁 > PHP' 카테고리의 다른 글
docker php 환경 구축 웹 프로젝트 실행 (0) | 2022.07.09 |
---|---|
PHP 디버깅 - 방식 (0) | 2022.07.09 |
자바는 왜 PHP보다 빠릅니까? (0) | 2022.07.09 |
PHP 포니, 포니, 포니 분석편찬 실현 (0) | 2022.07.09 |
php7 curl을 로드할 수 없는 문제 해결 및 반성 (0) | 2022.07.08 |