1

我需要拒绝具有角色 ROLE_UNFILLED_USER 的用户访问除一个页面之外的所有页面。如何使用 security.yml 中的 access_control 执行此操作

4

3 回答 3

1

第一步是定义角色层次结构,其中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_USERextends ROLE_UNFILLED_USER,具有该角色的用户可以访问所有页面(包括工作表)。

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

于 2012-12-05T13:00:14.840 回答
0

如果用户具有特定角色,您需要使用登录侦听器并重定向用户。或者也许只是使用请求侦听器。

于 2015-11-17T12:52:23.197 回答
0

你需要这样的东西:

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

在您的 security.yaml 文件的安全部分。此设置允许您保护站点的所有页面,除了一个(登录表单匹配“/login”)

于 2018-04-18T13:22:04.293 回答