CAS 配置使用方法

1.//服务器用:
//选择删除以前的认证
keytool -delete -alias tomcatsso -keystore cacerts -storepass changeit
//查询是否还有
keytool -list -keystore cacerts -storepass changeit
//生成cacerts认证
keytool -genkey -keyalg RSA -alias tomcatsso -dname "cn=localhost" -keystore cacerts -storepass changeit

说明:在生成key的过程,"cn=www.test.com" 中的www.test.com为Server端的域名(必填)。
将cacerts文件复制到TOMCAT的conf目录下修改server.xml
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" />

<Connector port="8443" minSpareThreads="5" maxSpareThreads="75"  
           enableLookups="true" disableUploadTimeout="true"    
           acceptCount="100"  maxThreads="200"  
           scheme="https" secure="true" SSLEnabled="true"  
           clientAuth="false" sslProtocol="TLS"
           keystoreFile="conf/cacerts" keystorePass="changeit"
           truststoreFile="conf/cacerts"/>


deployerConfigContext.xml配置
a、在%CATALINA_HOME%/webapps/cas/WEB-INF/deployerConfigContext.xml文件中添加

<bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName">
        <value>oracle.jdbc.driver.OracleDriver</value>
    </property>
    <property name="url">
        <value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
    </property>
    <property name="username">
        <value>stock</value>
    </property>
    <property name="password">
        <value>111111</value>
    </property>
</bean>
b、在 cas-server-support-jdbc-3.3.jar 包中,提供了 3 个基于 JDBC 的 AuthenticationHandler,分别为 BindModeSearchDatabaseAuthenticationHandler, QueryDatabaseAuthenticationHandler, SearchModeSearchDatabaseAuthenticationHandler。其中 BindModeSearchDatabaseAuthenticationHandler 是用所给的用户名和密码去建立数据库连接,根据连接建立是否成功来判断验证成功与否;QueryDatabaseAuthenticationHandler 通过配置一个 SQL 语句查出密码,与所给密码匹配;SearchModeSearchDatabaseAuthenticationHandler 通过配置存放用户验证信息的表、用户名字段和密码字段,构造查询语句来验证。使用哪个 AuthenticationHandler,需要在 deployerConfigContext.xml 中设置,默认情况下,CAS 使用一个简单的 username=password 的 AuthenticationHandler,在文件中可以找到如下一行:

<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
我们可以将其注释掉,换成我们希望的一个 AuthenticationHandler,比如,使用QueryDatabaseAuthenticationHandler 或 SearchModeSearchDatabaseAuthenticationHandler 可以分别选取

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
    <property name="dataSource" ref="casDataSource" />
    <property name="sql" value="select password from xt_yhxx where lower(YHMC) = lower(?)" />
    <property name="passwordEncoder"  ref="myPasswordEncoder"/>
</bean>
或者

<bean id="SearchModeSearchDatabaseAuthenticationHandler"  class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler"
      abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default">
  <property  name="tableUsers">
   <value>xt_yhxx</value>
  </property>
  <property name="fieldUser">
   <value>YHMC</value>
  </property>
  <property name="fieldPassword">
   <value>password</value>
  </property>
  <property name="dataSource" ref=" casDataSource " />
</bean>
c、由于存放在数据库中的密码通常是加密过的,所以 AuthenticationHandler 在匹配时需要知道使用的加密方法,在 deployerConfigContext.xml 文件中我们可以为具体的 AuthenticationHandler 类配置一个 property,指定加密器类

<bean id="myPasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
    <constructor-arg value="MD5"/>
</bean>
CAS自带的DefaultPasswordEncoder默认有MD5和SHA1两种加密方式,我们这里指定加密方式为MD5。另外,这里 myPasswordEncoder 是根据实际情况自己定义的加密器,实现 PasswordEncoder 接口及其 encode() 方法。

d、将commons-pool-1.4.jar、commons-dbcp-1.2.2.jar、spring-jdbc-2.5.5.jar、commons-collections-3.2.jar、cas-server-support-jdbc-3.3.jar拷贝到%CATALINA_HOME%/webapps/cas/WEB-INF/lib中。

 


