(Java)CAS单点登录

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案
之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应
用系统。
我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使
用传统方式的 session 是无法解决的,我们需要使用相关的单点登录技术来解决。

CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登
录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:
1.开源的企业级单点登录解决方案。
2.CAS Server 为需要独立部署的 Web 应用。
3.CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括
Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

SSO 单点登录访问流程主要有以下步骤:
1. 访问服务:SSO 客户端发送请求访问应用系统提供的服务资源。
2. 定向认证:SSO 客户端会重定向用户请求到 SSO 服务器。
3. 用户认证:用户身份认证。
4. 发放票据:SSO 服务器会产生一个随机的 Service Ticket。

5. 验证票据:SSO 服务器验证票据 Service Ticket 的合法性,验证通过后,允许客户端访问
服务。

6. 传输用户信息:SSO 服务器验证票据通过后,传输用户认证结果信息给客户端。

 关于cas的配置

1.将cas.war放tomcat的webapps

2.运行tomcat 的startup.bat

3.CAS 服务端配置
   端口修改
如果我们不希望用 8080 端口访问 CAS, 可以修改端口
(1) 修改 TOMCAT 的端口
打开 tomcat 目录 conf\server.xml 找到下面的配置
将端口 8080, 改为 9000 

(2) 修改 CAS 配置文件
修改 cas 的 WEB-INF/cas.properties
server.name=http://localhost:9000 

4.去除https认证

(1)修改 cas 的 WEB-INF/deployerConfigContext.xml 

<bean
class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationH
andler"
p:httpClient-ref="httpClient"/>
这里需要增加参数 p:requireSecure="false", requireSecure 属性意思为是否需要安全验证, 即
HTTPS, false 为不采用

(2)修改 cas 的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
找到下面配置

p:cookieSecure="false"

p:cookieMaxAge="3600"


(3) 修改 cas 的 WEB-INF/spring-configuration/warnCookieGenerator.xml
找到下面配置
<bean id="warnCookieGenerator"
class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />
我们这里将 cookieSecure 改为 false , cookieMaxAge 改为 3600 

 

5.单点退出登录

修改 cas 系统的配置文件 cas-servlet.xml
<bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
p:servicesManager-ref="servicesManager"
p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/> 

改为 true 后, 可以在退出时跳转页面到目标页面, 修改 home.html 的退出链接
<a href="http://localhost:9000/cas/logout?service=http://www.baidu.com">退出登录</a> 

 

6.CAS 服务端数据源设置
 
  配置数据源
(1) 修改 cas 服务端中 web-inf 下 deployerConfigContext.xml , 添加如下配置
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/pinyougoudb?characterEncoding=utf8"
p:user="root"
p:password="123456" />
<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
c:encodingAlgorithm="MD5"
p:characterEncoding="UTF-8" />
<bean id="dbAuthHandler"
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
p:dataSource-ref="dataSource"
p:sql="select password from tb_user where username = ?"
p:passwordEncoder-ref="passwordEncoder"/> 

然后在配置文件开始部分找到如下配置
<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
<constructor-arg>
<map>
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
</map>
</constructor-arg>
<property name="authenticationPolicy">
<bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
</property>
</bean>
其中
<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
一句是使用固定的用户名和密码, 我们在下面可以看到这两个 bean ,如果我们使用数据库认
证用户名和密码, 需要将这句注释掉。
添加下面这一句配置
<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>
(2) 将以下三个 jar 包放入 webapps\cas\WEB-INF\lib 下 

C3p0-0.9.1.2.jar

Cas-server-support-jdbc-4.0.0.jar

Mysql-connector-java-5.1.32.jar

  CAS的登录页面需要更换

(1) 将 项目 的 登 陆 页 login.html 以 及 配 套 的 css 图 片 等 拷 贝 到 cas 系 统 下
WEB-INF\view\jsp\default\ui 目录下
(2) 将原来的 casLoginView.jsp 改名(可以为之后的修改操作做参照),将 login.html 改
名为 casLoginView.jsp

 

  CAS小Demo

  1.maven工程pom依赖

<dependencies>
<!-- cas -->
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.1.12</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 指定端口 -->
<port>9001</port>
<!-- 请求路径 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>

 

  2.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</list
ener-class>
</listener>
<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
<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>
<!-- 该过滤器负责用户的认证工作,必须启用它 -->
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-clas
s>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://localhost:9000/cas/login</param-value>

<!--这里的 server 是服务端的 IP -->
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:9001</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责对 Ticket 的校验工作,必须启用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-c
lass>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://localhost:9000/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:9001</param-value>

</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责实现 HttpServletRequest 请求的包裹, 比如允许开发者通过
HttpServletRequest 的 getRemoteUser()方法获得 SSO 登录用户的登录名,可选配置。 -->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器使得开发者可以通过 org.jasig.cas.client.util.AssertionHolder 来获取用户
的登录名。 比如 AssertionHolder.getAssertion().getPrincipal().getName()。 -->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>

<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

3.测试页面自己随意编写

 

 

 

 

 

转载于:https://www.cnblogs.com/hotazhou/p/7441059.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值