CAS单点登录服务端与客户端配置

(一) CAS单点登录 : 服务端搭建

1.下载

先在网上下载cas-server-3.5.2,将里面的cas-server-webapp-3.5.2.war放到tomcat的webapps目录下。

(现在源码被放到github,很难下载)

2.https设置

cas单点登默认使用的是https,所以需要证书,由于是个人测试和学习用的,可以用JDK自带的keytool工具生成证书。


2.1 用JDK生成证书:

命令:keytool -genkey -alias wsria -keyalg RSA -keystore d:/keys/wsriakey

其中-keystore 的参数是存放生成证书的路径,需要提前创建好keys文件夹,

您的名字与姓氏那一栏输入的是域名,而不能是ip。

这里可以修改hosts文件:C:\Windows\System32\drivers\etc\hosts

添加内容如下:

127.0.0.1 sso.wsria.com

这样在访问sso.wsria.com的时候其实是访问的127.0.0.1也就是本机

严重提醒:提示输入域名的时候不能输入IP地址

2.2 导出证书:

D:\keys>keytool -export -file d:/keys/wsria.crt -alias wsria -keystore d:/keys/wsriakey

特别提示:如果提示:

keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect

那么请输入密码:changeit

  

至此导出证书完成,可以分发给应用的JDK使用了,接下来讲解客户端的JVM怎么导入证书。

2.3  为客户端的JVM导入证书
keytool -import -keystore D:\tools\jdk\1.6\jdk1.6.0_20\jre\lib\security\cacerts -file D:/keys/wsria.crt -alias wsria

D:\tools\jdk\1.6\jdk1.6.0_20\jre\lib\security -- 是jre的目录;密码还是刚刚输入的密码。至此证书的创建、导出、导入到客户端JVM都已完成,

下面开始使用证书到Web服务器中,本教程使用tomcat。

2.4 修改tomcat配置

打开tomcat的conf目录下server.xml,找到

 <!--
 <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
            maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
            clientAuth="false" sslProtocol="TLS" />
 -->

将注释打开,并改为

<connector port="8443" protocol="HTTP/1.1" sslenabled="true" maxthreads="150" scheme="https" secure="true" 
clientauth="false" sslprotocol="TLS" keystorefile="D:/keys/wsriakey" keystorepass="wsria.com">
</connector>

参数说明:

  keystoreFile:在第一步创建的key存放位置

  keystorePass:创建证书时的密码

启动tomcat进行测试



只要用户名密码一致就能登录。

4.取消https
如果不想用https的方式,需要修改一些配置。
4.1 找到WEB-INFO/deployerConfigContext.xml下

1 <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
2     p:httpClient-ref="httpClient" />

添加参数requireSecure为false,如下:

1 <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
2     p:httpClient-ref="httpClient" 
3     p:requireSecure="false" />

4.2 找到WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml下

1 <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
2     p:cookieSecure="true"
3     p:cookieMaxAge="-1"
4     p:cookieName="CASTGC"
5     p:cookiePath="/cas" />

将cookieSecure改为false,如下:

1 <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
2     p:cookieSecure="false"
3     p:cookieMaxAge="-1"
4     p:cookieName="CASTGC"
5     p:cookiePath="/cas" />

4.3 找到WEB-INF\spring-configuration\warnCookieGenerator.xml下

1 <bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
2     p:cookieSecure="true"
3     p:cookieMaxAge="-1"
4     p:cookieName="CASPRIVACY"
5     p:cookiePath="/cas" />

将cookieSecure改为false,如下

1 <bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
2     p:cookieSecure="false"
3     p:cookieMaxAge="-1"
4     p:cookieName="CASPRIVACY"
5     p:cookiePath="/cas" />

4.4 找到tomcat的conf目录下server.xml
把之前打开的注释关闭。测试如下:


5.结尾

至此,一个简单的cas单点登录服务端就算搭建完成了


