cas实现单点登录-应用场景和完整配置

Cas 简介

1、什么是CAS
CAS是一个单点登录(SSO)的框架。单点登录是目前比较流行的服务于企业业务整合的解决方案之一,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
2、CAS的主要结构
CAS包括两部分:CAS Server和CAS Client。
CAS Server负责完成对用户的认证工作,需要独立部署,CAS Server会处理用户名/密码等凭证(Credentials)。
CAS Client负责处理对客户端受保护资源的访问请求,需要对请求方进行身份认证时,重定向到CAS Server进行认证。CAS Client与受保护的客户端应用部署在一起,以Filter方式保护受保护的资源。

应用场景说明

最近在开发过程中,多个系统共用一个认证数据库,这就涉及到单点登录的问题。有三个系统A,B,C,登录时用的是同一套数据库,三个系统间可以互相跳转。目标是:三个系统中其中一个登录了,其他两个就无需登录验证。

cas实现单点登录完整配置

1、首先介绍下cas源代码或官网地址:
cas server: https://github.com/Jasig/cas/releases
cas client: http://developer.jasig.org/cas-clients/
CAS官网地址:http://www.jasig.org/cas

2、cas 服务端配置
cas服务端主要在实际应用中的配置有两个:一是配置验证数据库,二是根据需要修改cas server登录默认页面。

具体步骤如下:
1)、将Server端的war包放入Tomcat的webapps下,取名cas.war
2)、cas默认的验证是用户名和密码相同即可,配置验证的数据库连接
A、打开cas/WEB-INF/deployerConfigContext.xml
注释掉默认验证机制:

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

在下面添加新的验证机制:

<bean id="dbAuthHandler" class = "org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
    <property name = "dataSource" ref="casDataSource"/>
    <property name = "sql" value="select password from user where name = ?"/>
</bean>

B、在beans下添加新的数据源casDataSource:

<bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbcDriverClassName}" />
        <property name="url" value="${jdbcUrl}" />
        <property name="username" value="${jdbcUsername}" />
        <property name="password" value="${jdbcPassword}" />
        <property name="maxActive" value="${jdbcMaxActive}" />
        <property name="maxIdle" value="${jdbcMaxIdle}" />
        <property name="maxWait" value="${jdbcMaxWait}" />
        <property name="validationQuery" value="${jdbcValidationQuery}" />
    <property name="validationQueryTimeout" value="${jdbcValidationTimeOut}" /> 
        <property name="defaultAutoCommit" value="true" />
        <property name="testOnBorrow" value="true" />
</bean>

3)、在cas/WEB-INF/下新建jdbc.properties文件,内容如下:

# JDBC Configuration
jdbcDriverClassName=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://10.172.110.226:3306/testdb?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
jdbcUsername=xhhtest
jdbcPassword=123456
# DBCP Pool Settings
jdbcInitialSize=5
jdbcMaxActive=10
jdbcMaxIdle=5
jdbcMaxWait=30000
jdbcValidationQuery=select 1 
jdbcValidationTimeOut=10

4)、修改cas/WEB-INF/spring-configuration/propertyFileConfigure.xml文件

注释:<!--  <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"     p:location="/WEB-INF/cas.properties" />-->
增加:
<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">    
        <property name="locations">
          <list>
            <value>/WEB-INF/cas.properties</value>
            <value>/WEB-INF/jdbc.properties</value>
          </list>
        </property>
</bean> 

5)、修改登录页面
A、将提供的login文件夹复制到cas/下,login.jsp复制到cas/WEB-INF/view/jsp/default/ui
B、修改cas/WEB-INF/classes/default_views.properties

### Login view (/login) casLoginView.url=/WEB-INF/view/jsp/default/ui/casLoginView.jsp 改为:casLoginView.url=/WEB-INF/view/jsp/default/ui/login.jsp

6)、配置CAS服务器保存cookie时间
修改
cas/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml文件:

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
        p:cookieSecure="false"
        p:cookieMaxAge="1800"
        p:cookieName="CASTGC"
        p:cookiePath="/cas" />

