如何使用两个不同的表在Symfony2中进行身份验证

时间:2011-10-12 23:52:12

标签: symfony authentication

我在这个项目中有两张桌子。一个表用于存储所有管理员用户详细信息的站点管理员,另一个表用于存储客户端到站点的所有登录数据。

目前,我可以使用管理详细信息登录。但是,我现在正尝试使用客户端详细信息登录,但似乎无法正常工作。到目前为止,当用户点击链接时,它将转到/ clientarea / login。此页面加载正常。但是当我尝试登录时,我收到了一个错误。

我得到的错误是:

  

无法找到路径“/ clientarea / login_check”的控制器。也许您忘了在路由配置中添加匹配的路由?

在我的security.yml文件中,我有以下代码:(顺便说一句,我只使用明文进行开发,它会在上线时更改):

providers:
    admin_db:
        entity: { class: Shout\AdminBundle\Entity\User, property: username }
    client_db:
        entity: { class: Shout\AdminBundle\Entity\Userclients, property: username }

encoders:
    Shout\AdminBundle\Entity\User: 
        algorithm: plaintext 
    Shout\AdminBundle\Entity\Userclients: 
        algorithm: plaintext 

firewalls:
    secured_area:
        pattern: ^/
        anonymous: ~
        provider: admin_db
        form_login:
            check_path: /login_check
            login_path: /login
        logout:
            path:   /logout
            target: /index
    client_area:
        pattern: ^/
        anonymous: ~
        provider: client_db
        form_login:
            check_path: /clientarea/login_check
            login_path: /clientarea/login
        logout:
            path:   /clientarea/logout
            target: /index

access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin, roles: ROLE_ADMIN }
    - { path: ^/clientarea/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/clientarea, roles: ROLE_USER }

在我的routing.yml中,我有这段代码:

login:
    pattern:   /login
    defaults:  { _controller: ShoutAdminBundle:Security:login }

    login_check:
        pattern:   /login_check

    logout:
        pattern:   /logout

    clientlogin:
        pattern:   /clientarea/login
        defaults:  { _controller: ShoutAdminBundle:Security:clientlogin }

    clientlogin_check:
        pattern:   /clientarea/login_check

    clientlogout:
        pattern:   /clientarea/logout

这是控制器中的代码。 login和clientlogin函数的代码完全相同,唯一不同的是它们指向的twig文件:

$request = $this->getRequest();
$session = $request->getSession();

// get the login error if there is one
if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
    $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
} else {
    $error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
}

return $this->render('ShoutAdminBundle:Security:clientlogin.html.twig', array(
    // last username entered by the user
    'last_username' => $session->get(SecurityContext::LAST_USERNAME),
    'error'         => $error,
));

客户端登录表单的操作路径指向clientlogin_check。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

我设法让它工作,但是以一种非常基本的方式。由于截止日期我没有时间使登录页面看起来很漂亮。

但这是代码:

    client_area:
        pattern: ^/clientarea
        anonymous: ~
        provider: client_db
        http_basic:
            realm: "Secured Client Area"

基本上,您可以拥有多个表中的用户。但是,我仍然无法使用正确的登录表单使其工作。但是基本的HTTP登录框也适用于我正在做的事情。