(二) CAS单点登录: 客户端配置

  1. 下载jar包
    因为cas的源码修改变动很大,所以客户端引入的jar包根据服务端的war包而定。之前搭建的cas服务端用的版本是3.5.2,经过测试,可以使用cas-client-core的3.2.1版本。使用maven添加依赖
    1 <!-- https://mvnrepository.com/artifact/org.jasig.cas.client/cas-client-core -->
    2 <dependency>
    3     <groupId>org.jasig.cas.client</groupId>
    4     <artifactId>cas-client-core</artifactId>
    5     <version>3.2.1</version>
    6 </dependency>

    不用maven的话可以用上面的地址去手动下载jar包。

  2. web.xml配置
    引入jar包后,只要在客户端的web.xml里配置相应的过滤器即可。根据添加的过滤器的位置顺序一一介绍:

    2.1 Cas20ProxyReceivingTicketValidationFilter(必需)
      该过滤器负责对ticket的校验工作,这个过滤器要放在第一个位置。casServerUrlPrefix:cas服务器访问地址,serverName:客户端域名和端口。这里也可以配置成ip,但是最好还是配置成域名。
      还有就是cas服务端我取消了https,这里路径注意一下。
    复制代码
     1   <!-- 该过滤器配置负责对Ticket的校验工作-->
     2   <filter>
     3     <filter-name>CAS Validation Filter</filter-name>
     4     <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
     5     <init-param>
     6       <param-name>casServerUrlPrefix</param-name>
     7       <param-value>http://www.mycas.com:8088/cas-server-webapp-3.5.2</param-value>
     8     </init-param>
     9     <init-param>
    10       <param-name>serverName</param-name>
    11       <param-value>http://127.0.0.1:80/</param-value>
    12     </init-param>
    13     <init-param>
    14       <param-name>renew</param-name>
    15       <param-value>false</param-value>
    16     </init-param>
    17     <init-param>
    18       <param-name>gateway</param-name>
    19       <param-value>false</param-value>
    20     </init-param>
    21     <init-param>
    22       <param-name>encoding</param-name>
    23       <param-value>UTF-8</param-value>
    24     </init-param>
    25   </filter>
    26   <filter-mapping>
    27     <filter-name>CAS Validation Filter</filter-name>
    28     <url-pattern>/*</url-pattern>
    29   </filter-mapping>
    复制代码

    2.2 AuthenticationFilter(必需)
      该过滤器负责用户的认证工作,casServerLoginUrl:cas服务端登录地址(注意这里比上面的多了'/login'),serverName:同上

    复制代码
     1   <!--该过滤器负责用户的认证工作-->
     2   <filter>
     3     <filter-name>CASFilter</filter-name>
     4     <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
     5     <init-param>
     6       <param-name>casServerLoginUrl</param-name>
     7       <param-value>http://www.mycas.com:8088/cas-server-webapp-3.5.2/login</param-value>
     8     </init-param>
     9     <init-param>
    10       <param-name>serverName</param-name>
    11       <param-value>http://127.0.0.1:80/</param-value>
    12     </init-param>
    13   </filter>
    14   <filter-mapping>
    15     <filter-name>CASFilter</filter-name>
    16     <url-pattern>/*</url-pattern>
    17   </filter-mapping>
    复制代码

    2.3 HttpServletRequestWrapperFilter (可选)与 AssertionThreadLocalFilter(可选)

    复制代码
     1 <!--HttpServletRequestWrapperFilter-->
     2 <filter>  
     3     <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
     4     <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>  
     5   </filter>  
     6   <filter-mapping>  
     7     <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
     8     <url-pattern>/*</url-pattern>  
     9   </filter-mapping>  
    10 
    11   <!--AssertionThreadLocalFilter-->
    12   <filter>
    13     <filter-name>CAS Assertion Thread Local Filter</filter-name>
    14     <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    15   </filter>
    16   <filter-mapping>
    17     <filter-name>CAS Assertion Thread Local Filter</filter-name>
    18     <url-pattern>/*</url-pattern>
    19   </filter-mapping>
    复制代码

      这2个过滤器的功能是一样的,所以放到一起来讲,当我们登录成功后,需要获取登录的用户信息(只能获取到用户名),就需要配置上面2个过滤器的其中一个。获取方式如下:
    客户端获取单点登录用户名:

    String ssoLoginName = getCasLoginName ();
    
     private String getCasLoginName ()
        {
        	//Map<String, Object> result = new HashMap<String, Object>();
        	AttributePrincipal principal = (AttributePrincipal) this.getRequest ().getUserPrincipal ();
        	if (principal == null)
        	{
        		return null;
        	}
        	String userName = principal.getName();
    		try {
    			//result = principal.getAttributes ();
    			if (userName == null || userName == "")
    			{
    				return null;
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return userName;
    
        }

  3. 到这里客户端的配置就完成了~~

(三) CAS服务端配置读取数据库验证身份

1.tomcat/webapps/cas/WEB-INF/lib,添加jar包


2.找到tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml,在此文件中找到

<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

3.注释掉上面那句(这个Handler只是判断用户名和密码相同即可通过)

4.在后面加上:

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
      <property name="dataSource" ref="dataSource"></property>
      <property name="sql" value="select password from u_user where useraccount=?"></property>
      <property name="passwordEncoder" ref="MD5PasswordEncoder"></property>
</bean>

5.上面配置的说明:

   QueryDatabaseAuthenticationHandler是cas-server-support-jdbc提供的查询接口其中一个是通过配置一个 SQL 语句查出密码,与所给密码匹配;

   dataSource是使用JDBC查询时的数据源;

   sql语句就是查询哪一张表,本例根据u_user表的useraccount字段查询密码,CAS会匹配用户输入的密码,如果匹配则通过;

   passwordEncoder这个就算是自己加的盐巴了,意思很明显就是处理密码的加密,看你的应用中数据库保存的是明码还是加密过的,比如本例是使用MD5加密的,所以配置了MD5PasswordEncoder这个Handler,cas内置了MD5的功能所以只需要配置一下就可以了;如果在实际应用中使用的是公司自己的加密算法那么就需要自己写一个Handler来处理密码,实现方式也比较简单,创建一个类继承org.jasig.cas.authentication.handler.PasswordEncoder然后在encode方法中加密用户输入的密码然后返回即可。

6.在deployerConfigContext.xml文件末尾加入:

复制代码
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
   <property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
   <property name="url"><value>jdbc:oracle:thin:@192.168.12.114:1521:ora11g</value></property>
   <property name="username"><value>uacs</value></property>
   <property name="password"><value>uacs</value></property>
</bean>
 
<bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
    <constructor-arg index="0">
        <value>MD5</value>
    </constructor-arg>
</bean>
复制代码

7.修改上面的数据源即可配置完成


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值