前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CAS 单点登录/登出 系统「建议收藏」

CAS 单点登录/登出 系统「建议收藏」

作者头像
全栈程序员站长
发布2022-08-24 20:36:09
2.3K0
发布2022-08-24 20:36:09
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

前言:

在我们的实际开发中,更多的是采用分布式系统。那么问题来了,对于分布式系统的登录问题,我们如何解决呢?

如果说我们在每一个系统中都要进行一次登录,那么用户体验度也就差的没法用了。以京东商城为例,如果用户在登录京东商城的时候需要登录一次,在查询商品的时候还有在登录一次,加入购物车是还要重新登录,…(注意,每跳过一个页面都是进入了一个新的系统,请看他的url 地址的变化) 那么京东商城的成绩 也就不会那么优异了。

如果说用session 进行解决的话,可是session的作用域 只限于当前系统,如果打开其他系统,当前session信息是不存在于其他系统的。

由此,CAS单点登录,就很好的解决了分布式系统的登录问题。

1.单点登录系统CAS入门

1. 1什么是单点登录

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

图解: 单点登录原理

①当用户访问应用系统1(例如:购物车系统) 的时候,应用系统1 就会判断当前是否是登录状态;

②如果发现没有登录,页面就会跳转到 认证系统(CAS:也就是登录系统),在登录页面输入完 用户名 和 密码,就会在CAS中进行校验;校验的时候会去读取数据库,当校验成功之后,认证系统 会向 用户 返回一个票据;

③ 用户拿着获得的票据 在购物车系统登录成功以后,再去访问应用系统 2 和 应用系统3 的时候,会自动带着这个票据;而应用系统2 和 应用系统3 会拿着这个票据 去认证系统 校验这个票据是否合法 ,如果票据合法 就会自动登录成功,否则 失败。

1.2什么是 CAS

CAS 是 SSO 的一个实现产品,是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。

CAS 具有以下特点:

① 开源的企业级单点登录解决方案;

② CAS Server 为需要独立部署的 Web 应用;

③ CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java,.Net,PHP,Perl,Apache,uPortal,Ruby等。

从结构上看,CAS 包含两个部分:CAS ServerCAS Client

CAS Server 需要独立部署 ,作用:主要负责对用户的认证工作;

CAS Client 作用:负责处理对客户端受保护资源的访问请求,需要登录的时候,重定向到 CAS Server。也就是说 客户端会有很多拦截器 如果用户没有票据,就进行拦截登录,如果有票据 应用系统就会拿着票据 去 认证系统(CAS) 进行校验,校验成功则可以成功登录。

CAS 最基本的协议过程:

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

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

② 定向认证:SSO 客户端会重定向 用户请求 到 SSO 服务器;

③ 用户认证:用户身份认证;

④ 发放票据:SSO 服务器会产生一个随机的 Service Ticket;

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

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

1.3 CAS 服务端部署

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

在资源\cas\source\cas-server-4.0.0-release\cas-server-4.0.0\modules 目录下 cas-server-webapp-4.0.0.war 将其改名为car.war 放入到 tomcat 目录下的 webapp 下。启动 tomcat 自动解压 war 包。浏览器输入 http://localhost:8080/cas/login

可以看到登录页面如下:

这里有一个固定的用户名 和 密码:casuser / Mellon

用户名和密码配置文件:\cas\WEB-INF\deployerConfigContext.xml

代码语言:javascript
复制
<bean id="primaryAuthenticationHandler"
          class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
    <property name="users">
        <map>
            <entry key="casuser" value="Mellon"/>  <!-- 默认的 -->
            <entry key="admin" value="admin"/>     <!-- 自定义的 -->
        </map>
    </property>
</bean>

登录成功之后会跳到登录成功的提示页面

1.4 服务端配置

1.4.1 修改端口号

如果不希望用 8080 端口号 访问 CAS ,可以对其端口号进行修改。

注意:分为两步,修改 Tomcat 端口 和 修改 CAS 端口

①修改 Tomcat 端口: 注意:只修改 Tomcat 端口也可以访问 CAS 的页面,仅此而已!

打开 tomcat 目录 conf\server.xml 找到下面的 配置 ,修改 port 的端口 将 8080 改为 9100

代码语言:javascript
复制
<Connector port="9100" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

② 修改 CAS 配置文件

修改 cas 的 WEB-INF/cas.properties

代码语言:javascript
复制
server.name=http://localhost:9100

1.4.2 去除 https 认证

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

① 修改 cas 的 WEB-INF/deployerConfigContext.xml 找到下面的配置 添加:p:requireSecure=”false”; requireSecure属性意思为是否需要安全验证,即:https ,false 为不采用。

代码语言:javascript
复制
<bean id="proxyAuthenticationHandler"
          class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
    p:httpClient-ref="httpClient"
    p:requireSecure="false" />