2.//客户端用:
//生成tomcatsso.crt
keytool -export -alias tomcatsso -file tomcatsso.crt -keystore cacerts -storepass changeit
//客户端证书导入tomcatsso.crt
注意先进入%JAVA_HOME%/jre/lib/security目录,并将tomcatsso.crt copy到其下.执行下面命令.
%JAVA_HOME%/jre/lib/security>:keytool -import -alias tomcatsso -file tomcatsso.crt -keystore cacerts -storepass changeit
//查询
keytool -list -keystore cacerts -storepass changeit


将casclient.jar拷贝到WEB-INF/lib下。
在web.xml中添加过滤器:
<filter> 
 <filter-name>CAS Filter</filter-name> 
 <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class> 
 <init-param> 
  <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name> 
  <param-value>https://localhost:8443/cas/login</param-value> 
 </init-param> 
 <init-param> 
  <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name> 
  <param-value>https://localhost:8443/cas/serviceValidate</param-value> 
 </init-param> 
 <init-param> 
  <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name> 
  <param-value>localhost:8080</param-value> 
 </init-param> 
</filter> 
<filter-mapping> 
 <filter-name>CAS Filter</filter-name> 
 <url-pattern>/*</url-pattern> 
</filter-mapping


3.其它
CASFilter 必需的参数
 edu.yale.its.tp.cas.client.filter.loginUrl  指定 CAS 提供登录页面的 URL 
edu.yale.its.tp.cas.client.filter.validateUrl  指定 CAS 提供 service ticket 或 proxy ticket 验证服务的 URL 
edu.yale.its.tp.cas.client.filter.serverName  指定客户端的域名和端口,是指客户端应用所在机器而不是 CAS Server 所在机器,该参数或 serviceUrl 至少有一个必须指定 
edu.yale.its.tp.cas.client.filter.serviceUrl  该参数指定过后将覆盖 serverName 参数,成为登录成功过后重定向的目的地址 


CASFilter 可选参数:

edu.yale.its.tp.cas.client.filter.proxyCallbackUrl  用于当前应用需要作为其他服务的代理(proxy)时获取 Proxy Granting Ticket 的地址 
edu.yale.its.tp.cas.client.filter.authorizedProxy  用于允许当前应用从代理处获取 proxy tickets,该参数接受以空格分隔开的多个 proxy URLs,但实际使用只需要一个成功即可。当指定该参数过后,需要修改 validateUrl 到 proxyValidate,而不再是 serviceValidate 
edu.yale.its.tp.cas.client.filter.renew  如果指定为 true,那么受保护的资源每次被访问时均要求用户重新进行验证,而不管之前是否已经通过 
edu.yale.its.tp.cas.client.filter.wrapRequest  如果指定为 true,那么 CASFilter 将重新包装 HttpRequest,并且使 getRemoteUser() 方法返回当前登录用户的用户名 
edu.yale.its.tp.cas.client.filter.gateway  指定 gateway 属性 

传递登录用户名

CAS 在登录成功过后,会给浏览器回传 Cookie,设置新的到的 Service Ticket。但客户端应用拥有各自的 Session,我们要怎么在各个应用中获取当前登录用户的用户名呢?CAS Client 的 Filter 已经做好了处理,在登录成功后,就可以直接从 Session 的属性中获取
// 以下两者都可以

session.getAttribute(CASFilter.CAS_FILTER_USER);
session.getAttribute("edu.yale.its.tp.cas.client.filter.user");
通过 JSTL 获取登录用户名

<c:out value="${sessionScope[CAS:'edu.yale.its.tp.cas.client.filter.user']}"/>
另外,CAS 提供了一个 CASFilterRequestWrapper 类,该类继承自HttpServletRequestWrapper,主要是重写了 getRemoteUser() 方法,只要在前面配置 CASFilter 的时候为其设置“ edu.yale.its.tp.cas.client.filter.wrapRequest ”参数为 true,就可以通过 getRemoteUser() 方法来获取登录用户名:

通过 CASFilterRequestWrapper 获取登录用户名

CASFilterRequestWrapper  reqWrapper=new CASFilterRequestWrapper(request);
out.println("The logon user:" + reqWrapper.getRemoteUser());

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值