2015-02-09 44 views
2

大家好我是Symfony的新手,並且有一個簡單的問題。如何匹配網址與Symfony的安全訪問控制

security.yml文件我已經設置一些訪問控制路徑:

access_control: 
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: .*settings, roles: ROLE_USER } 
    - { path: ^/$, roles: ROLE_USER } 
    - { path: ^/.*, roles: ROLE_ADMIN } 

,到目前爲止,工程,我想。

現在我建立一個菜單,並希望根據其訪問隱藏顯示導航項目,所以我如何獲取這些信息?

必須有一些功能,如:

$securityContext->isUrlGranted($this->generateUrl('homepage')); 

感謝您的幫助。

編輯

例子:

// current user is ROLE_ADMIN: 
$acl->isUrlGranted('foo/bar'); // true 
$acl->isUrlGranted('login'); // true 

// IS_AUTHENTICATED_ANONYMOUSLY 
$acl->isUrlGranted('login'); // true 
$acl->isUrlGranted('something/else'); // false 

// ROLE_USER 
$acl->isUrlGranted('settings/profile'); // true 
$acl->isUrlGranted('foo/bar'); // false 

等。

+1

我想你可以看看這裏:http://stackoverflow.com/questions/25015763/symfony2-check-isgranted-for-a-route – chapay 2015-02-09 08:55:44

+1

@AndreySobkanyuk謝謝,這幾乎是我所搜索的,但我認爲這個解決方案對於這樣一個簡單的需求來說是一種矯枉過正的工作。Symfony這樣做的方式似乎是基於角色手動配置菜單,至於我認爲這是完全愚蠢的,因爲這樣你可以定義所有的東西兩次......但即時通訊因爲我沒有資源和時間來實施另一個ACL或擴展交互式集成。 – Mario 2015-02-09 10:51:51

+0

我想不幸的是這是唯一的解決方案。如果您願意,我可以將其作爲獨立答案發布。 – chapay 2015-02-09 11:15:38

回答

1

現在沒有簡單的方法在Symfony通過一個函數獲取此信息。

要獲取它,您可以使用security.access_map服務在您的應用程序中訪問security.access_control參數。

但是你不能直接從容器請求它,因爲它是一個私人服務,所以必須將它注入到另一個服務中。

只有這樣你才能夠用isUrlGranted()函數編寫自己的Twig擴展名。

P.S .:我的回答只是關於類似問題寫得很好的answer的簡短摘要。

0

,如果你在你的視圖中使用樹枝(應包含菜單),您可以測試與用戶角色:

{# my menu.twig.html #} 

    {% if app.security.isGranted('ROLE_ADMIN', app.user) %} 
     .... 
    {% endif %} 

你可以做sa順便說一句,我在你的控制器中,但我認爲你的佈局包含菜單,所以我發佈了樹枝答案。告訴我它是否對你有幫助。

+0

我在我的standard_layout菜單中使用這樣的東西:{%if display%} {%for admin in group.items if item_count == 0%} {%if admin.hasroute('列表')和管理員。isGranted( 'LIST')%} {%組ITEM_COUNT = ITEM_COUNT + 1%} {%ENDIF%} {%ENDFOR%} {%ENDIF%} – Matheno 2015-02-09 09:30:37

+0

它不是溶液即時搜索,我配置的作用已經在'security.yml'中找到一個使用在那裏配置的數據的解決方案。我不想兩次定義一切。 – Mario 2015-02-09 10:57:47

+0

您能告訴我們您在哪裏以及如何構建您的菜單嗎? – Med 2015-02-09 11:02:25