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
注释掉默认验证机制:

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

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

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

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" />

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">    
        <property name="locations">
          <list>
            <value>/WEB-INF/cas.propertiesvalue>
            <value>/WEB-INF/jdbc.propertiesvalue>
          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文件:

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文件中的:

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.clientgroupId>
            <artifactId>cas-client-coreartifactId>
            <version>3.2.1version>
        dependency>
        <dependency>
            <groupId>commons-logginggroupId>
            <artifactId>commons-loggingartifactId>
            <version>1.1.1version>
        dependency>
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>javax.servlet-apiartifactId>
<scope>runtimescope>
            <version>3.0.1version>
        dependency>

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

<filter>
     <filter-name>CASFilterfilter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter
filter-class>
     <init-param>
       <param-name>casServerLoginUrlparam-name>
        
<param-value>http://10.172.110.226:28080/cas/loginparam-value>
     init-param>
     <init-param>          
       <param-name>serverNameparam-name>
        
       <param-value>http://10.172.110.225:8080/param-value>
     init-param>
   filter>                  
   <filter-mapping>
     <filter-name>CASFilterfilter-name>
     <url-pattern>/*url-pattern>
  filter-mapping>

  <filter>
    <filter-name>CASValidationFilterfilter-name>   <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilterfilter-class>
<init-param>
  
      <param-name>casServerUrlPrefixparam-name>
      <param-value> http://10.172.110.226:28080/cas/param-value>
    init-param>                        
<init-param>            
  <!—应用程序访问IP-->
      <param-name>serverNameparam-name>
      <param-value>http://10.172.110.225:8080/ param-value>
    init-param>                  
  filter>                  
  <filter-mapping>
    <filter-name>CASValidationFilterfilter-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>AuthenticationFilterfilter-name> <filter-class>com.xhh.cas.filter.AuthenticationFilter
filter-class>  
    filter>  
    <filter-mapping>  
        <filter-name>AuthenticationFilterfilter-name>  
        /*  
filter-mapping>

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


<listener>
     <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListenerlistener-class>
listener>

<filter>
     <filter-name>CAS Single Sign Out Filterfilter-name>
     <filter-class>org.jasig.cas.client.session.SingleSignOutFilterfilter-class>
filter>
<filter-mapping>
    <filter-name>CAS Single Sign Out Filterfilter-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="注销后跳转的地址"

你可能感兴趣的:(Cas实现单点登录)