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,登录时用的是同一套数据库,三个系统间可以互相跳转。目标是:三个系统中其中一个登录了,其他两个就无需登录验证。
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="注销后跳转的地址"