服務(wù)端配置
cas是個好東西,很靈活很好用,但是配置起來很麻煩,網(wǎng)上資料比較零碎。不弄個三五天根本不知道其中的原理,終于在多天的奮斗中配置成功,現(xiàn)在將配置的一些過程記錄下來供大家參考。
cas官方網(wǎng)站
http://www.jasig.org/cas
下載最新的服務(wù)端 CAS Server 3.3.3 Final
解壓后將modules下面的cas-server-webapp-3.3.3.war部署到web服務(wù)器,作為單點登錄的服務(wù)器。
登錄的服務(wù)器下面很多配置文件,通過配置可以做一些擴展。
修改點1:驗證方式使用我們自己的用戶表驗證
cas和當(dāng)前已有的系統(tǒng)做集成的入口
1.修改deployerConfigContext.xml文件
添加數(shù)據(jù)源配置
XML/HTML代碼
- <bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource">
- <property name="driverClassName">
- <value>com.mysql.jdbc.Driver</value>
- </property>
- <property name="url">
- <value>jdbc:mysql://192.168.1.100/ires?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true</value>
- </property>
- <property name="username">
- <value>ires</value>
- </property>
- <property name="password">
- <value>i709394</value>
- </property>
- </bean>
定義MD5的加密方式
XML/HTML代碼
- <bean id="passwordEncoder"
- class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
- <constructor-arg value="MD5"/>
- </bean>
配置authenticationManager下面的authenticationHandlers屬性
XML/HTML代碼
- <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
- <property name="dataSource" ref="casDataSource" />
- <property name="sql" value="select community_password from community_user_info where lower(community_user_info.community_user) = lower(?)" />
- <property name="passwordEncoder" ref="passwordEncoder"/>
- </bean>
修改點2:獲取用戶信息保存,方便各個客戶端可以統(tǒng)一得到用戶信息
1.定義attributeRepository,通過jdbc查詢用戶的詳細信息,可以把用戶表或用戶的所屬組織機構(gòu)或角色等查詢出來。
XML/HTML代碼
- <bean id="attributeRepository" class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">
- <constructor-arg index="0" ref="casDataSource" />
- <constructor-arg index="1" >
- <list>
- <value>username</value>
- <value>username</value>
- </list>
- </constructor-arg>
- <constructor-arg index="2">
- <value>
- select * ,(SELECT orgn_organization.id from orgn_organization left join orgn_member on orgn_member.orgn_id = orgn_organization.id left join community_user_info on community_user_info.id = orgn_member.user_id where community_user_info.community_user = ?) as orgnId from community_user_info where community_user=?
- </value>
- </constructor-arg>
- <property name="columnsToAttributes">
- <map>
- <entry key="id" value="id" />
- <entry key="community_user" value="userName" />
- <entry key="orgnId" value="orgnId" />
- <entry key="is_admin" value="isAdmin" />
-
- </map>
- </property>
- </bean>
2.配置authenticationManager中credentialsToPrincipalResolvers屬性
XML/HTML代碼
- <bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver">
- <property name="attributeRepository" ref="attributeRepository" /> </bean>
注意:默認cas登錄服務(wù)器沒有把用戶信息傳到客戶端中,所以要修改WEB-INF\view\jsp\protocol\2.0\casServiceValidationSuccess.jsp文件,增加
XML/HTML代碼
- <c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">
- <cas:attributes>
- <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">
-
- <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>
-
-
- </c:forEach>
- </cas:attributes>
- </c:if>
修改點3:用數(shù)據(jù)庫來保存登錄的會話
這樣服務(wù)器在重新啟動的時候不會丟失會話。
1.修改ticketRegistry.xml文件
將默認的ticketRegistry改成
XML/HTML代碼
- <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.JpaTicketRegistry">
- <constructor-arg index="0" ref="entityManagerFactory" />
- </bean>
-
- <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
- <property name="dataSource" ref="dataSource"/>
- <property name="jpaVendorAdapter">
- <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
- <property name="generateDdl" value="true"/>
- <property name="showSql" value="true" />
- </bean>
- </property>
- <property name="jpaProperties">
- <props>
- <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
- <prop key="hibernate.hbm2ddl.auto">update</prop>
- </props>
- </property>
- </bean>
-
- <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
- p:entityManagerFactory-ref="entityManagerFactory" />
-
- <tx:annotation-driven transaction-manager="transactionManager"/>
-
- <bean
- id="dataSource"
- class="org.apache.commons.dbcp.BasicDataSource"
- p:driverClassName="com.mysql.jdbc.Driver"
- p:url="jdbc:mysql://192.168.1.100:3306/cas?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true"
- p:password="709394"
- p:username="itravel" />
配置完之后還需要一些jar的支持,根據(jù)提示那些包缺少到網(wǎng)上找。
修改點4:配置remenber me的功能,可以讓客戶端永久保存session
1.修改deployerConfigContext.xml文件
authenticationManager增加authenticationMetaDataPopulators屬性
XML/HTML代碼
- <property name="authenticationMetaDataPopulators">
- <list>
- <bean class="org.jasig.cas.authentication.principal.RememberMeAuthenticationMetaDataPopulator" />
- </list>
- </property>
2.修改cas-servlet.xml
修改authenticationViaFormAction配置變成
XML/HTML代碼
- <bean id="authenticationViaFormAction" class="org.jasig.cas.web.flow.AuthenticationViaFormAction"
- p:centralAuthenticationService-ref="centralAuthenticationService"
- p:formObjectClass="org.jasig.cas.authentication.principal.RememberMeUsernamePasswordCredentials"
- p:formObjectName="credentials"
- p:validator-ref="UsernamePasswordCredentialsValidator"
- p:warnCookieGenerator-ref="warnCookieGenerator" />
增加UsernamePasswordCredentialsValidator
XML/HTML代碼
- <bean id="UsernamePasswordCredentialsValidator" class="org.jasig.cas.validation.UsernamePasswordCredentialsValidator" />
修改ticketExpirationPolicies.xml,grantingTicketExpirationPolicy配置如下,注意時間要加大,不然session很容易過期,達不到remember me的效果。
XML/HTML代碼
- <bean id="grantingTicketExpirationPolicy" class="org.jasig.cas.ticket.support.RememberMeDelegatingExpirationPolicy">
- <property name="sessionExpirationPolicy">
- <bean class="org.jasig.cas.ticket.support.TimeoutExpirationPolicy">
- <constructor-arg index="0" value="2592000000" />
- </bean>
- </property>
- <property name="rememberMeExpirationPolicy">
- <bean class="org.jasig.cas.ticket.support.TimeoutExpirationPolicy">
- <constructor-arg index="0" value="2592000000" />
- </bean>
- </property>
- </bean>
登錄頁面要增加隱藏字段rememberMe,值是true,或用一個checkbox來勾選。
修改點5:取消https驗證
在網(wǎng)絡(luò)安全性較好,對系統(tǒng)安全沒有那么高的情況下可以取消https驗證,使系統(tǒng)更加容易部署。
1.修改ticketGrantingTicketCookieGenerator.xml
XML/HTML代碼
- <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
- p:cookieSecure="false"
- p:cookieMaxAge="-1"
- p:cookieName="CASTGC"
- p:cookiePath="/cas" />
p:cookieSecure改成false,客戶端web.xml中單獨服務(wù)器的鏈接改成http
使用https協(xié)議的配置
1.證書生成和導(dǎo)入
下面是一個生成證書和導(dǎo)入證書的bat腳本,如果web應(yīng)用和單獨登錄服務(wù)器部署在同一臺機可以一起執(zhí)行
C++代碼
- @echo off
- if "%JAVA_HOME%" == "" goto error
- @echo on
-
- @echo off
- cls
- rem please set the env JAVA_HOME before run this bat file
- rem delete alia tomcat if it is existed
- keytool -delete -alias tomcatsso -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
- keytool -delete -alias tomcatsso -storepass changeit
- REM (注釋: 清除系統(tǒng)中可能存在的名字為tomcatsso 的同名證書)
- rem list all alias in the cacerts
- keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
- REM (注釋: 列出系統(tǒng)證書倉庫中存在證書名稱列表)
- rem generator a key
- keytool -genkey -keyalg RSA -alias tomcatsso -dname "cn=localhost" -storepass changeit
- REM (注釋:指定使用RSA算法,生成別名為tomcatsso的證書,存貯口令為changeit,證書的DN為"cn=linly" ,這個DN必須同當(dāng)前主機完整名稱一致哦,切記!?。。?
- rem export the key
- keytool -export -alias tomcatsso -file "%java_home%/jre/lib/security/tomcatsso.crt" -storepass changeit
- REM (注釋: 從keystore中導(dǎo)出別名為tomcatsso的證書,生成文件tomcatsso.crt)
- rem import into trust cacerts
- keytool -import -alias tomcatsso -file "%java_home%/jre/lib/security/tomcatsso.crt" -keystore "%java_home%/jre/lib/security/cacerts" -storepass changeit
- REM (注釋:將tomcatsso.crt導(dǎo)入jre的可信任證書倉庫。注意,安裝JDK是有兩個jre目錄,一個在jdk底下,一個是獨立的jre,這里的目錄必須同Tomcat使用的jre目錄一致,否則后面Tomcat的HTTPS通訊就找不到證書了)
- rem list all alias in the cacerts
- keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
- pause
-
- :error
- echo 請先設(shè)置JAVA_HOME環(huán)境變量
- :end
3.將.keystore文件拷貝到tomcat的conf目錄下面,注意.keystore會在證書生成的時候生成到系統(tǒng)的用戶文件夾中,如windows會生產(chǎn)到C:\Documents and Settings\[yourusername]\下面
2.配置tomcat,把https協(xié)議的8443端口打開,指定證書的位置。
XML/HTML代碼
- <Connector port="8443" maxHttpHeaderSize="8192"
- maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
- enableLookups="false" disableUploadTimeout="true"
- acceptCount="100" scheme="https" secure="true"
- clientAuth="false" sslProtocol="TLS"
- keystoreFile="conf/.keystore" keystorePass="changeit" truststoreFile="C:\Program Files\Java\jdk1.5.0_07\jre\lib\security\cacerts"/>
客戶端配置
cas官方網(wǎng)站上面的客戶端下載地址比較隱秘,沒有完全公開,具體地址為
http://www.ja-sig.org/downloads/cas-clients/
下載最新的cas-client-3.1.6-release.zip
1.解壓后把modules下面的包放到我們的web應(yīng)用中
2.配置web.xml,注意encodingFilter要提前配置,不然會出現(xiàn)數(shù)據(jù)插入數(shù)據(jù)庫的時候有亂碼。
serverName是我們web應(yīng)用的地址和端口
3.導(dǎo)入證書,如果不用https的話,這步可以跳過,把tomcatsso.crt證書拷貝到c盤下面,在jdk的bin目錄下面運行下面的語句。
JavaScript代碼
- rem (注釋: 清除系統(tǒng)中可能存在的名字為tomcatsso 的同名證書)
- keytool -delete -alias tomcatsso -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
- keytool -delete -alias tomcatsso -storepass changeit
-
- rem 在客戶端的 JVM 里導(dǎo)入信任的 SERVER 的證書 ( 根據(jù)情況有可能需要管理員權(quán)限 )
- keytool -import -alias tomcatsso -file "c:/tomcatsso.crt" -keystore "%java_home%/jre/lib/security/cacerts" -storepass changeit
客戶端獲取登錄用戶名和用戶信息實例
Java代碼
- HttpServletRequest request = ServletActionContext.getRequest();
- AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();
- String username = principal.getName();
- Long orgnId = Long.parseLong(principal.getAttributes().get("orgnId").toString());
posted on 2009-10-20 18:21
流腥魚 閱讀(20443)
評論(13) 編輯 收藏 所屬分類:
java