开源单点登录系统CAS入门
单点登录系统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.开源单点登录系统CAS 入门
什么是单点登录 单点登录(Single Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案 之一.SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应 用 ...
- 开源的单点登录系统CAS入门
单点登录 单点登录(Single Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 当一 ...
- 开源单点登录系统CAS(二)
5.CAS客户端入门 5.1客户端工程1搭建 (1)搭建工程引入依赖 创建Maven工程 (war)casclient_demo1 引入cas客户端依赖并制定tomcat运行端口为9001 <p ...
- cas java单点登录_java单点登录系统CAS的简单使用
http://blog.csdn.net/yunye114105/article/details/7997041 参考: http://blog.csdn.net/diyagea/article/de ...
- 单点登录系统cas资料汇总
http://jasig.github.io/cas/4.0.x/index.html 主页 https://jasigcas.herokuapp.com ...
- 单点登录之CAS原理和实现
1.开源单点登录系统CAS入门 1.1 什么是单点登录 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要 ...
- CAS单点登录系统的实现
CAS单点登录系统的实现 前言 一.CAS思路 二.代码实现 环境准备 代码实现 2.1 MTV系统前端判断是否登录,依据前端cookie是否存在用户信息 2.2 MTV系统前端判断链接是否携带临时票 ...
- SpringBoot 简单实现仿CAS单点登录系统
SpringBoot 简单实现仿CAS单点登录系统 新境界开源开源SSO项目介绍 新境界开源SSO项目实现原理大致如下: 新境界开源SSO项目登录流程介绍 新境界开源SSO项目授权登录流程介绍 新境界 ...
- cas登录成功什么意思_你知道CAS单点登录系统吗
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.我们目前的系统 ...
最新文章
- AngularJS 杂项知识点
- APP启动原理,APPdelegate程序状态解析
- mysql8.0默认引擎是什么_MySQL8.0新特性【转】
- 将openstack的Token认证信息存储在memcache中
- 计算机网络(一)-概述
- bytearrayinputstream java_java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)...
- java github关联登录_没错,用三方Github做授权登录就是这么简单!(OAuth2.0实战)...
- 字节跳动李本超:一年成为 Committer,我与 Flink 社区的故事
- matlab遗传算法 系统辨识,基于遗传算法的控制系统的系统辨识
- VoLTE业务端到端流程:EPC侧信令流程
- 实验室信息管理系统LIMS的25个典型模块
- 考研和计算机三级,考研考计算机与考软件有什么区别吗
- Python学习两个月心得
- 入门推荐系统,这25篇综述文章足够了
- java中12 5.0f等于多少_F_____
- [git]上传代码到github
- python读写tif文件
- Mendix学习(2021年7月28日)
- 微软与网景关于浏览器的恩怨情仇
- 案例 :深度学习 V.S. 谜题游戏
热门文章
- [DCDC](DC-DC 电感)纹波率r是难题?来我这里来学习
- 第二十四篇 -- 学习第二十九天打卡20190720
- ca 自建 颁发证书_自建ca证书
- 用VBA向列表框(ComboBox或ListBox)中填加数据
- python调用Agora_Recording_SDK_for_Linux_FULL
- 股票高频数据(分钟数据)的入门分析方法——已实现波动率的计算(含完整代码)
- 一维黎曼激波管精确解python
- 一维黎曼c语言,一维黎曼问题数值解及计算程序.docx
- 生鲜收银系统有什么好方案
- 英语语法总结--动名词