Symfony 2中存在两个不同的登录页面

3

我正在尝试找出如何拥有两个独立的登录页面:一个用于 .com 页面的默认登录,另一个用于特定用户,例如用于路由 /special

在一个SF2项目中是否容易实现?

更新:

我的防火墙配置如下(我正在使用fosub)

providers:
    custom:
        id: ib.user_provider
    fos_userbundle:
        id: fos_user.user_manager
    my_fos_facebook_provider:
        id: my.facebook.user

firewalls:
    special:
        pattern: ^/special
        form_login:
            provider: fos_userbundle
            login_path: /special/login
            check_path: /special/login_check
            use_referer: false
            default_target_path: /special
            success_handler: ib.login_handler
            provider: custom
    main:
        pattern: ^/.*
        form_login:
            provider: fos_userbundle
            login_path: /login
            check_path: /login_check
            use_referer: false
            default_target_path: /
            provider: custom
        fos_facebook:
            always_use_default_target_path: true
            app_url: "http://apps.facebook.com/%facebook_app_id%/"
            server_url: "http://aw.com/aw/web/app_dev.php/"
            login_path: /login
            check_path: /login_check/facebook
            default_target_path: /checkFB
            success_handler: facebook_auth_success_handler
            provider: my_fos_facebook_provider
        logout:
            #handlers: ["fos_facebook.logout_handler"]
            target: /
        anonymous:    ~  

在ib.login_handler中,我有以下内容:
public function onAuthenticationSuccess(Request $request,TokenInterface $token)
{
    if ($this->security->isGranted('ROLE_CATEGORIZER'))
    {
        $response = new RedirectResponse($this->router->generate('MyCoBundle_mailAdmin_index'));
    }


    return $response;
}

这个配置如果我访问mydomain.com/special,会出现以下错误:Fehler: Umleitungsfehler(英文为Error: Redirection error)。

更新:

在chrome中我得到了:找不到路由“GET /special/login”。

404 Not Found - NotFoundHttpException
1 linked Exception: ResourceNotFoundException »

我没有为登录路径设置特殊路由。我的目标只是让特定的用户仅能访问路径“/special”下的页面。
1个回答

8

这是可能的,你可以定义多个受保护区域 => 多个防火墙。

让我们看看这个app/config/security.yml配置文件,以了解如何实现:

firewalls:

    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false

    special_area:
        pattern:  ^/special
        anonymous: ~
        form_login:
            check_path: /special/login_check
            login_path: /special/login
        logout:
            path:   /special/logout
            target: /

    general_area:
        pattern:  ^
        anonymous: ~
        form_login:
            check_path: /login_check
            login_path: /login
        logout:
            path:   /logout
            target: /


access_control:
    - { path: ^/_internal, role: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }

    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/special/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }

请注意,special_area必须在general_area之前定义,因为general_area的模式匹配其他所有模式...

您需要在bundle routing.yml中添加以下内容:

_security_login_special:
    pattern:  /special/login
    defaults: { _controller: FOSUserBundle:Security:login }

_security_check_special:
    pattern:  /special/login_check

_security_logout_special:
    pattern:  /special/logout

您需要为general_area添加另一个角色,因此需要重写FOSUserManager并在用户加载时添加此补充角色... (更多信息请参见:https://github.com/FriendsOfSymfony/FOSUserBundle/blob/1.2.0/Resources/doc/user_manager.md


嗨,感谢你的帖子。不幸的是,当我尝试上述设置时出现了错误。也许我应该发布我的防火墙配置。 - ramo
所以,错误是因为您在路由配置中没有定义/special/login模式。您必须首先这样做。 - AlterPHP
然后,在access_control部分定义正确的访问权限。您必须为general_area定义一个ROLE(普通用户不会获得),以及一个ROLE_SPECIAL,只有特殊用户才能获得... - AlterPHP
请勿更改模式,只需在路由中声明路由即可(我已更新我的答案)。 - AlterPHP
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/10128/discussion-between-ramo-and-pece - ramo
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接