cas 4.X單點登陸實戰

使用工具

maven-3.3.9java

cas-4.1.4mysql

Tomcat-7.0.57-win-x64git

cas-sample-java-webappgithub

1、Hello cas

一、下載Tomcat,解壓;修改其server.xml,增長對SSL支持(具體百度):web

1 <Connector SSLEnabled="true" acceptCount="100" clientAuth="false"
2 disableUploadTimeout="true" enableLookups="false" maxThreads="25"
3 port="8443" keystoreFile="G:/work/xxx/tomcat.keystore" keystorePass="YOUR PASSWORD HERE"
4 protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
5 secure="true" sslProtocol="TLS" />

 

一、從https://github.com/Jasig/cas/releases 下載cas-server對應的版本;正則表達式

二、解壓,使用maven命令mvn package對cas進行編譯打包,這裏可能會出現2個問題:spring

  a.單元測試不經過==》嘗試加上-Dmaven.test.skip=true跳過;sql

  b.編譯到一半編譯不過==》進入cas-server-core,執行命令mvn install -Dmaven.test.skip=true先將core編譯爲jar包後,再進行。數據庫

三、將打包好的cas-server-webapp下的war包複製到tomcat下,運行tomcat先試試吧;apache

四、使用帳號casuser,密碼Mellon登陸,成功

五、從https://github.com/Jasig/java-cas-client 下載java-cas-client,如上步驟解壓編譯,編譯後再也不操做,待用。

六、從https://github.com/UniconLabs/cas-sample-java-webapp 下載cas-sample-java-webapp,如上步驟解壓編譯,編譯後再也不操做,待用。

 

2、server配置數據庫鏈接認證

   上面咱們採用的是默認配置,登陸帳號其實是在cas/WEB-INF/deployerConfigContext.xml配置寫死的。固然不符合咱們大多數的實際使用場景。如今咱們將其改成鏈接Mysql數據庫驗證。

一、回到咱們剛剛maven編譯的cas目錄下,將cas-server-support-jdbc/target/cas-server-support-jdbc-4.1.4.jar 複製到tomcat/webapp/cas/WEB-INF/lib下,再複製mysql-connector-java-5.0.8-bin.jar到tomcat/webapp/cas/WEB-INF/lib下。固然這些你能夠在cas-server-webapp下的pom.xml進行依賴添加再進行打包編譯。

二、修改cas/WEB-INF/deployerConfigContext.xml,這裏須要注意修改如下地方:

1 <bean id="primaryAuthenticationHandler"
2          class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
3        <property name="users">
4            <map>
5                <entry key="casuser" value="Mellon"/>
6            </map>
7        </property>
8 </bean>

註釋以上代碼,增長以下代碼

 1     <bean id="dataSource"
 2         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 3         <property name="driverClassName" value="com.mysql.jdbc.Driver" />
 4         <property name="url"
 5             value="jdbc:mysql://10.3.64.87:3306/cas?characterEncoding=utf-8&amp;autoReconnect=true" />
 6         <property name="username" value="root" />
 7         <property name="password" value="123456" />
 8     </bean>
 9     
10     <bean id="primaryAuthenticationHandler"
11           class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
12           p:dataSource-ref="dataSource"
13           p:passwordEncoder-ref="MD5PasswordEncoder"
14           p:sql="select password from user_info where user_name=?" />
15           
16     <bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
17         <constructor-arg index="0">
18             <value>MD5</value>
19         </constructor-arg>
20     </bean>

這裏咱們增長了MySQL的數據鏈接dataSource,並編寫了SQL查詢用戶認證信息。

修改完成,咱們來測試一下可否經過MySQL進行認證。啓動tomcat。

 

 登陸成功,咱們已經成功和MYSQL鏈接成功了。

3、添加客戶端

  這裏咱們將用到第一步裏面待用的cas-sample-java-webapp。

一、將編譯好的cas-sample-java-webapp/target/cas-sample-java-webapp.war部署到tomcat下;

二、找到tomcat/webapp/cas-sample-java-webapp/WEB-INF/web.xml,刪除如下代碼

 1      <init-param>
 2             <param-name>redirectAfterValidation</param-name>
 3             <param-value>true</param-value>
 4         </init-param>
 5         <init-param>
 6             <param-name>useSession</param-name>
 7             <param-value>true</param-value>
 8         </init-param>
 9         <init-param>
10             <param-name>acceptAnyProxy</param-name>
11             <param-value>true</param-value>
12         </init-param>
13         <init-param>
14             <param-name>proxyReceptorUrl</param-name>
15             <param-value>/client/proxyUrl</param-value>
16         </init-param>
17         <init-param>
18             <param-name>proxyCallbackUrl</param-name>
19             <param-value>https://zhuajindian.com:8443/client/proxyUrl</param-value>
20         </init-param>

 

