单点登录系统CAS


目录

单点登录系统CAS

什么是单点登录?

CAS 介绍

CAS 服务端部署

(1)复制war包到tomcat

(2)运行tomcat

(3)访问CAS登录页面

CAS服务端配置

(1)修改tomcat端口号为9100

(2)修改CAS配置文件(WEB-INF/cas.properties)

(3)去除https认证

CAS客户端Demo

(1)创建web工程,引入依赖

(2)web.xml配置

(3)编写index.jsp

(4)启动服务端和客户端,访问客户端

(5)单点退出

数据源设置

登录页面改造

(1)替换页面

(2)登录请求提交相关修改

(3)错误提示

CAS客户端与Spring Security集成

(1)新建casclientdemo3工程

(2)集成


什么是单点登录?

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。

CAS 介绍

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 等。

从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议过程:

SSO单点登录访问流程主要有以下步骤:

1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。

2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。

3. 用户认证:用户身份认证。

4. 发放票据:SSO服务器会产生一个随机的Service Ticket。

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

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

CAS 服务端部署

Cas服务端其实就是一个war包。

(1)复制war包到tomcat

(2)运行tomcat

(3)访问CAS登录页面

注意:CAS有默认的一个账号(casuser/Mellon),进行登录,跳转到登录成功页面

CAS服务端配置

(1)修改tomcat端口号为9100

(2)修改CAS配置文件(WEB-INF/cas.properties)

(3)去除https认证

修改cas的WEB-INF/deployerConfigContext.xml

修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml

其中cookieMaxAge为cookie存活时间,单位:秒

修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml

CAS客户端Demo

(1)创建web工程,引入依赖

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>demo</groupId><artifactId>casclientdemo1</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>casclientdemo1 Maven Webapp</name><dependencies><!-- cas --><dependency><groupId>org.jasig.cas.client</groupId><artifactId>cas-client-core</artifactId><version>3.3.3</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></project>

