CAS自定义拓展Credentials

本文介绍了在使用CAS时,如何针对需要验证码等额外信息的情况,自定义Credentials。通过继承UsernamePasswordCredentials或直接实现Credentials接口,实现了包含验证码验证的扩展功能。并展示了webflow配置的修改以及myViaFormAction的实现,以完成验证码的验证流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在使用CAS的时候,除了用户名、密码可能还需要验证码等其他信息,CAS一般使用的Credentials是org.jasig.cas.authentication.principal.UsernamePasswordCredentials,这里只包含有:

/** The username. */
@NotNull
@Size(min=1,message = "required.username")
private String username;

/** The password. */
@NotNull
@Size(min=1, message = "required.password")
private String password;

所以如果要包含有验证码等信息,需要自自定Credentials。Credentials是一个接口,我们的实现方式是继承UsernamePasswordCredentials,当然也可以直接实现Credentials接口,代码如下:

public class MyCredentials extends UsernamePasswordCredentials {
    private static final long serialVersionUID = -8343864967200862794L;

    /**
     * The authCode.
     */
    private String authCode;

    @Override
    public boolean equals(final Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        MyCredentials that = (MyCredentials) o;

        if (getPassword() != null ? !getPassword().equals(that.getPassword()) : that.getPassword() != null)
            return false;
        if (getUsername() != null ? !getUsername().equals(that.getUsername()) : that.getUsername() != null)
            return false;
        if (authCode != null ? !authCode.equals(that.authCode) : that.authCode != null) return false;

        return true;
    }

	@Override
	public int hashCode() {
	    int result = getUsername() != null ? getUsername().hashCode() : 0;
	    result = 31 * result + (getPassword() != null ? getPassword().hashCode() : 0);
	    result = 31 * result + (authCode != null ? authCode.hashCode() : 0);
	    return result;
	}
}

接下来就是修改webflow配置:

<!--credentials-->
<var name="credentials" class="com.…….cas.MyCredentials" />
……省略其他部分
<view-state id="viewLoginForm" view="casLoginView" model="credentials">
       <binder>
           <binding property="username" />
           <binding property="password" />
           <binding property="authCode" />
       </binder>
       <on-entry>
           <set name="viewScope.commandName" value="'credentials'" />
       </on-entry>
	<!--submit的时候去validateAuthCode-->
	<transition on="submit" bind="true" validate="true" to="validateAuthCode">
           <evaluate expression="myViaFormAction.doBind(flowRequestContext, flowScope.credentials)" />
       </transition>
</view-state>

……
<!-- 新添加的校验验证码 -->
<action-state id="validateAuthCode">
	<evaluate expression="myViaFormAction.validateAuthCode(flowRequestContext, flowScope.credential, messageContext)"/>
	<transition on="error" to="generateLoginTicket"/>
	<transition on="success" to="realSubmit"/>
</action-state>

这里只执行一个方法(myViaFormAction.validateAuthCode),如果执行成功则执行原来的realSubmit,在此就不在介绍。g

接下来,看下myViaFormAction是如何实现的:

public class MyViaFormAction extends AuthenticationViaFormAction {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyViaFormAction.class);

    /**
     * 校验动态码
     */
    public final String validateAuthCode(final RequestContext context, final Credentials credential, final MessageContext messageContext) {
        final HttpServletRequest request = WebUtils.getHttpServletRequest(context);
        String authCode = request.getParameter("authCode");
        String username = request.getParameter("username");
        //判空校验
        if (!StringUtils.hasText(username) || !StringUtils.hasText(authCode)) {
            messageContext.addMessage(new MessageBuilder().error().code("required.authCode").build());
            return "error";
        }
        try {
            		//验证逻辑……
                    return "success";
        } catch (Exception e) {
            messageContext.addMessage(new MessageBuilder().error().code("error.authentication.authCode.bad").build());
            return "error";
        }
        messageContext.addMessage(new MessageBuilder().error().code("error.authentication.authCode.bad").build());
        return "error";
    }
}

这样就完成了验证码验证的拓展功能!

关于webflow的配置详解,我们下一篇文章再做详述!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值