② 修改 cas 的 /WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml 下面参数是默认的,需要修改:

代码语言:javascript
复制
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
    p:cookieSecure="true"
	p:cookieMaxAge="-1"
	p:cookieName="CASTGC"
	p:cookiePath="/cas" />

参数 p:cookieSecure=”true”,同理为 HTTPS 验证相关,true 为采用 HTTPS 验证,FALSE 为不采用 https 验证

修改为

代码语言:javascript
复制
p:cookieSecure="false"

参数 p:cookieMaxAge=”-1″,是 Cookie 的最大生命周期,-1 为无生命周期,即只在当前打开的窗口有效,关闭 或 重新打开其他窗口,仍会要求验证。可以根据需要修改为 大于 0 的数字,比如3600 等,意思就是 3600秒(1小时)内 打开任意窗口都不需要验证。

修改为

代码语言:javascript
复制
p:cookieMaxAge="3600"

③ 修改 cas 的 /WEB-INF/spring-configuration/warnCookieGenerator.xml 文件 ,,修改和原理 与 ② 一模一样

1.5 CAS 客户端 入门 小demo ( 验证单点登录效果 )

搭建两个 客户端工程, 然后进行 单点登录测试 和 单点退出测试

1.5.1 搭建 客户端工程 1 (war 工程)

创建 Maven 工程 (war) casclient_demo1 引入 cas 客户端依赖 并 制定 Tomcat 运行端口为 9001

(1) pom 依赖

代码语言:javascript
复制
<dependencies>
    <!-- cas 客户端 -->  
    <dependency>
        <groupId>org.jasig.cas.client</groupId>  
        <artifactId>cas-client-core</artifactId>  
        <version>3.3.3</version>  
    </dependency>
    <!-- 因为要写jsp页面 需要 servlet api -->
    <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>

(2) web.xml 配置

在web.xml 中总共有 5 个过滤器:①登录过滤器;②票据验证过滤器;③拦截退出连接过滤器;

④⑤过滤器的作用是保证在 JSP 页面里面 能够获取到当前登录名。

代码语言:javascript
复制
<?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">
  <display-name>casclient_demo1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 
  	单纯的cas部署 需要一堆的过滤器:下面介绍三个:①登录过滤器;②票据验证过滤器;③拦截退出连接过滤器
  		作用:
  		①用户登录应用系统是 过滤 是否带有 票据信息,如果没有带票据信息,就重定向到登录页面(输入用户名和密码);
  				登录成功后 用户系统会返回一个票据;
  		②此时再去访问另一个系统时,这个系统有另一个过滤器,用于票据验证;
  		③当退出的时候,有一个专门拦截退出连接的过滤器
  	第四个和第五个过滤器: 保证在jsp 页面里面 能够获取到当前登录名。
  -->
  
  
  	<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 --> 
  	<!-- 监听器:监听浏览器里面 cookie 是否到期,如果到期需要清除一些信息 --> 
    <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>
    
    
    <!-- 该过滤器负责用户的认证工作,必须启用它 ;如果用户没有登录,需要告诉用户cas的登录地址-->  
    <filter>  
        <filter-name>CASFilter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>  
        <init-param>  
            <param-name>casServerLoginUrl</param-name>
            <!-- cas 的认证地址的url -->
            <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>
            <!-- cas 的根地址 -->
            <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) 编写 jsp 页面

代码语言:javascript
复制
<%@ 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>casclient-demo1</title>
</head>
<body>

欢迎来到 王者荣耀 一区

<!-- 获得远程 登录名 -->
<%=request.getRemoteUser() %><br>

<a href="http://localhost:9100/cas/logout?service=http://www.jd.com">退出登录</a>

</body>
</html>

(4) 测试

启动 CAS 服务器 ,启动当前项目,在浏览器输入访问地址 localhost:9001(因为在pom文件中配置了其端口) 回车后会被自动拦截跳转到 CAS 的登录页面(原因: 在web.xml 中配置了认证拦截),

在正确输入 用户名 和 密码后,回车 会自动跳转到index.jsp页面(原因:在web.xml中配置了 回调路径)

1.5.2 搭建 客户端工程 2 (war 工程)

(1) 将 客户端工程 1 拷贝一份 修改工程名为 casclient_demo2

(2) pom 文件修改 :

①坐标 :<artifactId>casclient_demo2</artifactId>

②端口号:<port>9002</port>

(3) web.xml 文件修改:

回调的路径端口号,把 9001 修改为 9002 ,有两处,一处在 认证过滤器,一处在 票据校验过滤器

<param-value>http://localhost:9002</param-value>

(4) index.jsp 页面里面 修改一下输出内容,以示区别

(5) 测试

