自定义身份验证

Posted

技术标签:

【中文标题】自定义身份验证【英文标题】:Custom authentication 【发布时间】:2010-12-17 18:35:15 【问题描述】:

我的系统有 2 个子系统。每个子系统都有不同的用户集。每个用户都有一个额外的字段“SystemName”,可以用来知道这个用户属于哪个系统。

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

一般来说,检查比较简单:

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

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

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

提前致谢。

【问题讨论】:

【参考方案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()

【讨论】:

以上是关于自定义身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 自定义身份验证:用户登录但未通过身份验证

在 Jhipster 用户身份验证中添加自定义验证

自定义 Django Rest Framework 身份验证验证何时返回“无”

创建通过外部 API 进行身份验证的自定义身份验证提供程序?

WSO2 APIM 的自定义身份验证

如何使用 Windows 身份验证并注册自定义身份验证管理器