7)、注销功能重定向配置
修改cas/WEB-INF/cas-servlet.xml文件中的:

<bean id="logoutController" class="org.jasig.cas.web.LogoutController"
    p:centralAuthenticationService-ref="centralAuthenticationService"
p:logoutView="casLogoutView"
    p:warnCookieGenerator-ref="warnCookieGenerator"
    p:followServiceRedirects="true" (增加此属性)
    p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator"

至此,cas server端配置完成,部署到容器tomcat中,即可访问登录。

3、cas 客户端配置
cas客户段配置即实际应用程序,如系统A的配置。此配置主要涉及到的:jar包,过滤器以及注销功能。

具体步骤如下:
1)、修改pom文件,加入需要的jar包依赖

<dependency>
            <groupId>org.jasig.cas.client</groupId>
            <artifactId>cas-client-core</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
<scope>runtime</scope>
            <version>3.0.1</version>
        </dependency>

2)、修改应用程序的web.xml文件,进行过滤器配置
在应用程序的web.xml文件中加入如下配置:

<filter>
     <filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter
</filter-class>
     <init-param>
       <param-name>casServerLoginUrl</param-name>
        <!-- cas server访问路径-->
<param-value>http://10.172.110.226:28080/cas/login</param-value>
     </init-param>
     <init-param>          
       <param-name>serverName</param-name>
        <!--应用程序访问IP-->
       <param-value>http://10.172.110.225:8080/</param-value>
     </init-param>
   </filter>                  
   <filter-mapping>
     <filter-name>CASFilter</filter-name>
     <url-pattern>/*</url-pattern>
  </filter-mapping>

  <filter>
    <filter-name>CASValidationFilter</filter-name>   <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
  <!--cas server访问地址-->
      <param-name>casServerUrlPrefix</param-name>
      <param-value> http://10.172.110.226:28080/cas/</param-value>
    </init-param>                        
<init-param>            
  <!—应用程序访问IP-->
      <param-name>serverName</param-name>
      <param-value>http://10.172.110.225:8080/ </param-value>
    </init-param>                  
  </filter>                  
  <filter-mapping>
    <filter-name>CASValidationFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

3)编写java类AuthenticationFilter,获取登录用户信息

public class AuthenticationFilter implements Filter {

  public void destroy() {

  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
      throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    Object object = httpRequest.getSession().getAttribute("_const_cas_assertion_");
    if(object != null){
      Assertion assertion = (Assertion) object;
      String loginName = assertion.getPrincipal().getName();
      System.out.println("登录的用户名:"+loginName);
      //可以根据用户名操作相关逻辑,获取User对象等
      //httpRequest.getSession().setAttribute("userName", loginName);
    }
    filterChain.doFilter(request, response);
  }

  public void init(FilterConfig arg0) throws ServletException {

  }
}

在web.xml中加入此过滤器:

   <filter>  
       <filter-name>AuthenticationFilter</filter-name> <filter-class>com.xhh.cas.filter.AuthenticationFilter
</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>AuthenticationFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
</filter-mapping>

4)、配置注销功能
A、在应用程序的web.xml文件中加入如下配置:

<!--注销logout监听器-->
<listener>
     <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!--注销logout 过滤器配置,注意此过滤器放于上述配置的filter之前!!-->
<filter>
     <filter-name>CAS Single Sign Out Filter</filter-name>
     <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CAS Single Sign Out Filter</filter-name>
     <url-pattern>/*</url-pattern>
</filter-mapping>

B、配置注销url, 如下:

<a href= "http://10.133.47.226:28080/bdocsso/logout?service=http://10.133.47.224:28080/bc-bdoc-sso">logout (退出)</a>
说明:http://10.172.110.226:28080/  为服务端地址
     http://10.172.110.225:28080/applicationA  为客户端应   用程序访问地址
     service="注销后跳转的地址"
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值