Day105 Java项目 (SSM+Dubbo)商城(十四) 单点登录解决方案 CAS

1.开源单点登录系统CAS

一.什么是单点登录

  1. 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
  2. 我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。
  3. 当我们访问其中一个前台系统需要登录才可以访问的页面时,自动跳转到登录中心进行登录,登录后再次跳转回该前台系统,该前台系统可以获取登录名。
    实现单点登录有多种方案:
    (1)使用redis实现session共享
    (2)使用开源的单点登录系统(推荐)

二.CAS简介

  1. 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。
  2. SSO单点登录访问流程主要有以下步骤:
    1.访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
    2.定向认证:SSO客户端会重定向用户请求到SSO服务器。
    3.用户认证:用户身份认证。
    4.发放票据:SSO服务器会产生一个随机的ServiceTicket。
    5.验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
    6.传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。

2. CAS快速入门

一.CAS服务端部署

  1. 打包
    (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的最后面修改密码为如下
  2. 配置兼容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客户端开发

  1. 原生方式
    1. 新建demo工程,pom.xml 添加配置
    2. 新建web.xml



    3. 新增index.jsp
    4. 测试: 启动cas服务端和客户端,浏览器输入http://localhost:9001 ,系统自动跳转到服务端的登录页面,输入正确的用户名和密码后,跳转回客户端工程。
    5. 再创建一个一样的cas客户端程序(青橙秒杀),端口为9002,测试两个系统单点登录的效果。即登录其中一个系统,另外一个系统则不用登录。
  2. 与Spring Security整合
    1. 创建 demo工程,pom.xml引入依赖(资源中提供)
    2. 添加web.xml
    3. 添加spring-security.xml
    4. 添加UserDetailServiceImpl
    5. 添加index.jsp

3. 青橙-认证中心

一.数据源与加密设置

  1. 数据源设置
    我们需要改变服务端的配置,从数据库中获取用户名和密码。设置方法:
    修改application.properties ,将 cas.authn.accept.users=.... 加井号注释掉,再加入以下内容:
  2. 加密配置
    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 配置文件

二.自定义用户界面

  1. 需求分析
    将CAS的服务端页面更改为以下样式
  2. 代码实现
    参考文档: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
    1. 在apache-tomcat-8.5.37\webapps\cas\WEB-INF\classes\static\themes目录下创
      建qingcheng文件夹,将静态原型中的img和css文件夹拷入此文件夹
    2. 在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对象属性绑定的对象
    3. 在apache-tomcat-8.5.37\webapps\cas\WEB-INF\classes下创建qingcheng.properties
    4. 修改apache-tomcat-8.5.37\webapps\cas\WEBINF\classes\application.properties

4. 青橙-单点登录

一.需求分析

  1. 新建用户中心,与认证中心对接实现单点登录。
    将portal工程集成单点登录。

二.CAS公共模块

  1. 创建qingcheng_common_cas工程( cas公共模块),pom.xml引入依赖
  2. 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>
  3. qingcheng_common_cas工程创建UserDetailServiceImpl

三.搭建用户中心

  1. 创建qingcheng_web_center(用户中心) ,pom.xml引入依赖
  2. 新增web.xml ,参照其它web工程 ,并添加spring-security配置
  3. 新增配置文件dubbo.properties
  4. 添加配置文件cas.properties
  5. 将资源提供得用户中心相关页面拷贝至webapp下

四.用户中心显示登录名

  1. 在qingcheng_common_cas工程新增类
  2. 前端代码:
    修改center-index.html,添加js代码

    修改用户名显示部分

五.portal工程集成单点登录

  1. qingcheng_portal的web.xml添加
  2. 引入依赖
  3. 添加配置文件cas.properties
  4. 添加配置文件spring-security-portal.xml

六.首页显示登录名

  1. 修改模板页面

    添加表达式
  2. 修改配置文件spring-security.xml ,配置/login/username.do可以匿名访问
  3. 修改LoginController的username方法

七.退出登录返回首页

  1. 修改cas服务端的配置文件 application.properties,添加配置

Spring Security 内置过滤器表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值