【问题标题】:Implementing Custom Authentication Provider using AbstractAuthenticationListener使用 AbstractAuthenticationListener 实现自定义身份验证提供程序
【发布时间】:2012-05-09 08:51:47
【问题描述】:

我正在研究 Symfon2 并且我已经阅读了文档,我偶然发现了一个属于“安全”部分的问题。 我需要一个由我制作的自定义身份验证提供程序,它可以在会话中保留令牌,以便我可以在后续请求中获取它,如果用户没有提供正确的凭据,它会将他重定向到登录表单,如果他提供一个正确的凭据,他将被重定向到另一个页面。

1。 [访问欢迎页面(受保护页面)]

用户 ---------------------------------- ---------> [用户重定向到登录表单页面] ----> [用户提供错误凭据] -----> [用户返回登录表单页面]

2。 [访问欢迎页面(受保护页面)]
用户------------------------------------------------ -------> [用户重定向到登录表单页面] ----> [用户提供正确的凭据] -------> [用户访问欢迎页面]

我希望自定义身份验证提供程序制作一些东西(使用 ldap、db ...等验证用户),然后提供一个令牌并将其保存到安全上下文中,并记住我的登录表单重定向工作正常(如果用户凭据错误,则用户将被重定向到登录表单页面,如果他们正确,他将被重定向到欢迎页面。

cookbook 中有一篇关于“How to create a custom Authentication Provider”的文章,讲的是“如何为 WSSE 身份验证创建自定义身份验证提供程序”。

文章后面写了一个注释: 上面没有使用的一个类,AbstractAuthenticationListener 类,是一个非常有用的基类,它为安全扩展提供了常用的功能。这包括在会话中维护令牌、提供成功/失败处理程序、登录表单 url 等等。由于 WSSE 不需要维护身份验证会话或登录表单,因此本示例不会使用它。

在食谱中提到的示例中,使用了 ListenerInterface,但它不能用于登录表单页面。

如果有人解决了这个问题,我将非常感谢得到解决方案。

最好的问候,
丹妮

【问题讨论】:

    标签: security symfony symfony-forms


    【解决方案1】:

    我认为如果您想从数据库以外的来源验证用户,则无需创建自定义身份验证提供程序。您可以创建自定义用户提供程序并在防火墙中设置该提供程序。检查this 食谱条目。

    编辑

    假设您已创建自定义令牌和支持令牌的自定义 AuthenticationProviderInterface 和自定义用户提供程序,请创建一个实现 AbstractAuthenticationListener 类的类并实现 attemptAuthentication 方法。例如

    protected function attemptAuthentication(Request $request)
    {
        $param = trim($request->get('parameter', null, true));// auth parameters
    
        // other processing
        // authenticate method ultimatly calls your custom auth provider that supports your custom token. 
        return $this->authenticationManager->authenticate(new YourCustomToken($username, $password, $this->providerKey));
    } 
    

    检查实现here。服务定义为here

    再次编辑:

    有两个东西,用户提供者和身份验证提供者。用户提供程序根据用户对象的唯一字段(在本例中为用户名)从数据源加载用户对象。唯一字段可以是电子邮件或唯一令牌。另一方面,身份验证提供程序使用给定的凭据进行身份验证,并在经过身份验证后返回适当的令牌。所以它首先从源加载用户对象,在你的例子中是 ldap。然后使用用户输入的密码检查该对象的密码。希望能消除您的困惑。

    是的,您可以使用防火墙设置您的 ldap 提供程序。例如

    #app/config/security.yml
    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: your_custom_provider
    

    【讨论】:

    • 感谢 m2mdas 的回复,但如果凭据正确,我需要将我的特殊令牌添加到安全上下文中,凭据不必是用户名/密码,可能是特殊数字,或者服务器、用户、通行证...等的组合
    • 顺便提一下,为什么我不能只使用用户提供程序,因为我必须实现具有 loadUserByUsername($username) 的“UserProviderInterface”,但这只会给我用户名,如果在我的情况用户需要提供 ldap 凭据用户名/密码,假设我没有使用数据库验证用户/密码,然后使用 symfony.com/doc/current/cookbook/security/custom_provider.html 中的解决方案,因为我需要用户/密码,所以我可以使用 php 中的 ldap 函数验证用户是否存在,如果他/她存在,那么我可以返回一个有效的令牌。
    • 我会尝试你在这里提到的,如果这解决了我的问题,我会通知你,谢谢
    • 非常感谢 m2mdas,我按照您提供的链接中的代码进行操作,一切似乎都运行良好,非常感谢。
    猜你喜欢
    • 2012-04-05
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2014-09-28
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    相关资源
    最近更新 更多