2016-08-23 69 views
1

我遵循的Silex機制的文檔部分http://silex.sensiolabs.org/doc/providers/security.html#defining-access-rulesSilex的定義訪問規則

這裏是我的confirguration

'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' ] 
] 

所以我需要的是很簡單,匿名用戶可以訪問任何地方(除/帳號/ *和/ admin/*路徑),具有「ROLE_USER」的用戶可以訪問某處和/ account/*路徑,但不能訪問/ admin/*路徑,並且具有「ROLE_ADMIN」的用戶可以隨處訪問。

我做一個很基本的控制器來測試,如果用戶被重定向,如果他不是一個「ROLE_ADMIN」:

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

    return 1; 
})->bind('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). 

回答

1

絕對的規則的順序是非常重要的,只有一個會匹配。 Silex會從頂部開始查找每一個,並在找到與URL匹配的一個security.access_rules條目時立即停止,換句話說,Silex將根據使用的URI和匹配的第一條規則決定使用哪個security.access_rules。所以你需要移動第一條規則來解決這個問題:

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

確實,謝謝@Yonel – Macbernie