개발 꿀팁/PHP

php 카스로 SSO 싱글 로그인 및 로그아웃 기능 구현

Jammie 2022. 7. 9. 15:09
반응형

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를 이용한 싱글 사인온으로 로그아웃이 완료되었다.

반응형