2012-01-31 14 views
15

나뭇 가지의 현재 사용자가 아닌 사용자에게 권한이 부여되는지 어떻게 알 수 있습니까?로그인하지 않은 사용자의 ROLE 가져 오기 Symfony2

{% if is_granted('ROLE_USER') %} 
    <a href="...">Delete</a> 
{% endif %} 

하지만 난 그 순간에 로그인하지 ohter 사용자와 같은 일을 할 수 있도록하고 싶습니다 :

나는 현재 사용자에 대한이 코드를 사용합니다. 감사합니다.

편집 : 사실 나는 나뭇 가지가 인증되지 않은 사용자의 역할을 테스트하는 직접적인 방법이 없다고 생각합니다. 그래서 나뭇 가지 템플릿에서 직접했는데, 사용자가 admin인지 아닌지를 테스트 한 다음 var를 설정합니다. 는 (내 질문에 내가 사용자의 목록에서 수행하는 방법을 찾고 있었다.)

{% set from_user_is_admin = false %} 
{% for role in from_user.getRoles() %} 
    {% if role == 'ROLE_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
    {% if role == 'ROLE_SUPER_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
{% endfor %} 
{% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %} 

답변

15

난 당신이 사용자 개체에 isGranted 기능을 구현하는 경우가 훨씬 쉬울 것이라고 생각 :

Class User implements UserInterface { 
    ... 
    public function isGranted($role) 
    { 
     return in_array($role, $this->getRoles()); 
    } 
} 

은 이제 쉽게 응용 프로그램의 모든 레이어에 부여 된 역할을 확인할 수 있습니다.

$user->isGranted("USER_ADMIN") 

또는 나뭇 가지에 : 현재 사용자의 역할을 확인해야하는 경우

user.granted("USER_ADMIN") 

, 당신이 나뭇 가지에이 작업을 수행 할 수 있습니다

app.user.granted("USER_ADMIN") 

참고 PHP에서 : 변수 "app"는 전역 적으로 정의됩니다.

참고 2 :이 코드는 app.user가 NULL 일 수 있으므로 앱의 보안 영역 외부에서 사용하는 경우 예외가 발생할 수 있습니다.

+0

예! 이것은 심포니 2 학습을 몇 달 동안 해낸 것입니다. – Rmannn

+12

역할 상속이 있으므로이 기능이 작동하지 않을 수도 있습니다 – nick4fake

+2

http://stackoverflow.com/a/24323223/877323 참조하십시오. '상속 역할'뿐만 아니라 역할 상속을 처리해야 할 경우 –

9

당신은 "없다"로 위의 유사한 문을 사용할 수 있습니다 :

{% if not is_granted('ROLE_USER') %} 
    <a href="...">Delete</a> 
{% endif %} 

또는 다른 문을 사용 :

{% if is_granted('ROLE_USER') %} 
    <a href="...">Delete</a> 
{% else %} 
    {# something else for guest user, not logged in #} 
{% endif %} 
+3

을 사용할 수 있습니다

{% set is_admin = false %} {% if app.security.token.user.roles is iterable %} {% for role in app.security.token.user.roles %} {% if role == 'ROLE_ADMIN' or role == 'ROLE_SUPER_ADMIN' %} {% set is_admin = true %} {% endif %} {% endfor %} {% endif %} 

을 layout.html.twig에 글로벌 나뭇 가지 파일이 조각을 가지고, 이런 식으로했다 , is_granted는 현재 사용자를 테스트하는 것입니다. 내가 알고 싶은 것은 현재 사용자가 아닌 사용자 객체와 같은 일을하는 것입니다. 내가 한 것처럼 내 질문을 편집합니다. 어쨌든 고마워. – Rmannn

+3

@Lenda 질문을 읽지 못했습니다 – Nanocom

+0

+1 * 우수 * 구현! – mate64

4

당신은 나뭇 가지 macro, 또는 나뭇 가지 기능 중 하나를 만들어야합니다.

{% macro admin_status(from_user) %} 
    {% set from_user_is_admin = false %} 
    {% for role in from_user.getRoles() %} 
     {% if role == 'ROLE_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
     {% if role == 'ROLE_SUPER_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
    {% endfor %} 
    {% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %} 
{% endmacro %} 

그런 다음 {% _self.admin_status(user) %}와 같은 파일에 사용할 수 있습니다하십시오 macro 만들기

은 당신의 코드를 사용하여, 매우 간단합니다. 별도의 파일로 이동하고 나뭇 가지의 import 태그를 사용하여 액세스 할 수도 있습니다.

나뭇 가지 기능을 만드는 것이 더 좋습니다. 자세한 내용은 extending twig을 참조하십시오. 그것은 나뭇 가지에서 호출 할 수있는 일반 함수를 만드는 요약된다, 그래서 같은 코드가 가능하게된다 :

{% if user_is_admin(user) %} 

또한 enabling custom twig extensions를 읽을해야합니다.

+0

WOw, 대단히 감사합니다. 나뭇 가지에이 코드를 넣고 포함시킨 다음 코드를 다시 사용할 수 있습니다! – Rmannn

0

나는 내 경우 다음 내가 네 그 연료 소모량을 알고 어디

{% if is_admin %}....{% endif %} 
관련 문제