使用AbstractAuthenticationListener实现自定义身份验证提供程序

时间:2012-05-09 08:51:48

标签: security symfony symfony-forms

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

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

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

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

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

在食谱中有一篇关于“How to create a custom Authentication Provider”的文章,它正在讨论“如何为WSSE身份验证创建自定义身份验证提供程序。”

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

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

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

最诚挚的问候,
达尼

1 个答案:

答案 0 :(得分:3)

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

修改

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

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提供程序。 e.g

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