一.体系结构
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" />