我的博客:www.while0.com
我的博客:www.shishangguan.net
公司需要cas可以登录的时候选择登录方式是用户名登录还是注册号登录,但cas的jdbc登录验证虽然号称有三种配置方式,但他们后台只能获取到两个字段分别是用户名和密码,至于用户名对应的字段名是在xml里边ioc注入的,而我们需要用前台传过来的值作为username的字段名。
参考资料:
- https://wiki.jasig.org/display/CASUM/Home
- http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/
- http://blog.csdn.net/sjbup/article/category/1122617
我的想法是照着jdbc验证模块的的SearchModeSearchDatabaseAuthenticationHandler开始,知道找到可以自己定义credentials类型的地方。
我发现一共需要新建5个文件,修改两个xml配置文件。原始文件是以下文件不加蓝色字体部分。
UsernamePasswordLogintypeCredentials 在这个文件里边添加需要添加的login字段并且设置相应的set方法,修改hashcode方法和equals方法
UsernamePasswordLogintypeCredentialsToPrincipalResolver 具体作用不明,照抄原来的改名字即可,deployerConfigContext.xml里边要用
AbstractJdbcUsernamePasswordLogintypeAuthenticationHandler 修改方法的参数
AbstractUsernamePasswordLogintypeAuthenticationHandler 修改某些方法的参数
LogintypeSearchModeSearchDatabaseAuthenticationHandler 主验证类,全部引用和继承我们的新文件
修改deployerConfigContext.xml和login-webflow.xml
在login-webflow.xml中查找 <var name="credentials" class="这里修改为LogintypeSearchModeSearchDatabaseAuthenticationHandler的完整路径" />,超找<view-state id="viewLoginForm" view="casLoginView" model="credentials">在他下面的binder中添加<binding property="logintype" />
修改deployerConfigContext.xml中
1 <bean id="authenticationManager" 2 class="org.jasig.cas.authentication.AuthenticationManagerImpl"> 3 <property name="credentialsToPrincipalResolvers"> 4 <list> 5 <!-- 此处修改为自定义CredentialsToPrincipalResolver实现 --> 6 <bean class="com.bettem.icbsnet.cas.web.authentication.UsernamePasswordLogintypeCredentialsToPrincipalResolver" > 7 <property name="attributeRepository" ref="attributeRepository" /> 8 </bean> 9 <bean 10 class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver" ></bean> 11 </list> 12 </property> 13 <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" 14 p:httpClient-ref="httpClient"/> 15 16 <!-- 此处修改为自定义AuthenticationHandler,并取消fieldUser注入,因为fieldUser改为用后台表单提交过来的loginType数据了 --> 17 <bean id="SearchModeSearchDatabaseAuthenticationHandler" 18 class="com.bettem.icbsnet.cas.web.authentication.LogintypeSearchModeSearchDatabaseAuthenticationHandler"> 19 <property name="tableUsers"> 20 <value>user_user</value> 21 </property> 22 <property name="fieldPassword"> 23 <value>userpwd</value> 24 </property> 25 <property name="dataSource" ref="dataSource" /> 26 <property name="passwordEncoder" ref="pe"/> 27 </bean> 28 </list> 29 </property> 30 </bean>