为CAS server添加Change Password和Forget Password功能

     最近一直在忙CAS相关的项目,team里的兄弟已经配置好了CAS server,并作了一些编程和定制,添加了一个security code在登录页面,以及到ldap server/db验证用户的功能,但发现用初始密码登录后没有强制修改密码的功能,以及忘记密码后,根据密码问题自动重置密码的功能也没有。经过权衡,我觉得还是把Change/Forget password放到CAS中比较合理。于是着手改动CAS的source code。

     CAS我们采用的是3.3.3版的,其中用到了spring mvc2.5以及spring webflow1.0。理解spring mvc/webflow是这次改动的关键。粗粗来说,spring webflow的主要意思是用xml文件控制网页的流向,页面值传递靠一个Bean,比较单纯的get/set值,由FormAction负责进行页面值到这个bean的绑定,提交后的处理方法可以放在FormAction或者其他业务Bean中。

     下面就遇到的问题及解决方法简单叙述一下:

     1. 添加Change Password的功能,等于是在普通验证过程中插入一个分支流程,判断如果是初始化密码的话,就要进入强制修改密码的流程,完成后返回主流程。这就决定了可以利用原有的FormAction以及Bean,添加相应的字段,和方法到Bean和FormAction中。

     这里遇到一个问题,就是VO Bean的传递和使用,由于不熟悉spring webflow,看了很多例子,有的是使用ongl表达式在配置文件中,取出VO bean,然后再作为方法参数传递给业务逻辑。

     这在一般的业务需求中是没有问题的,但CAS的需求比较特殊,原有的流程是被暂停而不是执行结束,分支流程执行完之后,还要继续执行原流程。这就意味着,原有主流程里面用到的上下文参数和方法都需要继续使用,如果跳转到另外一个业务逻辑中的话,原有的上下文都无法取得。

     解决方法,在反复查看了CAS所带例子的AuthenticationFormAction之后,我发现,这个FormAction虽然用到CAS自己定义的centralAuthenticationService,但仍然是一个普通的FormAction,对于public final Event submit(final RequestContext context) throws Exception,也只是一个自己定义的方法,其父类FormAction里面,并不含有此方法。这也就意味着,我也可以自己添加自己的方法,方法的参数就是RequestContext,这一点很重要,这解决了上述问题,从context里面拿到VO bean,(这里是credentials)处理后,继续调用centralAuthenticationService,进行主流程。

 

     2. Forget Password是否和Change Password一样,继续利用原有的FormAction?

     这个问题很简单,这是一个独立的流程,和CAS中的logout等流程一样,有自己的应用名称,这里我用了/password?作为名称。单独写好VO Bean以及FormAction,很快解决问题。(由于惯性,解决第一个问题后,还想继续用原有的FormAction,结果弄来弄去很别扭。)

 

     3. Validator的使用,按照说明,写好一个Validator,然后配置到FormAction,当提交时调用BindAndValidate或者Validate,就会调用验证方法。但如果像问题1,2那样的话,一个流程有多个view,每次输入应该有对应的验证,问题是第一步输入的验证,肯定没有第二步的内容,而如果延迟到最后一步再验证,用户还要倒回到前面的页面重新输入,这也不合理。只有是每一步都验证一下,立刻返回结果才合理,这样多个validate方法怎么配置?

     在Validator中按需要写入多个验证方法,参数和标准的一致,(final Object o, final Errors errors),这里的object其实就是VO bean。每一步调用时,明确其方法名,配置如下:<attribute name="validatorMethod" value="validateMyOwnMethod"/>。这里CAS还有个特殊的地方,按照上述配置,在问题2中运行顺利,但在问题1中一直报错,nullpointexception。经过debug,发现每次要调用自己的validate方法时,validateMethodInvoker总是null。原来FormAction中的initialAction初始化这个变量,而在CAS中,initialAction被重写了,但没有调用其父类FormAction的initialAction,这样才会导致这个问题,补上super.initialAction(),问题解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值