博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cas server 4.0深度研究
阅读量:4048 次
发布时间:2019-05-25

本文共 6469 字,大约阅读时间需要 21 分钟。

一.体系结构

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不好修改.

 

 

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

在 文章中已经介绍过3.5如何进行订制,这里主要说一下4.0不一样的地方

 

1.deployerConfigContext.xml

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

上面说过可以不配置PrincipalResolver

  

 

  

2.AuthenticationHandler

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

 

@Overridepublic 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
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 credential外还要设置view-state id="viewLoginForm"中binder,与Credential中参数一一对应。 

 

 

 

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

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

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

  

${fn:escapeXml(assertion.primaryAuthentication.principal.id)}
${fn:escapeXml(attr.value)}

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" %>    
单点登录认证系统

非安全连接

您正在通过非安全连接访问单点登录系统。单点登录将无法正常工作。为了单点登录正常工作,你必须通过HTTPS登录。

请输入您的用户名和密码.

  

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: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插件,配置如下

org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
/${project.build.finalName}
${project.basedir}/src/main/resources/ca/mykeystore.keystore
123456
443
8081

 

实施时采用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=256mecho Using CATALINA_BASE:   "%CATALINA_BASE%"

 

 

 

转载地址:http://emyci.baihongyu.com/

你可能感兴趣的文章
技术栈
查看>>
Jenkins中shell-script执行报错sh: line 2: npm: command not found
查看>>
8.X版本的node打包时,gulp命令报错 require.extensions.hasownproperty
查看>>
Jenkins 启动命令
查看>>
Maven项目版本继承 – 我必须指定父版本?
查看>>
通过C++反射实现C++与任意脚本(lua、js等)的交互(二)
查看>>
利用清华镜像站解决pip超时问题
查看>>
微信小程序开发全线记录
查看>>
CCF 分蛋糕
查看>>
解决python2.7中UnicodeEncodeError
查看>>
小谈python 输出
查看>>
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
查看>>
python:如何将excel文件转化成CSV格式
查看>>
机器学习实战之决策树(一)
查看>>
机器学习实战之决策树二
查看>>
[LeetCode By Python]7 Reverse Integer
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>
[LeetCode By Python]122. Best Time to Buy and Sell Stock II
查看>>
[LeetCode By Python]125. Valid Palindrome
查看>>
[LeetCode By Python]136. Single Number
查看>>