1.开源单点登录系统CAS
一.什么是单点登录
- 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
- 我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。
- 当我们访问其中一个前台系统需要登录才可以访问的页面时,自动跳转到登录中心进行登录,登录后再次跳转回该前台系统,该前台系统可以获取登录名。
实现单点登录有多种方案:
(1)使用redis实现session共享
(2)使用开源的单点登录系统(推荐)
二.CAS简介
- CAS(Central Authentication Service的缩写,中央认证服务)
cas官网: https://www.apereo.org/projects/cas
源码地址: https://github.com/apereo/cas/tree/5.3.x
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 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CASServer。 - SSO单点登录访问流程主要有以下步骤:
1.访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
2.定向认证:SSO客户端会重定向用户请求到SSO服务器。
3.用户认证:用户身份认证。
4.发放票据:SSO服务器会产生一个随机的ServiceTicket。
5.验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
6.传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。
2. CAS快速入门
一.CAS服务端部署
- 打包
(1)将cas-overlay-template-5.3.zip解压
(2)修改pom.xml,添加配置
(3)进入cas-overlay-template-5.3目录,执行命令
(4)把target下生成的war包重命名为cas.war放到tomcat 启动tomcat后自动解压war包
(5)打开浏览器输入 http://localhost:8080/cas ,系统有内置的用户名和密码分别是casuser 和 Mellon,输入后登录验证成功.
(6)由于使用的静态密码为casuser::Mellon不好记忆, 修改密码--- 到apache-tomcat-8.5.33\webapps\cas\WEB-INF\classes目录的application.properties的最后面修改密码为如下 - 配置兼容http协议
(1)由于CAS默认使用的是基于https协议,需要改为兼容使用http协议 到apachetomcat-8.5.33\webapps\cas\WEB-INF\classes目录的application.properties添加如下的内容
TGC:Ticket Granted Cookie (客户端用户持有,传送到服务器,用于验证)
存放用户身份认证凭证的cookie,在浏览器和CAS Server间通讯时使用,并且只能基于安全通道传输(Https),是CAS Server用来明确用户身份的凭证。
(2)到apache-tomcat-8.5.33\webapps\cas\WEB-INF\classes\services目录下的HTTPSandIMAPS-10000001.json 修改内容如下,即添加http
修改以上配置后,启动cas服务端进行测试。
二.CAS客户端开发
- 原生方式
- 新建demo工程,pom.xml 添加配置
- 新建web.xml
- 新增index.jsp
- 测试: 启动cas服务端和客户端,浏览器输入http://localhost:9001 ,系统自动跳转到服务端的登录页面,输入正确的用户名和密码后,跳转回客户端工程。
- 再创建一个一样的cas客户端程序(青橙秒杀),端口为9002,测试两个系统单点登录的效果。即登录其中一个系统,另外一个系统则不用登录。
- 新建demo工程,pom.xml 添加配置
- 与Spring Security整合
- 创建 demo工程,pom.xml引入依赖(资源中提供)
- 添加web.xml
- 添加spring-security.xml
- 添加UserDetailServiceImpl
- 添加index.jsp
- 创建 demo工程,pom.xml引入依赖(资源中提供)
3. 青橙-认证中心
一.数据源与加密设置
- 数据源设置
我们需要改变服务端的配置,从数据库中获取用户名和密码。设置方法:
修改application.properties ,将 cas.authn.accept.users=.... 加井号注释掉,再加入以下内容: - 加密配置
cas5.X 提供了4种加密配置 :
默认值为 NONE
这四种方式其实脱胎于spring security中的加密方式,spring security提供了
MD5PasswordEncoder、SHAPasswordEncoder、StandardPasswordEncoder和BCryptPasswordEncoder。
NONE:说明对密码不做任何加密,也就是保留明文。
DEFAULT:启用DefaultPasswordEncoder。 MD5PasswordEncoder和SHAPasswordEncoder加密是编码算法加密。现在cas把他们归属于DefaultPasswordEncoder。DefaultPasswordEncoder需要带参数encodingAlgorithm:
STANDARD:启用StandardPasswordEncoder加密方式 。1024次迭代的 SHA‐256 散列哈希加密实现,并使用一个随机8字节的salt。
BCRYPT:启用BCryptPasswordEncoder加密方式。
我们在上实现用户注册功能
修改application.properties 配置文件
二.自定义用户界面
- 需求分析
将CAS的服务端页面更改为以下样式 - 代码实现
参考文档:https://apereo.github.io/cas/5.3.x/installation/ConfigurationProperties.html#themes
规范:
● 静态资源(js,css)存放目录为WEB-INF\classes\static
● html资源(thymeleaf模板)存放目录为WEB-INF\classes\templates
● 主题配置文件存放在WEB-INF\classes,并且命名为[theme_name].properties- 在apache-tomcat-8.5.37\webapps\cas\WEB-INF\classes\static\themes目录下创
建qingcheng文件夹,将静态原型中的img和css文件夹拷入此文件夹 - 在apache-tomcat-8.5.37\webapps\cas\WEB-INF\classes\templates目录下创建
qingcheng文件夹,将静态原型中的login.html拷贝至此文件夹,并改名为
casLoginView.html, 修改casLoginView.html内容
样式部分,改成绝对目录
图片部分,改成绝对目录
表单部分:
th:object,用法:th:object="${brand}",(用来接受后台传过来的对象)
th:field,用法:th:field="*{name}",(用来绑定后台对象和表单数据)
*{} 选择表达式(星号表达式)选择表达式与变量表达式有一个重要的区别:选择表达式计算的是选定的对象,而不是整个环境变量映射。也就是:只要是没有选择的对象,选择表达式与变量表达式的语法是完全一样的。那什么是选择的对象呢?是一个:th:object对象属性绑定的对象 - 在apache-tomcat-8.5.37\webapps\cas\WEB-INF\classes下创建qingcheng.properties
- 修改apache-tomcat-8.5.37\webapps\cas\WEBINF\classes\application.properties
- 在apache-tomcat-8.5.37\webapps\cas\WEB-INF\classes\static\themes目录下创
4. 青橙-单点登录
一.需求分析
- 新建用户中心,与认证中心对接实现单点登录。
将portal工程集成单点登录。
二.CAS公共模块
- 创建qingcheng_common_cas工程( cas公共模块),pom.xml引入依赖
- qingcheng_common_cas工程添加配置文件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:context="http://www.springframework.org/schema/context" 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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring‐context.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring‐security.xsd"> <context:property‐placeholder location="classpath*:*.properties" /> <http pattern="/css/**" security="none"></http> <http pattern="/js/**" security="none"></http> <http pattern="/img/**" security="none"></http> <!‐‐ 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="${cas_url}/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="${service_url}/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="${cas_url}"/> </beans:bean> </beans:property> <beans:property name="key" value="an_id_for_this_auth_provider_only"/> </beans:bean> <!‐‐ 认证类 ‐‐> <beans:bean id="userDetailsService" class="com.qingcheng.service.UserDetailServiceImpl"/> <!‐‐ 认证过滤器 结束 ‐‐> <!‐‐ 单点登出 开始 ‐‐> <beans:bean id="singleLogoutFilter" class="org.jasig.cas.client.session.SingleSignOutFilter"/> <beans:bean id="requestSingleLogoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilte r"> <beans:constructor‐arg value="${cas_url}/logout"/> <beans:constructor‐arg> <beans:bean class="org.springframework.security.web.authentication.logout.SecurityCon textLogoutHandler"/> </beans:constructor‐arg> <beans:property name="filterProcessesUrl" value="/logout/cas"/> </beans:bean> <!‐‐ 单点登出 结束 ‐‐> </beans:beans>
- qingcheng_common_cas工程创建UserDetailServiceImpl
三.搭建用户中心
- 创建qingcheng_web_center(用户中心) ,pom.xml引入依赖
- 新增web.xml ,参照其它web工程 ,并添加spring-security配置
- 新增配置文件dubbo.properties
- 添加配置文件cas.properties
- 将资源提供得用户中心相关页面拷贝至webapp下
四.用户中心显示登录名
- 在qingcheng_common_cas工程新增类
- 前端代码:
修改center-index.html,添加js代码
修改用户名显示部分
五.portal工程集成单点登录
- qingcheng_portal的web.xml添加
- 引入依赖
- 添加配置文件cas.properties
- 添加配置文件spring-security-portal.xml
六.首页显示登录名
- 修改模板页面
添加表达式 - 修改配置文件spring-security.xml ,配置/login/username.do可以匿名访问
- 修改LoginController的username方法
七.退出登录返回首页
- 修改cas服务端的配置文件 application.properties,添加配置
Spring Security 内置过滤器表