0

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

1.【访问欢迎页面(受保护页面)】

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

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

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

在说明书中有一篇关于“如何创建自定义身份验证提供程序”的文章,它正在谈论“如何为 WSSE 身份验证创建自定义身份验证提供程序”。

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

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

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

最好的问候,
丹妮

4

1 回答 1

3

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

编辑

假设您已经创建了自定义令牌和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));
} 

在此处检查实现。服务定义在这里

再次编辑:

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

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

#app/config/security.yml
firewalls:
    main:
        pattern: ^/
        form_login:
            provider: your_custom_provider
于 2012-05-09T11:44:29.947 回答