美文网首页
CAS单点登录系统

CAS单点登录系统

作者: Demon先生 | 来源:发表于2020-05-08 09:58 被阅读0次

    1. CAS单点登录介绍

    1.1. 什么是单点登录

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

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

    image

    1.2. 什么是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 最基本的协议过程:

    image

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

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

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

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

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

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

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

    2. CAS服务端部署及配置

    本文采用版本为CAS.5.3,Tomcat.8.5.23,mysql8.0+。

    2.1. 基础部署配置

    第一步:下载官方提供的CAS部署工程和对应版本Tomcat。解压后的CAS工程目录列表如下:

    image

    第二步:双击build.sh运行程序,会自动开始构建war包,构建完成后会在同级目录出现target文件夹,进入文件夹目录如下:

    image

    第三步:将cas.war包拷贝到tomcat目录/webapps/目录下,启动tomcat(注意端口是否被占用),cas.war将会被自动解压。出现下图所示,表示启动成功。

    image

    第四步:浏览器输入地址:localhost:9001/cas/login,会弹出登录界面。

    image

    第五步:输入初始用户名和密码:casuser/Mellon,登录成功,表示基础部署完成。

    image

    注:如果要修改登录密码,进入tomcat目录webapps\cas\WEB-INF\classes下,修改application.properties文件中的cas.authn.accept.users字段值,如下:

    image

    2.2. 去除https认证

    CAS默认使用的是HTTPS协议,如果使用HTTPS协议需要SSL安全证书(需向特定的机构申请和购买)。如果对安全要求不高或是在开发测试阶段,可使用HTTP协议。这里通过修改配置,让CAS使用HTTP协议。

    第一步:修改webapps\cas\WEB-INF\classes\application.properties文件,在最后添加如下语句:

    cas.tgc.secure=false
    cas.serviceRegistry.initFromJson=true
    

    第二步:修改webapps\cas\WEB-INF\classes\services\HTTPSandIMAPS-10000001.json文件,添加http协议访问。


    image.png

    注:如果客户端没有经过https认证对CAS服务端进行访问,将会出现未认证授权的服务的界面提示。


    image.png

    2.3. 登录数据源设置

    2.3.1 密码未加密处理

    第一步:新建数据库userdb,建立用户登录的数据库表tb_user,并添加字段username,password。插入一条数据,如用户名密码为:demo:123456。

    第二步:修改cas工程目录pom.xml文件,添加如下依赖。

    <!--数据库认证相关start-->           
    <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-support-jdbc</artifactId>
            <version>${cas.version}</version>
    </dependency>
    <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-support-jdbc-drivers</artifactId>
            <version>${cas.version}</version>
    </dependency>
    <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
    </dependency>
    <!--数据库认证相关 end-->
    

    第三步:进入cas工程目录,使用命令行,先执行清除命令,再执行安装命令。

    mvn clean  //清除
    mvn install  //安装构建
    

    第三步:将构建完成target目录下的cas.war文件拷贝到tomcat目录下,运行tomcat,解压war包。

    第四步:修改tomcat目录下的webapps\cas\WEB-INF\classes\application.properties文件,注释掉用户名密码登录的cas.authn.accept.users字段,并添加数据库相关配置。

    # cas.authn.accept.users=casuser::Mellon
    #添加jdbc认证
    cas.authn.jdbc.query[0].sql=SELECT * FROM tb_user WHERE username =?
    #那一个字段作为密码字段
    cas.authn.jdbc.query[0].fieldPassword=password
    #配置数据库连接
    cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/userdb?serverTimezone=UTC&characterEncoding=utf-8
    #数据库用户名
    cas.authn.jdbc.query[0].user=root
    #数据库密码
    cas.authn.jdbc.query[0].password=5201314
    #mysql驱动
    cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver
    

    第五步:重启tomcat,并使用第一步插入的用户名密码进行登录,如果出现登录成功界面,表示数据源设置成功。


    image.png

    2.3.2 密码MD5加密配置

    修改tomcat目录下的webapps\cas\WEB-INF\classes\application.properties文件,添加md5加密相关配置。

    #配置加密策略
    cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT
    cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
    cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5
    

    2.4. 登录页面的极简改造

    进入tomcat目录\webapps\cas\WEB-INF\classes\templates,修改casLoginView.html文件,这个是CAS自带的登录页面,极简更改如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登录界面</title>
    </head>
    <body>
        <form method="post" id="fm1" th:object="${credential}" action="login">
            <h3>请输入用户名和密码</h3>
    
            <section>
                <label>用户名</label>
                <div>
                    <input id="username" type="text" th:field="*{username}"/>
                </div>
            </section>
    
            <section>
                <label>密码</label>
                <div>
                    <input type="password" id="password" th:field="*{password}"/>
                </div>
            </section>
    
            <input type="hidden" name="execution" th:value="${flowExecutionKey}"/>
            <input type="hidden" name="_eventId" value="submit"/>
            <input type="submit" value="登录" />
            <div th:if="${#fields.hasErrors('*')}">
                <span>用户名或密码有误,请重新输入!</span>
            </div>
        </form>
    
        <script type="text/javascript" th:inline="javascript">
            var i = [[#{screen.welcome.button.loginwip}]]
            $( document ).ready(function() {
                $("#fm1").submit(function () {
                    $(":submit").attr("disabled", true);
                    $(":submit").attr("value", i);
                    console.log(i);
                    return true;
                });
            });
        </script>
    </body>
    </html>
    

    3. CAS客户端搭建

    3.1. 搭建工程并添加依赖

    搭建Maven的web工程,并在pom.xml文件中添加cas客户端依赖和servlet依赖,以及tomcat插件。配置如下:

      <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>9090</port>
                        <!-- 请求路径 -->
                        <path>/</path>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    

    3.2. 单点登录配置

    第一步:修改web.xml文件,在文件中添加两个登录的必填配置,一个是负责用户的认证工作,另一个是负责对Ticket的校验工作(注意:这里的本地客户端地址,必须为本地ip4地址,不能是localhost或者127.0.0.1)配置如下:

    <!-- 该过滤器负责用户的认证工作,必须启用它 -->
     <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>[cas登录访问地址](http://192.168.25.129:8082/cas/login)</param-value> <!--这里的server是服务端的IP -->
         </init-param>
         <init-param>
             <param-name>serverName</param-name>
             <param-value>[本地客户端地址](http://192.168.88.9:9090/)</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>[cas根目录地址](http://192.168.25.129:9001/cas)</param-value>
         </init-param>
         <init-param>
             <param-name>serverName</param-name>
             <param-value>[本地客户端地址](http://192.168.88.9:9090/)</param-value>
         </init-param>
     </filter>
     <filter-mapping>
         <filter-name>CAS Validation Filter</filter-name>
         <url-pattern>/*</url-pattern>
     </filter-mapping>
    

    第二步:修改或添加index.html页面,这个页面是登录成功后,进入的第一个页面,用于验证登录是否成功。

    <html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <h2>恭喜你,CAS登录成功</h2>
    </body>
    </html>
    

    第三步:启动程序,访问客户端设置地址,便会进入CAS登录界面,输入用户名和密码,登录成功进入index.jsp页面。


    image.png

    3.3. 单点登出配置

    3.3.1 未重定向登出

    第一步:在web.xml文件中添加单点登出配置。

        <!-- 用于单点退出,该过滤器用于实现单点登出功能-->
        <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>
    

    第二步:在index.html添加登出按钮,并添加登出的访问地址。

    <html>
    <head>
     <meta charset="UTF-8">
    </head>
    <body>
    <h2>恭喜你,CAS登录成功</h2>
    <a href="[CAS登出地址](http://192.168.25.129:9001/cas/logout)">退出登录</a>
    </body>
    </html>
    

    第三步:测试登出操作,退出成功,返回退出成功界面。


    image.png

    3.3.2 重定向地址登出

    第一步:修改3.3.1章节的第二步index.html文件,添加重定向地址,如下:

    <html>
    <head>
     <meta charset="UTF-8">
    </head>
    <body>
    <h2>恭喜你,,CAS登录成功</h2>
    <a href="[CAS登出地址?service=重定向地址](http://192.168.25.129:9001/cas/logout?service=https://www.baidu.com)">退出登录</a>
    </body>
    </html>
    

    第二步:修改CAS服务端tomcat目录文件webapps\cas\WEB-INF\classes\ application.properties,添加允许重定向字段,并重启tomcat。

    #配置单点登出
    #配置允许登出后跳转到指定页面
    cas.logout.followServiceRedirects=true
    #跳转到指定页面需要的参数名为 service
    cas.logout.redirectParameter=service
    #登出后需要跳转到的地址,如果配置该参数,service将无效。
    #cas.logout.redirectUrl=https://www.taobao.com
    #在退出时是否需要 确认退出提示   true弹出确认提示框  false直接退出
    cas.logout.confirmLogout=false
    #是否移除子系统的票据
    cas.logout.removeDescendantTickets=true
    #禁用单点登出,默认是false不禁止
    #cas.slo.disabled=true
    #默认异步通知客户端,清除session
    cas.slo.asynchronous=true
    

    第三步:测试,点击退出登出后,将会重定向到百度页面。

    3.4. 获取登录用户信息配置

    在web.xml文件中,添加如下配置。

        <!-- 该过滤器负责实现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>
    

    4. CAS客户端与SpringSecurity集成

    4.1. 搭建工程并添加依赖

    创建Maven工程,并在pom.xml文件中添加Spring、Spring-security相关依赖,以及tomcat插件。

    <dependencies>
            <!-- Spring -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jms</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <!-- spring安全框架 -->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-web</artifactId>
                <version>4.1.0.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-config</artifactId>
                <version>4.1.0.RELEASE</version>
            </dependency>
            <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>
        </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>9092</port>
                        <!-- 请求路径 -->
                        <path>/</path>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    

    4.2. 修改和创建配置文件

    第一步:创建spring-security和CAS相关的配置文件spring-security.xml,注意修改端口和CAS服务访问地址(注意:这里的自身根目录地址,必须为本地ip4地址,不能是localhost或者127.0.0.1)。

    <?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"
                 xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
                 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
                            http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    
        <http pattern="/index2.jsp" 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="http://192.168.25.129:8082/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://192.168.88.9:9092/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://192.168.25.129:8082/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.demon.cas.service.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://192.168.25.129:8082/cas/logout?service=http://192.168.88.9:9092/index2.jsp"/>
            <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>
    

    第二步:创建springmvc.xml文件,用于添加包扫描和注解配置。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:component-scan base-package="com.demon.cas.controller"/>
        <mvc:annotation-driven/>
    
    </beans>
    

    第三步:修改web.xml文件,添加认证拦截器和spring文件扫描器。

    <?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">
    
        <!-- 安全登录拦截,注意springSecurityFilterChain不能改变 -->
        <filter>
            <filter-name>springSecurityFilterChain</filter-name>
            <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>springSecurityFilterChain</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-security.xml</param-value>
        </context-param>
        <listener>
            <listener-class>
                org.springframework.web.context.ContextLoaderListener
            </listener-class>
        </listener>
    
        <servlet>
            <servlet-name>cas-client3-springsercurity</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>cas-client3-springsercurity</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    第四步:创建登录成功后展示页面index.jsp,添加登录按钮。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <body>
    <h2>Hello World!</h2>
    <a href="/logout/cas">退出登录</a>
    </body>
    </html>
    

    第五步:创建退出成功后展示页面index2.jsp,注意这里的页面名字和spring-security.xml文件中的service重定向路径名字必须一致。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h4>退出成功</h4>
    </body>
    </html>
    

    4.3. 创建Spring-security认证脚本

    在路径com.demon.cas.service下创建UserDetailServiceImpl.java脚本,并继承UserDetailsService接口(注意这里的路径需要与上面配置文件中认证类路径一致)

    /**
     * 认证类
     */
    public class UserDetailServiceImpl implements UserDetailsService {
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            System.out.println("登录结果:" + username);
            //构建角色集合
            List<GrantedAuthority> authorities = new ArrayList();
            authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
            return new User(username, "", authorities);
        }
    }
    

    此时,在浏览器中输入访问地址ip:9092,会自动进入CAS登录页面,登录成功后,进入index.jsp页面。

    4.4. 获取登录名

    创建UserController.java脚本,添加springmvc相关注解,开放外部访问接口。

    @RestController
    public class UserController {
    
        @RequestMapping("/findLoginUser")
        public String  findLoginUser(){
            String name = SecurityContextHolder.getContext().getAuthentication().getName();
            return name;
        }
    }
    

    登录成功后,在浏览器地址栏输入localhost:9092/findLoginUser.do 即可在控制台看到输出的登录名。

    文档下载地址:

    https://wenku.baidu.com/view/3959da2a031ca300a6c30c22590102020740f2ff

    相关文章

      网友评论

          本文标题:CAS单点登录系统

          本文链接:https://www.haomeiwen.com/subject/amexnhtx.html