一.体系结构
1.须要注意的几个配置文件
WEB-INF/deployerConfigContext.xml,WEB-INF/login-webflow.xmlcss
2.AuthenticationManager
配置位置 deployerConfigContext.xmlhtml
主要涉及的方法是Authentication authenticate(final Credential... credentials),以及在authenticate方法中调用的AuthenticationBuilder authenticateInternal(final Credential... credentials)。java
身份认证管理器,经过指定认证凭证的认证处理程序来定义认证的安全策略。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) 方法开始。web
3.Credential
配置位置 login-webflow.xmlspring
由登录提交的信息封装成的认证凭证,主要须要定制的内容,注意修改时同时须要修改login-webflow 中 viewLoginForm 的 binder安全
4.AuthenticationHandler
配置位置 deployerConfigContext.xml服务器
主要涉及方法 String getName();session
boolean supports(Credential credential) 判断是否由该AuthenticationHandler处理app
HandlerResult authenticate(Credential credential) 传入封装好的jsp
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" />