启动 CAS 服务器 ,启动 项目1 和 项目2,在浏览器输入访问地址 localhost:9001 (或者localhost:9002 选其一),如果没有登录 直接访问,还是会被拦截,当登录成功后 在直接访问另一个地址,就会发现已经是登录状态。

这就是单点登录的效果。。。。。。。。。。

(6) 单点登录完成了,那么 单点退出怎么做呢?

方式一:地址栏输入:http://localhost:9100/cas/logout

方式二:在 index.jsp 页面中添加一个退出的超链接

代码语言:javascript
复制
<a href="http://localhost:9100/cas/logout">退出 CAS 登录</a>

方式三:如果想在退出后 自动跳转的某个页面上,该如果操作呢?

① 修改 CAS 系统的配置文件 cas-servlet.xml 只需要把默认的 false 修改 成 true 修改后的结果如下:

代码语言:javascript
复制
<bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
    p:servicesManager-ref="servicesManager"
    p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>

② 修改 index.jsp 的退出超链接,在 href 的 url 后面添加一个参数 如下:

代码语言:javascript
复制
<a href="http://localhost:9100/cas/logout?service=http://www.baidu.com">退出 CAS 登录</a>

当点击退出的时候就会自动 跳转的 百度页面。。。。

2. 对 CAS 的升级操作

在上面的操作中我们可以发现,登录 cas 管理页 所使用的 用户名 和 命名 是在配置文件( deployerConfigContext.xml )中进行配置 被 primaryAuthenticationHandler 管理primaryAuthenticationHandler又PolicyBasedAuthenticationManager 认证管理器所调用。

代码语言:javascript
复制
<!-- 认证管理器 -->
<bean id="authenticationManager"     
    class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
    <constructor-arg>
        <map>
            <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
            <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
        </map>
    </constructor-arg>
    <property name="authenticationPolicy">
        <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
    </property>
</bean>

<!-- 用户名 和 密码 管理 -->
<bean id="primaryAuthenticationHandler"
    class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
    <property name="users">
        <map>
            <entry key="casuser" value="Mellon"/>  <!-- 默认的 -->
            <entry key="admin" value="admin"/>     <!-- 自定义的 -->
        </map>
    </property>
</bean>

情 景 一 :

这种方式适合于 demo 的联系,实际业务中我们并不会去这样做,更多的是 与数据库建立联系,去数据库中获取用户名 和 密码。

那么 ,如何实现呢?

(1) 既然 用户名 和 密码 被 primaryAuthenticationHandler 所管理,那么只需要 将primaryAuthenticationHandler 在认证管理器中替换成我们数据库的即可。

代码语言:javascript
复制
<!-- 认证管理器 -->
<bean id="authenticationManager"     
    class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
    <constructor-arg>
        <map>
            <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
            <entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver" />
        </map>
    </constructor-arg>
    <property name="authenticationPolicy">
        <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
    </property>
</bean>


<!-- database source -->
<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"/>

(2) 添加 配置文件

将上述 三个配置文件 添加到 apache-tomcat-CAS-7.0.52\webapps\cas\WEB-INF\lib 目录下面即可。

(3) 启动 测试

输入地址 :localhost:9100/cas 入门是配置的用户名 和 密码 都是 admin 如果你的数据库中没有 admin 现在在使用就保存

只有你数据库中 存在的用户名和 密码 才能登陆成功

情 景 二 :

我们从上面的 CAS 默认的访问页面可以看出,CAS 的默认登录页面 着实 无法登 大雅之堂,下面我们来介绍如何改造 CAS 的登录页面。

在 CAS 配置文件( cas-servlet.xml )里面的有一个 自动解析器,通过自动解析器可以找到这个登录页面

代码语言:javascript
复制
<bean id="urlBasedViewResolver" 
    class="org.springframework.web.servlet.view.UrlBasedViewResolver"
    p:viewClass="org.springframework.web.servlet.view.InternalResourceView"
    p:prefix="/WEB-INF/view/jsp/"
    p:suffix=".jsp"
    p:order="1"/>

在 /WEB-INF/view/jsp/default/ui 目录下面有一个 casLoginView.jsp ,这个就是登录的页面,把我们 自定义的登录页面 拷贝到 ui 这么目录下面,并修改我们自定义的 登录页文件名为 casLoginView.jsp

只更改一下文件名 是不可能生效的,以为 CAS 默认的是 jsp 页面 ,而自定义的是 html 页面,所以需要更改一下里面的内容才可以:

(1) 自定义的登录页 如果有样式,需要先把样式 拷贝到 apache-tomcat-CAS-7.0.52\webapps\cas 目录下

(2) 拷贝标签库

将 apache-tomcat-CAS-7.0.52\webapps\cas\WEB-INF\view\jsp\default\ui\includes 目录下的top.jsp 中的有用代码拷贝到我们自定义的登录页 casLoginView.jsp 里面去

