Silex 定义访问规则

Silex Defining Access Rules

我关注 Silex 文档部分 http://silex.sensiolabs.org/doc/providers/security.html#defining-access-rules

这是我的配置

'security.role_hierarchy' => [
    'ROLE_ADMIN' => [
        'ROLE_USER',
    ],
    'ROLE_SUPER_ADMIN' => [
        'ROLE_USER',
        'ROLE_ADMIN',
        'ROLE_ALLOWED_TO_SWITCH'
    ]
],
'security.access_rules' => [
    [ '^.*$', 'IS_AUTHENTICATED_ANONYMOUSLY' ],
    [ '^/account', 'ROLE_USER' ],
    [ '^/admin', 'ROLE_ADMIN' ]
]

所以我需要的很简单,一个匿名用户可以访问任何地方(除了 /account/* 和 /admin/* 路径),一个 "ROLE_USER" 的用户可以访问任何地方和 /account/*路径,但不是 /admin/* 路径,具有 "ROLE_ADMIN" 的用户可以访问任何地方。

我制作了一个非常基本的控制器来测试用户是否被重定向,如果他不是 "ROLE_ADMIN":

$app->get('/admin', function () use ($app) {

    return 1;
})->bind('admin');

但完全没有。他可以访问 /admin,页面上印有“1”...

根据文档:

With the above configuration, users must have the ROLE_ADMIN to access the /admin section of the website [...] (if that's not the case, the user will be automatically redirected).

当然规则的顺序很重要,只会匹配一个。 Silex 会从顶部开始查看每个条目,并在找到与 URL 匹配的 security.access_rules 条目后立即停止,换句话说,Silex 将根据 security.access_rules 来决定使用哪个条目使用 URI 和第一个匹配的规则。所以你需要把第一条规则移到结束来解决这个问题:

'security.access_rules' => [
    [ '^/account', 'ROLE_USER' ],
    [ '^/admin', 'ROLE_ADMIN' ],
    [ '^.*$', 'IS_AUTHENTICATED_ANONYMOUSLY' ],
]