maven-3.3.9java
cas-4.1.4mysql
Tomcat-7.0.57-win-x64git
cas-sample-java-webappgithub
一、下載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,如上步驟解壓編譯,編譯後再也不操做,待用。
上面咱們採用的是默認配置,登陸帳號其實是在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&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鏈接成功了。
這裏咱們將用到第一步裏面待用的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就完成了。
在咱們的應用場景中,客戶端須要的參數不只僅是用戶名。還須要諸如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字段是由於沒有值,因此他默認就不傳遞了。