检查已签名的用户在Symfony 2和3中是否具有特定角色

Symfony的安全系统功能强大, 可让你向用户添加角色。用户登录时, 他们会收到一组角色(例如ROLE_ADMIN), 这些角色可能存储在表(或内存)中的列上, 并在项目的security.yml文件中声明。
在视图中, 如果将twig用作首选模板引擎, 则可以使用以下代码检查会话是否具有所需角色。

{#    We will use the is_granted twig function, this will return a boolean according to the statement, to check a specific role use :#}{% if is_granted('ROLE_ADMIN') %}    Do something here{%endif%}

【检查已签名的用户在Symfony 2和3中是否具有特定角色】例如, 如果你想为所有用户(所有角色)创建一个登录和退出菜单, 则可以这样创建:
{% if is_granted("IS_AUTHENTICATED_REMEMBERED") %}  < a href="http://www.srcmini.com/{{ path('fos_user_security_logout') }}">           Sign out      < /a> {% else %}    < a href="http://www.srcmini.com/{{ path('fos_user_security_login') }}"> Sign in< /a> {% endif %}

为了检查控制器中的活动用户角色, 我们将使用isGranted方法, 该方法可以从Symfony的安全上下文中检索。使用以下代码检查php中的角色。
// If you are in a symfony controllerif ($this-> get('security.context')-> isGranted('ROLE_ADMIN')) {    // Execute some php code here}// Or if you are using a symfony extension (and you are injecting the container)//Note that you need to have a variable defined as the symfony container (for example in a symfony extension you send it as parameter)$container = someMethodThatRetrievesTheSymfonyContainer(); if($this-> container-> get('security.context')-> isGranted('ROLE_ADMIN')){    //Execute some php code}// If you just want to prevent that a user without a specific role enter to some area, you can use the latest shortcut in the controllers:$this-> denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page :( you are not admin');

如果用户未处于活动状态(已记录), 并且你需要从数据库中检查该用户是否具有特定角色, 则可以使用此功能来确定该角色。
该函数将用户的ID作为第一个参数, 将角色的名称作为第二个参数, 请记住你的用户结构可能不同, 并且你需要更改搜索方式, 例如, 按其他字段而不是按ID进行搜索。
/** * @string|int $id * @string $role */public function userHasRole($id , $role) {        // Entity manager    $em= $this-> getDoctrine()-> getManager()        $qb = $em-> createQueryBuilder();               $qb-> select('u')            -> from('userBundle:User', 'u') // Change this to the name of your bundle and the name of your mapped user Entity            -> where('u.id = :user')             -> andWhere('u.roles LIKE :roles')            -> setParameter('user', $id)            -> setParameter('roles', '%"' . $role . '"%');               $user = $qb-> getQuery()-> getResult();               if(count($user) > = 1){        return true;     }else{        return false;     }}// Then you can use it like :$devId = 123; if(userHasRole($devId, "ROLE_DEVELOPER")){ // Send mail to DEVELOPERS}

    推荐阅读