其中的多個casServerUrlPrefix、serverName、casServerLoginUrl替換成你本身的URL。

三、修改deployerConfigContext.xml,找到下面的代碼

1     <bean id="serviceRegistryDao" class="org.jasig.cas.services.JsonServiceRegistryDao"
2           c:configDirectory="${service.registry.config.location:classpath:services}" />

替換爲

1     <!-- 註冊服務 -->
2     <bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl"
3             p:registeredServices-ref="registeredServicesList" />
4 
5     <util:list id="registeredServicesList">
6         <bean class="org.jasig.cas.services.RegexRegisteredService"
7               p:id="0" p:name="HTTP and IMAP" p:description="Allows HTTP(S) and IMAP(S) protocols"
8               p:serviceId="^(https?|http?|imaps?)://.*" p:evaluationOrder="10000001" />
9     </util:list>

這裏的serviceId就是你告訴cas服務器端,經過這個正則來判斷,符合這個正則表達式的,就是咱們本身的客戶端。固然這裏泛匹配了,你能夠根據實際狀況來。

四、重啓tomcat,訪問剛剛填寫在serverName處的URL試試

能夠看到,咱們已經可以成功獲取到Authenticated UserId,也就是登陸的用戶名。這樣,咱們的簡單demo就完成了。

4、自定義登陸後的可傳遞字段,方便客戶端讀取

  在咱們的應用場景中,客戶端須要的參數不只僅是用戶名。還須要諸如userid等各種信息,那麼,接下來咱們就來配置獲取自定義字段。

一、找到cas/WEB-INF/deployerConfigContext.xml,註釋如下代碼:

 1     <bean id="attributeRepository" class="org.jasig.services.persondir.support.NamedStubPersonAttributeDao"
 2           p:backingMap-ref="attrRepoBackingMap" />
 3 
 4     <util:map id="attrRepoBackingMap">
 5         <entry key="uid" value="uid" />
 6         <entry key="eduPersonAffiliation" value="eduPersonAffiliation" />
 7         <entry key="groupMembership" value="groupMembership" />
 8         <entry>
 9             <key><value>memberOf</value></key>
10             <list>
11                 <value>faculty</value>
12                 <value>staff</value>
13                 <value>org</value>
14             </list>
15         </entry>
16     </util:map>

替換爲:

 1     <bean id="attributeRepository" class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">
 2         <constructor-arg index="0" ref="dataSource" />
 3         <constructor-arg index="1" value="SELECT id,user_name,mobile,cid FROM user_info WHERE {0}" />
 4             <property name="queryAttributeMapping">
 5                 <map>
 6                     <entry key="username" value="user_name" />
 7                 </map>
 8             </property>
 9             <property name="resultAttributeMapping">
10                 <map>
11                     <entry key="id" value="userId" />
12                     <entry key="user_name" value="username" />
13                     <entry key="mobile" value="mobile" />
14                     <entry key="cid" value="cid" />
15                 </map>
16             </property>
17     </bean>

其中的sql只須要寫前半部分,如示例,entry的key表明上面sql查詢的字段,value表明服務端傳給客戶端的參數名,客戶端能夠經過value取出對應的值。

二、修改cas/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp,增長下面這段

 1 <cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
 2     <cas:authenticationSuccess>
 3         <cas:user>${fn:escapeXml(principal.id)}</cas:user>
 4         <!-- 這段 -->
 5         <c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">
 6             <cas:attributes>
 7                 <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">
 8                     <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>
 9                 </c:forEach>
10             </cas:attributes>
11         </c:if>
12         <!-- 這段 end-->
13         <c:if test="${not empty pgtIou}">
14             <cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>
15         </c:if>
16         <c:if test="${fn:length(chainedAuthentications) > 0}">
17             <cas:proxies>
18                 <c:forEach var="proxy" items="${chainedAuthentications}" varStatus="loopStatus" begin="0" end="${fn:length(chainedAuthentications)}" step="1">
19                     <cas:proxy>${fn:escapeXml(proxy.principal.id)}</cas:proxy>
20                 </c:forEach>
21             </cas:proxies>
22         </c:if>
23     </cas:authenticationSuccess>
24 </cas:serviceResponse>

三、重啓tomcat,登陸看效果:

上面配置的4個參數這裏顯示了3個,原來mobile字段是由於沒有值,因此他默認就不傳遞了。

相關文章
相關標籤/搜索