2012-12-05 26 views
1

访问所有网页,我需要为拒绝访问一个除外用户与角色ROLE_UNFILLED_USER所有页面。我怎样才能做到这一点使用ACCESS_CONTROL在security.yml如何否认Symfony的2

+0

你应该检查*安全* [http://symfony.com/doc/current/book/security.html]的文档。如果您试图实现的是拒绝匿名访问,即拒绝任何未登录的用户,则可以在防火墙定义中使用'anonymous:false'。也许你可以扩展为什么你需要额外的角色以及你的security.yml的外观?这样可以更容易地帮助您,看看您是否正在以“错误”的方式处理您的问题。 – dbrumann

+0

我需要谁不指定所有信息用户可以只查看一个网页 - /用户/工作表中他的角色是USER_UNFILLED_USER 其他用户(即指定的所有信息)可以查看除外/用户/工作表 这里所有的页面被我安全的一部分.yml

 security: true anonymous: ~ access_control: - { path: ^/admin, roles: ROLE_ADMIN} - { path: ^/bill, roles: ROLE_USER} - { path: ^/address_book, role: ROLE_USER } - { path: ^/friendinvite, role: ROLE_USER } - { path: ^/user/worksheet, role: ROLE_UNFILLED_USER } - { path: /.*, role: IS_AUTHENTICATED_ANONYMOUSLY } 
Ofer

回答

0

的第一步是定义一个角色层次结构,其中从ROLE_UNFILLED_USERROLE_USER继承:

# app/config/security.yml 

role_hierarchy: 
    RULE_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)。

+0

这不完全是需要的。匿名用户可以查看一些页面和具有角色的用户ROLE_USER可以查看除/ user /工作表之外的所有页面 – Ofer

+0

@Ofer我使用您提供的路由修复了我的答案。 – dbrumann

+0

这个配置没有预期的效果 - 我可以在ROLE_UNFILLED_USER下查看任何页面(如果它没有关闭/ admin或/ bill)。我会尽力扩大。匿名用户可以查看所有不直接关闭的页面。 ROLE_USER可以查看除/ user/worksheet之外的所有页面。 ROLE_UNFILLED_USER只能查看/用户/工作表 – Ofer

0

你需要使用一个登录监听器,并重定向用户,如果他有一定的作用。或者可能只是使用请求侦听器。