代码语言:javascript
复制
<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

(3) 修改 from 表单

① 修改 from 的标签头 和 尾

将原先 casLoginView.jsp 的from 的标签头 和 尾 拷贝到自定义的 casLoginView.jsp 文件的对应位置,并把自定义的 from 标签的样式 放到拷贝过来的from 标签里面,删除自定义的from 标签即可。

class=”sui-form” :是自定义 中的from 标签放进来的。

代码语言:javascript
复制
<form:form method="post" class="sui-form" id="fm1" commandName="${commandName}" htmlEscape="true">
    。。。。。
</form:form>

② 修改 用户名 的输入框,复制对应的 用户名输入框,并删除自定义的

placeholder=”邮箱/用户名/手机号” class=”span2 input-xfat”:是自定义 用户名的样式,

cssClass=”required” cssErrorClass=”error”:这是 CAS 默认的样式,已删除

代码语言:javascript
复制
<form:input placeholder="邮箱/用户名/手机号" class="span2 input-xfat" id="username"
 size="25" tabindex="1" accesskey="${userNameAccessKey}" path="username" autocomplete="off" htmlEscape="true" />

③修改 密码 的输入框,复制对应的 密码输入框,并删除自定义的

placeholder=”请输入密码” class=”span2 input-xfat”:是自定义 用户名的样式,

cssClass=”required” cssErrorClass=”error”:这是 CAS 默认的样式,已删除

代码语言:javascript
复制
<form:password placeholder="请输入密码" class="span2 input-xfat" id="password" 
size="25" tabindex="2" path="password"  accesskey="${passwordAccessKey}" htmlEscape="true" autocomplete="off" />

④修改 提交按钮,复制对应的 提交按钮 切记还有三个隐藏域,并删除自定义的

class=”sui-btn btn-block btn-xlarge btn-danger”:是自定义 提交按钮的样式

class=”btn-submit”:这是 CAS 默认的样式,已删除

value=”<spring:message code=”screen.welcome.button.login” />”:这是 CAS 的国际化,因为 CAS 的服务端不仅仅只有中国人在用,国外也在用,默认显示英文。这里的 value 已修改成 中文

代码语言:javascript
复制
<div class="logined">
<!-- 
    <a class="sui-btn btn-block btn-xlarge btn-danger" href="home-index.html">登&nbsp;&nbsp;录</a>
-->

    <input type="hidden" name="lt" value="${loginTicket}" />
    <input type="hidden" name="execution" value="${flowExecutionKey}" />
    <input type="hidden" name="_eventId" value="submit" />

    <input class="sui-btn btn-block btn-xlarge btn-danger" name="submit" accesskey="l" value="登&nbsp;&nbsp;录" tabindex="4" type="submit" />
									
</div>

⑤ 修改 登录失败后的显示信息 ,将这条信息 拷贝到 自定义的 casLoginView.jsp 中即可。

代码语言:javascript
复制
<form:errors path="*" id="msg" cssClass="errors" element="div" htmlEscape="false" />

如果用户名 和 密码 输入有误:会报下面的情况

这种英文 的错误 称为 国际化 简称 i18n ,在 apache-tomcat-CAS-7.0.52\webapps\cas\WEB-INF\classes 目录下的所有文件都是 国际化 文件 。在其中的 messages.properties 文件里面 可以找到 Invalid credentials 这个错误信息

如何修改成为中文呢?

① 设置国际化为 zn_CN,修改 cas-servlet.xml 文件

代码语言:javascript
复制
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" p:defaultLocale="zh_CN" />

将上图的 最后三个配置信息 拷贝到 messages_zh_CN.properties 文件里面,并且对中午的值进行编码,

编码方法:在 .properties 文件里面进行输入汉字会自动编码 “用户名和密码错误”

用户不存在时的错误提示:

代码语言:javascript
复制
authenticationFailure.AccountNotFoundException=\u7528\u6237\u4E0D\u5B58\u5728.

密码错误时的 错误提示:

代码语言:javascript
复制
authenticationFailure.FailedLoginException=\u5BC6\u7801\u9519\u8BEF.

显示效果:

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/141597.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月9,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.单点登录系统CAS入门
    • 1. 1什么是单点登录
      • 1.2什么是 CAS
        • 1.3 CAS 服务端部署
          • 1.4 服务端配置
            • 1.4.1 修改端口号
            • 1.4.2 去除 https 认证
          • 1.5 CAS 客户端 入门 小demo ( 验证单点登录效果 )
            • 1.5.1 搭建 客户端工程 1 (war 工程)
            • 1.5.2 搭建 客户端工程 2 (war 工程)
        • 2. 对 CAS 的升级操作
          • 情 景 一 :
            • 情 景 二 :
            相关产品与服务
            访问管理
            访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档