(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</listener-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-class>  <init-param>  <param-name>casServerLoginUrl</param-name>  <param-value>http://localhost:9100/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-class>  <init-param>  <param-name>casServerUrlPrefix</param-name>  <param-value>http://localhost:9100/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)编写index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>一品优购</title>
</head>
<body>
欢迎来到一品优购
<%=request.getRemoteUser()%>
</body>
</html>

重复以上步骤,创建clientdemo2,注意修改端口号

(4)启动服务端和客户端,访问客户端

认证不通过 跳转到登录界面,我们进行登录

跳转到了刚才访问的页面,我们接着访问demo2,无需登录,直接进入了index页面。

(5)单点退出

访问路径 :logout

修改配置,退出成功时,跳转到指定页面

修改配置文件:cas-servlet.xml

在logout后面加入service参数即可,在完成退出后,会重定向到service参数地址

数据源设置

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

应用配置好的数据源 替换掉原来的数据源

注意:配置数据源时,将使用到的jar包,放入项目中(三个jar:c3p0、mysql驱动和cas-server-support-jdbc)

使用数据库账号密码,进行登录,登录成功

登录页面改造

(1)替换页面

拷贝页面到指定目录

修改文件名为:casLoginView.jsp

然后,插入JSP指令,重启进行测试

注意:需要将静态资源拷贝到cas目录下(css、js等)

(2)登录请求提交相关修改

(3)错误提示

修改messages_CN.properties配置文件,加入配置(实际需要将中文转换成unicode编码)

authenticationFailure.AccountNotFoundException=账号或密码错误!
authenticationFailure.FailedLoginException=账号或密码错误!

修改cas-servlet.xml中的默认国际化配置,设置为zh_CN

在页面添加错误提示

CAS客户端与Spring Security集成

(1)新建casclientdemo3工程

参考Spring Security Demo 创建

(2)集成【1】

引入新的依赖

<dependency>  <groupId>org.springframework.security</groupId>  <artifactId>spring-security-cas</artifactId>  <version>4.1.0.RELEASE</version>
</dependency>
<dependency>  <groupId>org.jasig.cas.client</groupId>  <artifactId>cas-client-core</artifactId>  <version>3.3.3</version>  <exclusions>  <exclusion>  <groupId>org.slf4j</groupId>  <artifactId>log4j-over-slf4j</artifactId>  </exclusion>  </exclusions>
</dependency>

编写spring-security.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"><!--   entry-point-ref  入口点引用 --><http use-expressions="false" entry-point-ref="casProcessingFilterEntryPoint">  <intercept-url pattern="/**" access="ROLE_USER"/>   <csrf disabled="true"/>  <!-- custom-filter为过滤器, position 表示将过滤器放在指定的位置上,before表示放在指定位置之前  ,after表示放在指定的位置之后  -->           <custom-filter ref="casAuthenticationFilter"  position="CAS_FILTER" />      <custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER"/>  <custom-filter ref="singleLogoutFilter" before="CAS_FILTER"/>  </http><!-- CAS入口点 开始 --><beans:bean id="casProcessingFilterEntryPoint" class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">  <!-- 单点登录服务器登录URL -->  <beans:property name="loginUrl" value="http://localhost:9100/cas/login"/>  <beans:property name="serviceProperties" ref="serviceProperties"/>  </beans:bean>      <beans:bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">  <!--service 配置自身工程的根地址+/login/cas   -->  <beans:property name="service" value="http://localhost:9003/login/cas"/></beans:bean>  <!-- CAS入口点 结束 --><!-- 认证过滤器 开始 --><beans:bean id="casAuthenticationFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter">  <beans:property name="authenticationManager" ref="authenticationManager"/>  </beans:bean>  <!-- 认证管理器 --><authentication-manager alias="authenticationManager"><authentication-provider  ref="casAuthenticationProvider"></authentication-provider></authentication-manager><!-- 认证提供者 --><beans:bean id="casAuthenticationProvider"     class="org.springframework.security.cas.authentication.CasAuthenticationProvider">  <beans:property name="authenticationUserDetailsService">  <beans:bean class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">  <beans:constructor-arg ref="userDetailsService" />  </beans:bean>  </beans:property>  <beans:property name="serviceProperties" ref="serviceProperties"/>  <!-- ticketValidator 为票据验证器 --><beans:property name="ticketValidator">  <beans:bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">  <beans:constructor-arg index="0" value="http://localhost:9100/cas"/>  </beans:bean>  </beans:property>  <beans:property name="key" value="an_id_for_this_auth_provider_only"/> </beans:bean>        <!-- 认证类 --><beans:bean id="userDetailsService" class="com.casdemo.UserDetailServiceImpl"/>  <!-- 认证过滤器 结束 --><!-- 单点登出  开始  -->     <beans:bean id="singleLogoutFilter" class="org.jasig.cas.client.session.SingleSignOutFilter"/>          <beans:bean id="requestSingleLogoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">  <beans:constructor-arg value="http://localhost:9100/cas/logout?service=http://www.baidu.com"/>  <beans:constructor-arg>  <beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>  </beans:constructor-arg>  <beans:property name="filterProcessesUrl" value="/logout/cas"/>  </beans:bean>  <!-- 单点登出  结束 -->  </beans:beans>

编写认证类

package com.casdemo;import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;import java.util.ArrayList;
import java.util.List;/*** 认证类* 注意:因为和CAS集成,所以这个类不会有认证账号密码的逻辑。* Author xushuai* Description*/
public class UserDetailServiceImpl implements UserDetailsService {@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {// 设置角色名列表List<GrantedAuthority> authorities = new ArrayList<>();authorities.add(new SimpleGrantedAuthority("ROLE_USER"));return new User(username, "", authorities);}
}

测试

访问demo3,自动跳转到了CAS登录中心

使用账号密码登录,自动返回到demo3的首页

获取当前登录名的方式和Spring Security获取登录名方式一致(使用SecurityContextHolder)

单点退出(直接使用超链接:<a href="/logout/cas"> 就可以直接退出了,也可以写全地址:http://localhost:9100/cas/logout)

开源单点登录系统CAS入门相关推荐

  1. 1.开源单点登录系统CAS 入门

    什么是单点登录 单点登录(Single Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案 之一.SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应 用 ...

  2. 开源的单点登录系统CAS入门

    单点登录 单点登录(Single Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 当一 ...

  3. 开源单点登录系统CAS(二)

    5.CAS客户端入门 5.1客户端工程1搭建 (1)搭建工程引入依赖 创建Maven工程 (war)casclient_demo1 引入cas客户端依赖并制定tomcat运行端口为9001 <p ...

  4. cas java单点登录_java单点登录系统CAS的简单使用

    http://blog.csdn.net/yunye114105/article/details/7997041 参考: http://blog.csdn.net/diyagea/article/de ...

  5. 单点登录系统cas资料汇总

    http://jasig.github.io/cas/4.0.x/index.html           主页 https://jasigcas.herokuapp.com              ...

  6. 单点登录之CAS原理和实现

    1.开源单点登录系统CAS入门 1.1 什么是单点登录 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要 ...

  7. CAS单点登录系统的实现

    CAS单点登录系统的实现 前言 一.CAS思路 二.代码实现 环境准备 代码实现 2.1 MTV系统前端判断是否登录,依据前端cookie是否存在用户信息 2.2 MTV系统前端判断链接是否携带临时票 ...

  8. SpringBoot 简单实现仿CAS单点登录系统

    SpringBoot 简单实现仿CAS单点登录系统 新境界开源开源SSO项目介绍 新境界开源SSO项目实现原理大致如下: 新境界开源SSO项目登录流程介绍 新境界开源SSO项目授权登录流程介绍 新境界 ...

  9. cas登录成功什么意思_你知道CAS单点登录系统吗

    单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.我们目前的系统 ...

最新文章

  1. AngularJS 杂项知识点
  2. APP启动原理,APPdelegate程序状态解析
  3. mysql8.0默认引擎是什么_MySQL8.0新特性【转】
  4. 将openstack的Token认证信息存储在memcache中
  5. 计算机网络(一)-概述
  6. bytearrayinputstream java_java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)...
  7. java github关联登录_没错,用三方Github做授权登录就是这么简单!(OAuth2.0实战)...
  8. 字节跳动李本超:一年成为 Committer,我与 Flink 社区的故事
  9. matlab遗传算法 系统辨识,基于遗传算法的控制系统的系统辨识
  10. VoLTE业务端到端流程:EPC侧信令流程
  11. 实验室信息管理系统LIMS的25个典型模块
  12. 考研和计算机三级,考研考计算机与考软件有什么区别吗
  13. Python学习两个月心得
  14. 入门推荐系统,这25篇综述文章足够了
  15. java中12 5.0f等于多少_F_____
  16. [git]上传代码到github
  17. python读写tif文件
  18. Mendix学习(2021年7月28日)
  19. 微软与网景关于浏览器的恩怨情仇
  20. 案例 :深度学习 V.S. 谜题游戏

热门文章

  1. [DCDC](DC-DC 电感)纹波率r是难题?来我这里来学习
  2. 第二十四篇 -- 学习第二十九天打卡20190720
  3. ca 自建 颁发证书_自建ca证书
  4. 用VBA向列表框(ComboBox或ListBox)中填加数据
  5. python调用Agora_Recording_SDK_for_Linux_FULL
  6. 股票高频数据(分钟数据)的入门分析方法——已实现波动率的计算(含完整代码)
  7. 一维黎曼激波管精确解python
  8. 一维黎曼c语言,一维黎曼问题数值解及计算程序.docx
  9. 生鲜收银系统有什么好方案
  10. 英语语法总结--动名词