如何拒绝访问Symfony 2中的所有页面

时间:2012-12-05 10:35:43

标签: symfony

我需要拒绝访问除了角色为ROLE_UNFILLED_USER的用户以外的所有页面。如何使用security.yml

中的access_control执行此操作

3 个答案:

答案 0 :(得分:0)

第一步是定义角色层次结构,其中ROLE_USER继承自ROLE_UNFILLED_USER

# app/config/security.yml

role_hierarchy:
    ROLE_USER:        ROLE_UNFILLED_USER   # <-- This is the crucial part
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_API_USER, ROLE_ADMIN]

现在您可以放置​​访问控制:

access_control:
    - { path: "^/user/worksheet", roles: ROLE_UNFILLED_USER }
    - { path: "^/bill", roles: ROLE_USER }
    - { path: "^/address_book", roles: ROLE_USER }
    - { path: "^/friendinvite", roles: ROLE_USER }
    - { path: "^/admin", roles: ROLE_ADMIN }
    #- { path: "^/", roles: IS_AUTHENTICATED_ANONYMOUSLY }

每当角色为ROLE_UNFILLED_USER的用户尝试访问^/user/worksheet以外的路由时,他们都会看到403(禁止访问)。如果添加其他路线,请确保正确订购; Symfony将使用它找到的第一个匹配路由,这意味着列表顶部应该有更具体的路由,底部的通用路由越多!

由于ROLE_USER扩展ROLE_UNFILLED_USER,具有该角色的用户可以访问所有页面(包括工作表)。

但是,您的方法有一个警告,当用户登录时,它们会自动重定向到指定的target_path或先前请求的路径。这意味着,如果您的用户登录,他们很可能会看到403页,并且会对他们无权访问的原因感到困惑。解决方案:创建自定义AuthenticationProvider(特别是查看Listener)。

答案 1 :(得分:0)

如果用户具有某个角色,您需要使用Login Listener并重定向用户。或者只是使用请求监听器。

答案 2 :(得分:0)

你需要这样的东西:

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, roles: ROLE_ADMIN }

在安全部分中的security.yaml文件。此设置允许您保护您网站的所有页面,除了一个(登录表单匹配&#34; /登录&#34;)