SSO CAS 探究
CAS的官網(wǎng):http://www.jasig.org/cas
CAS Server wiki:https://wiki.jasig.org/display/CASUM/Home
CAS Client wiki:https://wiki.jasig.org/display/CASC/Home
http://blog.csdn.net/haydenwang8287/article/details/5765941
http://www.micmiu.com/enterprise-app/sso/sso-cas-sample/
http://yuzhwe.iteye.com/blog/830143? 獲取更多用戶信息
?http://www.doc88.com/p-598933477220.html?
http://toplchx.iteye.com/blog/1013001cas 與spring security整合
CAS 基礎(chǔ)配置
1JDK環(huán)境變量設(shè)置
2?安全證書(shū)配置
3?部署CAS-Server相關(guān)的Tomcat
4?部署CAS-Client相關(guān)的Tomcat
5 不使用HTTPS配置
6 Client端獲取Server 登陸信息
7 Clinet 獲取更多用戶信息配置
?
1 環(huán)境變量
set JAVA_HOME=D:\sso\jdk1.6.0_13
set TOMCAT_HOME=D:\sso\cas-apache-tomcat-6.0.35
2 證書(shū)配置
1 創(chuàng)建
keytool -genkey -alias?zendai?-keyalg RSA -keysize 1024 -keypass changeit -validity 365 -keystore d:\sso\zendai.keystore -storepass changeit
姓氏:uc.zendai.com ?(要與訪問(wèn)cas server域名相同,非常重要)
單位名稱:zendai.com
組織名:zendai
城市:SH
身份:SH
國(guó)家:CN
2 導(dǎo)出
keytool -export?-alias?zendai -keystore d:\sso\zendai.keystore -file?d:\sso\zendai.crt -storepass changeit
3 刪除
keytool -delete -alias zendai -keystore D:\j2ee\jdk1.6.0_30\jre\lib\security\cacerts
pwd:changeit
4 導(dǎo)入
keytool -import?-keystore D:\j2ee\jdk1.6.0_30\jre\lib\security\cacerts -file?d:\sso\zendai.crt -alias?zendai
pwd:changeit
5 查看所有證書(shū)
keytool -list -keystore?D:\j2ee\jdk1.6.0_30\jre\lib\security\cacerts
pwd:changeit
?
注意:
CAS 證書(shū)制作經(jīng)常容易出?PKIX path building failed:報(bào)錯(cuò)
解決方法:
1 檢查導(dǎo)入的JDK是否是系統(tǒng)環(huán)境變量默認(rèn)的JDK。
2 檢查設(shè)置環(huán)境變量的JDK證書(shū)是否導(dǎo)入.
3 證書(shū)導(dǎo)入成功確認(rèn)后,確認(rèn)CAS SERVER 8443路徑認(rèn)證的 證書(shū)是否與導(dǎo)入的證書(shū)一致.
?3 Server 端
CAS的官網(wǎng):http://www.jasig.org/cas?下載Server 端和Client端
修改 tomcat conf server.xml
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="keystore/ssodemo.keystore" keystorePass="michaelpwd"
clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8" />
?
4 Client端
client端 加入 cas-core-client.jar,common-logger.jar 后修改web.xml
<!-- ======================== 單點(diǎn)登錄開(kāi)始 ======================== -->
<!-- 用于單點(diǎn)退出,該過(guò)濾器用于實(shí)現(xiàn)單點(diǎn)登出功能,可選配置 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 該過(guò)濾器用于實(shí)現(xiàn)單點(diǎn)登出功能,可選配置。 -->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
?
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://demo.micmiu.com:8443/cas-server/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://app1.micmiu.com:8888</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 該過(guò)濾器負(fù)責(zé)對(duì)Ticket的校驗(yàn)工作,必須啟用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://demo.micmiu.com:8443/cas-server</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://app1.micmiu.com:8888</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
?
<!-- 該過(guò)濾器負(fù)責(zé)實(shí)現(xiàn)HttpServletRequest請(qǐng)求的包裹, 比如允許開(kāi)發(fā)者通過(guò)HttpServletRequest的getRemoteUser()方法獲得SSO登錄用戶的登錄名,可選配置。 -->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
?
<!-- 該過(guò)濾器使得開(kāi)發(fā)者可以通過(guò)org.jasig.cas.client.util.AssertionHolder來(lái)獲取用戶的登錄名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- ======================== 單點(diǎn)登錄結(jié)束 ======================== -->
?
CAS 動(dòng)態(tài)登陸認(rèn)證
1??復(fù)制所需的類庫(kù)到web應(yīng)用下,如下二個(gè)jar包。
cas-server-support-jdbc-3.1.1.jar
2?配置cas/WEB-INF/目錄下的deployerConfigContext.xml 文件。
注釋掉?<bean?class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />????
增加數(shù)據(jù)源<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
?????? <property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
?????? <property name="url"><value>jdbc:oracle:thin:@localhost:1521:oracle</value></property>
?????? <property name="username"><value>foundation</value></property>
?????? <property name="password"><value>foundation</value></property>
//?<property?name="passwordEncoder"?ref="MD5PasswordEncoder"/>
??? </bean>
3?改變認(rèn)證方式
<bean??class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
變?yōu)閿?shù)據(jù)庫(kù)認(rèn)證方式:
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
??????? <property name="sql" value="select password from app_user where username=?" />
????? <property name="dataSource" ref="dataSource" />
</bean>
?
4 添加解密方式
<bean?id="MD5PasswordEncoder"class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">??
? ? ? ??<constructor-arg?index="0">
? ? ? ? ? ? ? ??<value>MD5</value>
? ? ? ??</constructor-arg>
</bean>
?
5 不使用HTTPS證書(shū)配置
? ? ? ? ? ??1、tomcat/webapps/cas/WEB-INF/deployerConfigContext.xml
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
????????????????????????????????????????????????????????????p:httpClient-ref="httpClient"/>
????????????增加參數(shù)p:requireSecure="false",是否需要安全驗(yàn)證,即HTTPS,false為不采用,加上去之后如下:
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
????????????????????????????????????????????????????????????p:httpClient-ref="httpClient"??p:requireSecure="false"/>
?
????????????2、Tomcat 6.0/webapps/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" />
參數(shù)p:cookieSecure="true",同理為HTTPS驗(yàn)證相關(guān),TRUE為采用HTTPS驗(yàn)證,與deployerConfigContext.xml的參數(shù)保持一致。
參數(shù)p:cookieMaxAge="-1",簡(jiǎn)單說(shuō)是COOKIE的最大生命周期,-1為無(wú)生命周期,即只在當(dāng)前打開(kāi)的IE窗口有效,IE關(guān)閉或重新打開(kāi)其它窗口,仍會(huì)要求驗(yàn)證。可以根據(jù)需要修改為大于0的數(shù)字,比如3600等,意思是在3600秒內(nèi),打開(kāi)任意IE窗口,都不需要驗(yàn)證。
?
warnCookieGenerator.xml
<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
?????????????????p:cookieSecure="true"
?????????????????p:cookieMaxAge="-1"
?????????????????p:cookieName="CASPRIVACY"
?????????????????p:cookiePath="/cas" />
兩個(gè)參數(shù)與上面同理。
?
3、TICKET的生命周期也可以在web.xml加這個(gè)參數(shù)實(shí)現(xiàn):
<!-- Timeout for granting tickets -->
????<context-param>
????????<param-name>edu.yale.its.tp.cas.grantingTimeout</param-name>
????????<param-value>7200</param-value>
????</context-param>
? 6 Client獲取Server登陸信息
Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION);
AttributePrincipal principal = assertion.getPrincipal();
?
7 獲取更多用戶信息配置
<!-- 在這里配置獲取更多的信息 -->?
<bean id="attributeRepository" class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">?
<constructor-arg index="0" ref="dataSource" />?
<constructor-arg index="1" value="select U_id as UId,U_type as UType,U_email as UEmail from t_user where U_username=?" />?
<property name="queryAttributeMapping">?
<map>?
<entry key="username" value="uid"/><!-- 這里必須這么寫(xiě),系統(tǒng)會(huì)自己匹配。 -->?
</map>?
</property>?
<!-- 要獲取的屬性在這里配置 -->?
<property name="resultAttributeMapping">?
<map>?
<entry key="UId" value="U_id" />?
<entry key="UType" value="U_type" />?
<entry key="UEmail" value="U_email" />?
</map>?
</property>?
</bean>?
在客戶端獲取信息
???? AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
???? String loginName = principal.getName();//獲取用戶名
???? Map<String, Object> attributes = principal.getAttributes();
???? if(attributes != null) {
???????? System.out.println(attributes.get("U_id"));
???????? System.out.println(attributes.get("U_type"));
???????? System.out.println(attributes.get("U_email"));
???? }
?
?
CAS驗(yàn)證流程:?
1.用戶瀏覽受系統(tǒng)保護(hù)的URL。?
2.CAS Client服務(wù)端收到請(qǐng)求,Filter攔截該請(qǐng)求,在Filter中判斷該用戶是否已經(jīng)登陸,如果已經(jīng)登陸,就直接進(jìn)入系統(tǒng),否則,將請(qǐng)求轉(zhuǎn)發(fā)到CAS Server服務(wù)端的LoginURL。?
3.在LoginURL中會(huì)獲取到用戶的Cookie,檢驗(yàn)用戶是否已經(jīng)在其他相關(guān)使用SSO的系統(tǒng)登陸成功。如果已經(jīng)在其他的系統(tǒng)登陸了,則將請(qǐng)求轉(zhuǎn)回CAS Client,并且?guī)Щ匾粋€(gè)ticket, CAS Client再次發(fā)送請(qǐng)求到ValidateURL。否則,系統(tǒng)提示用戶輸入ID和PASSWORD。?
4. 提交后請(qǐng)求到ValidateURL,CAS Server驗(yàn)證ticket的有效性。然后返回結(jié)果給CAS Client。如果ticket有效,則CAS Client應(yīng)讓該用戶瀏覽受保護(hù)的資源。否則,重定向到登陸頁(yè)面,提示用戶輸入ID和PASSWORD。?
5. 校驗(yàn)ID和Password是否匹配。如不匹配,再次要求用戶輸入ID和PASSWORD。否則,CAS Server記錄用戶登陸成功。并向?yàn)g覽器回送Cookie,記錄用戶已經(jīng)登陸成功。如果瀏覽器不支持Cookie,則無(wú)法實(shí)現(xiàn)單點(diǎn)登陸。?
轉(zhuǎn)載于:https://www.cnblogs.com/adolfmc/archive/2012/07/23/2604303.html
總結(jié)
以上是生活随笔為你收集整理的SSO CAS 探究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 集训的感受
- 下一篇: Windows Phone开发(32):