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

CAS 单点登录/登出 系统「建议收藏」前言:  在我们的实际开发中,更多的是采用分布式系统。那么问题来了,对于分布式系统的登录问题,我们如何解决呢?  如果说我们在每一个系统中都要进行一次登录,那么用户体验度也就差的没法用了。以京东商城为例,如果用户在登录京东商城的时候需要登录一次,在查询商品的时候还有在登录一次,加入购物车是还要重新登录,…(注意,每跳过一个页面都是进入了一个新的系统,请看他的url地址的变化)…

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

前言:

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

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

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

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

1.单点登录系统CAS入门

1. 1什么是单点登录

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

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

图解:    单点登录原理

    ①当用户访问应用系统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 最基本的协议过程:

    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

    可以看到登录页面如下:

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

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

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

<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>

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

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

1.4 服务端配置

1.4.1 修改端口号

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

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

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

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

<Connector port="9100" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

    ② 修改 CAS 配置文件

    修改 cas 的 WEB-INF/cas.properties

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 为不采用。

<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  下面参数是默认的,需要修改:

<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 验证

    修改为

p:cookieSecure="false"

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

    修改为

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 依赖

<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 页面里面 能够获取到当前登录名。

<?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 页面

<%@ 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 中配置了认证拦截),

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

在正确输入 用户名 和 密码后,回车 会自动跳转到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

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

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

<a href="http://localhost:9100/cas/logout">退出 CAS 登录</a>

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

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

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

<bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
    p:servicesManager-ref="servicesManager"
    p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>

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

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

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

 

 

2. 对 CAS 的升级操作

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

<!-- 认证管理器 -->
<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 在认证管理器中替换成我们数据库的即可。

<!-- 认证管理器 -->
<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) 添加 配置文件

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

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

    (3) 启动 测试 

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

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

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

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

    

 

    情 景 二 :

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

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

<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 单点登录/登出 系统「建议收藏」

     只更改一下文件名 是不可能生效的,以为 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 里面去

<%@ 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 标签放进来的。

<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 默认的样式,已删除

<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 默认的样式,已删除

<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 已修改成 中文

<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 中即可。

<form:errors path="*" id="msg" cssClass="errors" element="div" htmlEscape="false" />

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

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

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

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

    如何修改成为中文呢?

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

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" p:defaultLocale="zh_CN" />

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

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

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

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

authenticationFailure.AccountNotFoundException=\u7528\u6237\u4E0D\u5B58\u5728.

    密码错误时的 错误提示:

authenticationFailure.FailedLoginException=\u5BC6\u7801\u9519\u8BEF.

    显示效果:

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

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2022年5月9日 下午4:00
下一篇 2022年5月9日 下午4:20


相关推荐

  • struts2综合漏洞扫描工具

    struts2综合漏洞扫描工具python扫描工具更新2022-4-161.添加了S2-062漏洞利用其实是对S2-061漏洞的绕过支持命令执行,Linux反弹shell,windows反弹shell。2.解决了了Windows反弹shell的功能底层原理:解决了有效负载Runtime.getRuntime().exec()执行复杂windows命令不成功的问题。详情文章:https://www.yuque.com/docs/share/0abe4b7e-45fd-4902-a23a-ad51ab72cbb9?#《使用j

    2022年7月19日
    16
  • kafka删除topic 被标记为删除_kafka支持多少个topic

    kafka删除topic 被标记为删除_kafka支持多少个topic kafka删除topic时的隐患 生产上kafka集群长时间使用会导致topic容器下已被消费的消息过多,进而导致在重新选主时切换时间长的问题。追根到底来讲切换Leader时间都花费在zookeeper文件同步上,但是kafka恰恰没有清理已被消费消息的机制,故导致死尸消息每次在节点重启或者切主都会时间很常,而zookeeper提供了java…

    2022年10月10日
    3
  • circos 可视化手册- text 篇

    circos 可视化手册- text 篇欢迎关注微信公众号 生信修炼手册 不论是 heatmap 还是 scatter histogram 反应的都是基因组上某段区域对应的 value 值的分布 这里的 value 都是数值 对于 value 是字符串的情况 专门定义了 text 这种图表类型 用于展示 看一个 text 的实例 text 在图上就是一圈的字符串标记 字符串可以添加连线 表明对应的染色体位置 配置文件的写法如下 首先看下 fil

    2025年6月15日
    4
  • C++ fstream详解[通俗易懂]

    C++ fstream详解[通俗易懂]C语言里面对文件的操作是通过文件指针,以及一些相关的函数,那么C++中是如何对文件进行操作的呢?没错,就是通过fstream这个文件流来实现的。当我们使用#include时,我们就可以使用其中的ifstream,ofstream以及fstream这三个类了(ofstream是从内存到硬盘,ifstream是从硬盘到内存),也就可以用这三个类来定义相应的对象了,这三个类分别代表一个输入文件…

    2026年1月28日
    6
  • UVa 884 – Factorial Factors

    UVa 884 – Factorial Factors

    2021年12月16日
    40
  • 电脑绘画入门教程_如何学习电脑绘画?电脑绘画入门教程

    电脑绘画入门教程_如何学习电脑绘画?电脑绘画入门教程如何学习电脑绘画 怎样才能学习好电脑绘画 学习好电脑绘画有哪些技巧 想必这些问题都是绘画初学者们比较伤脑筋的问题 那么到底怎样才能学习好电脑绘画呢 今天灵猫课堂老师就在网络上收集整理了关于如何学习电脑绘画 需要美术基础吗 教程非常简单 赶紧来看看叭 插画 其主要功能是将文字内容 故事或思想以视觉出现的方式呈现 对于现代插画来说 更是个一个设计专业 而非纯艺术专业 因此 其美术性 视觉性 文字内容的

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号