个性化阅读
专注于IT技术分析

检查已签名的用户在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%}

例如, 如果你想为所有用户(所有角色)创建一个登录和退出菜单, 则可以这样创建:

{% if is_granted("IS_AUTHENTICATED_REMEMBERED") %}
     <a href="{{ path('fos_user_security_logout') }}">
         Sign out
     </a>
{% else %}
     <a href="{{ path('fos_user_security_login') }}">Sign in</a>
{% endif %}

为了检查控制器中的活动用户角色, 我们将使用isGranted方法, 该方法可以从Symfony的安全上下文中检索。使用以下代码检查php中的角色。

// If you are in a symfony controller
if ($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
}
赞(0)
未经允许不得转载:srcmini » 检查已签名的用户在Symfony 2和3中是否具有特定角色

评论 抢沙发

评论前必须登录!