`

cas server 4.0深度研究

阅读更多

一.体系结构

1.需要注意的几个配置文件

WEB-INF/deployerConfigContext.xml,WEB-INF/login-webflow.xml

 

2.AuthenticationManager

    配置位置 deployerConfigContext.xml

    主要涉及的方法是Authentication authenticate(final Credential... credentials),以及在authenticate方法中调用的AuthenticationBuilder authenticateInternal(final Credential... credentials)。

    身份认证管理器,通过指定认证凭证的认证处理程序来定义认证的安全策略。3.5的时候实现类是 org.jasig.cas.authentication.AuthenticationManagerImpl , 4.0变为org.jasig.cas.authentication.PolicyBasedAuthenticationManager,这是3.5和4.0改变最大的原因。没有改造的必要,如果debug看代码从PolicyBasedAuthenticationManager的Authentication authenticate(final Credential... credentials) 方法开始。

 

 

3.Credential

    配置位置 login-webflow.xml

    由登陆提交的信息封装成的认证凭证,主要需要定制的内容,注意修改时同时需要修改login-webflow 中 viewLoginForm 的 binder

 

4.AuthenticationHandler

    配置位置 deployerConfigContext.xml

    主要涉及方法 String getName();

                          boolean supports(Credential credential) 判断是否由该AuthenticationHandler处理

                          HandlerResult authenticate(Credential credential) 传入封装好的

    

    AuthenticationManager通过委托AuthenticationHandler(处理器)处理Credential(认证凭证)。认证该组件提供身份认证在您的环境中使用的各类证件。

    注意:(1)每个处理器都需要一个唯一的名称。

            (2)不同于3.5的AuthenticationHandler(包路径改变)中authenticate方法返回boolean值,4.0版本AuthenticationHandler中返回的是HandlerResult。

 

5.PrincipalResolver

    配置位置 deployerConfigContext.xml

    主要涉及方法 Principal resolve(Credential credential);

    通过解析AuthenticationHandler(处理器)处理认证通过的Credential(认证凭证),构建Principal(认证结果)。

    在4.0中可以不配置AuthenticationHandler对应的PrincipalResolver,这样,程序会调用AuthenticationHandler处理结果中HandlerResult的

 

 6.Principal

    一个通用概念,代表一个经过认证的东西。这里是认证结果的封装。

    在这里是一个接口,SimplePrincipal是官方提供的一个实现。有两个方法 getId() 方法用于返回唯一标识,Map<String, Object> getAttributes()可以在重写后返回其它的属性,但是需要修改casServiceValidationSuccess.jsp,修改方法之前的文章中有过讲解,这里不再赘述。

    结果属性中Map<String, Object> Object尽量不要放集合,casServiceValidationSuccess.jsp不好修改.

 

 

 二.输入参数和返回值的订制

yale-cas服务器端深度定制 文章中已经介绍过3.5如何进行订制,这里主要说一下4.0不一样的地方

 

1.deployerConfigContext.xml

PolicyBasedAuthenticationManager中配置AuthenticationHandler的方式发生改变,现在可以向下面这样配置一个自定义的AuthenticationHandler。

上面说过可以不配置PrincipalResolver

  

<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
    <constructor-arg>
        <map>
            <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver"/>
            <entry key-ref="myAuthenticationHandler">
                <null/>
            </entry>
        </map>
    </constructor-arg>
    <property name="authenticationPolicy">
        <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy"/>
    </property>
</bean>
 

  

2.AuthenticationHandler

    主要的认证工作和服务器端返回值都在AuthenticationHandler的authenticate方法中完成,注意 getName和 supports 两个方法也需要重写

 

@Override
public HandlerResult authenticate(Credential credential) throws GeneralSecurityException, PreventedException {
    MyCredential myCredential = (MyCredential)credential;
    if (credential == null) {
        throw new FailedLoginException();
    } else if (StringUtils.isBlank(credential.getId())) {
        logger.debug("{} was not found in the map.", credential);
        throw new AccountNotFoundException(credential + " not found in backing map.");
    }

    Map<String, Object> attributes = Maps.newHashMap();
    attributes.put("中文KEY", "中文value");
    attributes.put("空值key", "");
    attributes.put("custom", myCredential.getCustom());

    Principal principal = new SimplePrincipal(credential.getId(), attributes);
    return new HandlerResult(this, new BasicCredentialMetaData(credential), principal);
}
 

 

 

 

3.login-webflow.xml

设置自定义Credential(认证凭证),MyCredential是一个只有有三个String属性username,password,custom的pojo

 

<var name="credential" class="com.gqshao.sso.credential.MyCredential" />
除了var credential外还要设置view-state id="viewLoginForm"中binder,与Credential中参数一一对应。 

 

<binder>
    <binding property="username" />
    <binding property="password" />
    <binding property="custom" />
</binder>

 

 

4./WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp

修改casServiceValidationSuccess.jsp,用于将Principal中Attributes发送到客户端

3.0展示不需要修改,因为没有对应3.0的客户端

  

<cas:user>${fn:escapeXml(assertion.primaryAuthentication.principal.id)}</cas:user>
<!-- 解析返回的参数 Custom By SGQ -->
<c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">
    <cas:attributes>
        <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">
            <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>
        </c:forEach>
    </cas:attributes>
</c:if>
<!-- Custom By SGQ-->

5.WEB-INF/view/jsp/default/ui/casLoginView.jsp

<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>单点登录认证系统</title>
</head>
<body id="cas">
<c:if test="${not pageContext.request.secure}">
    <div id="msg">
        <h2>非安全连接</h2>

        <p>您正在通过非安全连接访问单点登录系统。单点登录将无法正常工作。为了单点登录正常工作,你必须通过HTTPS登录。</p>
    </div>
</c:if>
<form id="fm1" action="/cas-server/login" method="post">
    <h2>请输入您的用户名和密码.</h2>

    <div>
        <label for="username">用户名:</label>
        <input id="username" name="username" type="text" value=""/>
    </div>
    <div>
        <label for="password">密码:</label>
        <input id="password" name="password" type="password" value=""/>
    </div>
    <div>
        <label for="custom">自定义:</label>
        <input id="custom" name="custom" type="text" value=""/>
    </div>
    <div>
        <input id="warn" name="warn" value="true" type="checkbox"/>
        <label for="warn">转向其他站点前提示我。</label>
    </div>
    <div>
        <input type="hidden" name="lt" value="${loginTicket}"/>
        <input type="hidden" name="execution" value="${flowExecutionKey}"/>
        <input type="hidden" name="_eventId" value="submit"/>
        <input name="submit" value="登录" type="submit"/>
        <input name="reset" value="重置" type="reset"/>
    </div>
</form>
</body>
</html>
  

6.cas.properties

设置如下值用于单点登出,同3.5一致

cas.logout.followServiceRedirects=true  

 

三.国际化管理

WEB-INF/spring-configuration/applicationContext.xml文件中bean id=messageSource配置国际化,可以修改路径

 

四.自定义登陆错误

AuthenticationHandler中通过throw Exception,比如throw new FailedLoginException();或throw new FailedLoginException();抛出异常,通过查看WEB-INF/cas-servlet.xml(bean 定义),WEB-INF/login-webflow.xml(流程定义)两个文件,发现最终交给 org.jasig.cas.web.flow.AuthenticationExceptionHandler 这个类处理异常。通过阅读源代码知道会按照不同的Exception对应国际化文件中的key来显示到WEB-INF/view/jsp/default/ui/casLoginView.jsp上的。

通过,WEB-INF/view/jsp/default/ui/casLoginView.jsp文件中

<form:form method="post" id="fm1" commandName="${commandName}" htmlEscape="true">
    <form:errors path="*" id="msg" cssClass="errors" element="div" htmlEscape="false"/>
</form:form>

form:errors标签打印提示,该标签必须放在form:form中

 

 

标记

1.测试时使用的客户端版本是3.3.1,单点登出时会出现下面的问题,3.3.0版本也会有这个问题,应该会在3.4.0版本中解决,在这里有提到 https://issues.jasig.org/browse/CASC-223

java.lang.NullPointerException
	at org.jasig.cas.client.util.CommonUtils.safeGetParameter(CommonUtils.java:330)
	at org.jasig.cas.client.session.SingleSignOutHandler.isTokenRequest(SingleSignOutHandler.java:114)
	at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:66)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
... ...

 

(cas-client 3.3.3 中已解决)

 

 

2.另外一个单点登出的问题是,登陆时参数service,里面的ip或地址必须是单点登陆服务器可以访问的有效地址,比如localhost这种就不可以使用。

3.中文值的问题,除了修改casServiceValidationSuccess.jsp将<%@ page session="false" %>修改为<%@ page session="false" language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>外,也要考虑Servlet容器编码

比如开发时采用maven tomcat插件,配置如下

<plugin>
	<groupId>org.apache.tomcat.maven</groupId>
	<artifactId>tomcat7-maven-plugin</artifactId>
	<version>2.2</version>
	<configuration>
		<path>/${project.build.finalName}</path>
		<keystoreFile>${project.basedir}/src/main/resources/ca/mykeystore.keystore</keystoreFile>
		<keystorePass>123456</keystorePass>
		<httpsPort>443</httpsPort>
		<port>8081</port>
	</configuration>
</plugin>

 

实施时采用tomcat,需要修改/bin/catalina.bat文件,在下面第一行和第三行中间加入第二行,重点是-Dfile.encoding=UTF-8

rem ----- Execute The Requested Command --------------------------------------- 
set JAVA_OPTS=%JAVA_OPTS% -server -Dfile.encoding=UTF-8 -Xms512m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256m
echo Using CATALINA_BASE:   "%CATALINA_BASE%"  

 

 

 

分享到:
评论
4 楼 游其是你 2015-01-12  
好文章,看出博主对CAS4.0研究的的确很透彻。这篇文章指明了cas4.0自定义登陆验证的思想。
3 楼 游其是你 2015-01-04  
请问博主,cas默认的登陆链接是/login,如果我想修改这个链接(比如我想用/account/login来登陆)怎么实现呢?谢谢
2 楼 273601191 2014-12-26  
找到大牛了,可不可以给小弟传一份cas4.0配置的代码,跪谢了~~282583553@qq.com
1 楼 Lucas_Lee 2014-10-14  
楼主能发把4.0的代码发一份么,最近弄这个东西配置了半天没配置好,万分感谢,感恩戴德~~邮箱leezeping@foxmail.com

相关推荐

    cas-server4.0

    【标题】"cas-server4.0" 是一个关于CAS(Central Authentication Service)服务器的版本,主要涉及的是身份验证服务的4.0版本。CAS是一种开放源码的单点登录(Single Sign-On,SSO)系统,它允许用户通过单一的身份...

    CAS server4.0完全发布包,关闭了https,方便用于测试

    总的来说,CAS Server 4.0的完全发布包提供了一套完整的工具和资源,帮助开发者和管理员快速部署和测试CAS Server,理解其工作原理,以及如何与各种应用系统进行集成。在测试环境中关闭HTTPS简化了流程,但实际使用...

    cas-server-4.0版本

    CAS-server-4.0是CAS服务器的一个重要版本,提供了多项改进和新功能。 在【描述】中提到的“cas-server-4.0,版本,直接放到tomcat里面使用,内容已经换好”,意味着这个版本的CAS服务器已经准备就绪,可以直接部署...

    CAS Server 4.1二次开发说明文档.docx

    ### CAS Server 4.1 二次开发说明 #### 概述 CAS (Central Authentication Service) 是一项由耶鲁大学发起的开源项目,旨在为Web应用系统提供可靠且灵活的单点登录(Single Sign-On, SSO)解决方案。随着业务场景的...

    cas4.0 server的eclipse项目

    【标题】"CAS4.0 Server的Eclipse项目"是一个基于Java开发的身份验证服务系统,专为Web应用程序提供单点登录(Single Sign-On, SSO)解决方案。CAS,即Central Authentication Service,是一个开源项目,旨在简化...

    单点登录cas-server4.0+client

    单点登录cas-server4.0+client,把压缩包内的cas4放在tomcat-7.0.81安装目录的webapps文件夹下面,运行tomcat会自动安装服务端。客户端用的是官网ExampleWebSite,由于没有配置casproxy,已经把web.config的...

    CAS4.0单点登录

    CAS4.0是CAS的一个版本,它提供了更安全、更灵活的认证机制,支持多种协议,如CAS、SAML、OAuth等。在本文中,我们将深入探讨CAS4.0单点登录系统的工作原理、配置和实际应用。 一、CAS4.0单点登录系统工作原理 1. ...

    cas4.2.4、cas4.0war包

    在您提供的信息中,我们有两个版本的CAS服务器WAR包:cas-server-webapp-4.2.4-.war 和 cas-server-webapp-4.0.0.war。这两个文件是Java Web应用程序,可以部署在支持Servlet容器如Tomcat或Jetty上。 **CAS 4.2.4**...

    释锐CAS实战4.0

    释锐CAS实战4.0.pdf cas单点登录实现

    cas-server-webapp-4.0.0.war--cas server去掉https验证

    cas-server-webapp-4.0.0.war--cas server去掉https验证.下载后直接部署tomcat即可,建议下载后将名称改为cas.war

    CAS Server和Client 数据库方式(已配置好)

    CAS Server 4.0 , Client 3.3 ,共3个TOMCAT,已经配置完毕,下载后, 1 修改tomcat-caswebappscasWEB-INF/deployerConfigContext.xml 中的35、48行,数据的配置; 2 在表t_user 中加一行数据 口令:e10adc3949ba59...

    cas-server-4.0.0-release部署包

    本压缩包"cas-server-4.0.0-release"包含的是CAS Server 4.0.0版本的源码和部署文件,用于搭建和配置CAS服务器。 CAS Server 4.0.0是CAS的一个重要版本,它引入了许多改进和新特性。以下将详细阐述该版本的关键知识...

    cas-server-4.0.0-release与依赖包.zip

    "cas-server-4.0.0-release" 是CAS服务器的核心发布包,它包含了CAS服务器的所有源代码和编译后的可执行文件。这个版本的发布通常包括了以下内容: 1. **源码**:开发者可以深入理解CAS的工作原理,自定义配置或...

    cas-server-4.0.0-release.part2.rar

    cas-server4.0源码

    CAS4.0 自定义客服端登陆界面,客服端与服务端

    cas4.0版本的 单点登录 自定义页面。希望对你有用,最低资源分,辛苦分。有问题可以交流学习。谢谢

    cas单点登录4.0

    在你提供的资源中,"cas单点登录4.0"包含了CAS服务器的WAR包和4.0版本的源代码,这对于理解CAS的工作原理,以及自定义和扩展CAS功能来说非常有价值。 1. **CAS 4.0 概述** CAS 4.0是CAS项目的一个重要版本,它带来...

    CAS实战4.0

    【CAS实战4.0】是耶鲁大学推出的一套基于CAS(Central Authentication Service,中央认证服务)的开源单点登录(Single Sign-On, SSO)系统实战教程,旨在提供简单易懂的技术指导。该教程主要涵盖了如何在实际环境中...

Global site tag (gtag.js) - Google Analytics