0

问题:我想在我的 Symfony2 网站中创建一个管理部件,该部件仅供具有 ROLE_ADMIN 的用户使用

我不知道我是否应该创建一个新的防火墙或使用访问控制。我尝试将两者一起做,但所有用户仍然可以访问管理部分。

目前所有网站都在安全区域防火墙下,我希望匿名访问的页面通过访问控制被释放。

这是我的security.yml

security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext
        FOS\UserBundle\Model\UserInterface: sha512

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email
        my_facebook_provider:
            id: my_user.facebook_provider 

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

        login:
            pattern:  ^/login$
            security: false
            context: login

        admin:
            pattern: /admin/
            form_login:
                provider: fos_userbundle
                check_path: /login_check
                login_path: /login
            anonymous: ~

        secured_area:
             pattern: ^/
            anonymous: ~
            form_login:
                 login_path: /login
                check_path: /login_check
                default_target_path: tk_group_homepage
                provider: fos_userbundle
                remember_me: true
                csrf_provider: form.csrf_provider
            remember_me:
                key: %secret%
                lifetime: 31536000 # 365 days in seconds
            fos_facebook:
                app_url: "%api_facebook_name%"
                server_url: "%api_facebook_server%"
                check_path: /login_facebook_check   
                default_target_path: tk_user_homepage
                provider: my_facebook_provider
            logout:
                path:   fos_user_security_logout
                target: fos_user_security_login
                invalidate_session: false
            context: login

    access_control:
        - { path: ^/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/new, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/invitation, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/(subscribe|about|blog|press|contact), role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, role: IS_AUTHENTICATED_REMEMBERED }
        - { path: ^/admin/, role: ROLE_ADMIN }

我也在考虑检查控制器是否用户具有管理员角色,如果没有则抛出异常,因为我的管理部分目前只有一页。但我不知道这是否是最佳实践,如果我想扩展我的管理部分,这可能是个问题。

而且我不想创建一个新的用户提供者,因为我们只有 2 个管理员。

非常感谢,朱尔斯

4

2 回答 2

2

您应该删除admin防火墙并依靠access_control; 如果您在/admin/URL 下有管理员登录表单,您当然在登录之前无法看到它,因此您应该使用该/login表单以管理员身份登录,或者修改您的 access_control:

   - { path: ^/admin/login/, role: IS_AUTHENTICATED_ANONYMOUSLY }
   - { path: ^/admin/, role: ROLE_ADMIN }

这是官方文档关于您的情况的说明:

  1. 多个防火墙不共享安全上下文 如果您使用多个防火墙并且您针对一个防火墙进行身份验证,您将不会自动针对任何其他防火墙进行身份验证。不同的防火墙就像不同的安全系统。为此,您必须为不同的防火墙明确指定相同的防火墙上下文。但通常对于大多数应用程序来说,拥有一个主防火墙就足够了。

http://symfony.com/doc/current/book/security.html#book-security-common-pitfalls

你应该阅读整个Common pitfalls部分

如果您真的想使用不同的防火墙,只需按照文档所述进行操作,并在它们之间共享相同的防火墙上下文。这也在文档中进行了描述:http: //symfony.com/doc/current/reference/configuration/security.html#reference-security-firewall-context

这是一个简单的例子:

    admin:
        (... other options ...)
        context: my_security_context

    secured_area:
        context: my_security_context
        (... other options ...)
于 2013-09-29T19:11:14.793 回答
0

访问控制查找第一个匹配项

正因为如此,你需要把这一行:

- { path: ^/admin/, role: ROLE_ADMIN }

在此行之前:

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

如果你不这样做,/admin/whatever 匹配路径^/$并且不需要 ROLE_ADMIN。

于 2014-09-30T14:50:59.077 回答