自定义验证

时间:2009-11-18 07:31:40

标签: security authentication grails spring-security

我的系统有2个子系统。每个子系统都有不同的用户组。每个用户都有一个额外的字段“SystemName”,可用于了解该用户所属的系统。

在登录表单(每个子系统的1个表单)中,我添加了一个隐藏字段,指定表单的类型(包含SystemName值)。

一般来说,检查很简单:

if (user.systemName == params.systemName) {
    proceed with regular login
} else {
    throw standard login error
}

我尝试将该检查放到我的自定义DaoAuthenticationProvider中,但它无法访问“params.systemName”。

我在哪里放置该代码以使Acegi通过此检查对我的用户进行身份验证?

提前致谢。

1 个答案:

答案 0 :(得分:1)

这就是我用Java做的。扩展 WebAuthenticationDetails

import javax.servlet.http.HttpServletRequest;
import org.acegisecurity.ui.WebAuthenticationDetails;

public class SystemNameWebAuthenticationDetails extends WebAuthenticationDetails {

    public SystemNameWebAuthenticationDetails() {
        super();
    }

    public SystemNameWebAuthenticationDetails(HttpServletRequest request) {
        super(request);
        this.systemName = request.getParameter("systemName");
    }

    public String getSystemName() {
        return systemName;
    }

    private String systemName;
}

在身份验证过滤器中设置:

<bean id="authenticationProcessingFilter"
      class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
      ...
      <property name="authenticationDetailsSource">
        <bean class="org.acegisecurity.ui.AuthenticationDetailsSourceImpl">
            <property name="clazz" value="SystemNameWebAuthenticationDetails"/>
        </bean>
      </property>
</bean>

稍后您可以在身份验证过程中访问该属性,询问身份验证对象的详细信息。或者这样做:

SecurityContextHolder.getContext().getAuthentication().getDetails()