服務端配置
cas是個好東西,很靈活很好用,但是配置起來很麻煩,網上資料比較零碎。不弄個三五天根本不知道其中的原理,終於在多天的奮鬥中配置成功,現在將配置的一些過程記錄下來供大家參考。
cas官方網站
下載最新的服務端 CAS Server 3.3.3 Final(http://www.jasig.org/cas/download/cas-server-333-final)
1、將服務器端解壓,將modules下面的cas-server-webapp-3.3.3.war部署到web服務器,重命名爲CAS.war,作爲單點的服務器。
2、導入modules中的cas-server-support-jdbc-3.3.3.jar包
3、導入數據庫驅動
4、導入附件中的所有文件 (commons-dbcp.jar,commons-pool-1.3.jar,spring.jar)
數據庫:
CREATE TABLE `users` (
`username` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL,
`is_admin` int(11) DEFAULT NULL,
`id` int(11) DEFAULT NULL
)
insert into `users`(`username`,`password`,`is_admin`,`id`) values ('zjx','202cb962ac59075b964b07152d234b70',1,123);
登錄的服務器下面很多配置文件,通過配置可以做一些擴展。
修改點1:驗證方式使用我們自己的用戶表驗證
cas和當前已有的系統做集成的入口
1.修改deployerConfigContext.xml文件
添加數據源配置
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://localhost/ires?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>i709394</value>
</property>
</bean>
定義MD5的加密方式
XML/HTML代碼
<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" >
<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 password from users where username = ?" />
<property name="passwordEncoder" ref="passwordEncoder"/>
</bean>
修改點2:獲取用戶信息保存,方便各個客戶端可以統一得到用戶信息
1.定義attributeRepository,通過jdbc查詢用戶的詳細信息,可以把用戶表或用戶的所屬組織機構或角色等查詢出來。
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>
</list>
</constructor-arg>
<constructor-arg index="2">
<value>
select id,username,is_admin from users where username = ?
</value>
</constructor-arg>
<property name="columnsToAttributes">
<map>
<entry key="id" value="id" />
<entry key="username" value="username" />
<entry key="is_admin" value="is_admin" />
</map>
</property>
</bean>
2.配置authenticationManager中credentialsToPrincipalResolvers屬性
XML/HTML代碼
<bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver">
<property name="attributeRepository" ref="attributeRepository" />
</bean>
注意:默認cas登錄服務器沒有把用戶信息傳到客戶端中,所以要修改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:用數據庫來保存登錄的會話
這樣服務器在重新啓動的時候不會丟失會話。
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"