13

我有一个管理面板,并为它定义了一个角色ROLE_ADMIN。在我的 security.yml 文件中,我使用了一种模式^/admin/*,因此 /admin 下的所有内容都需要ROLE_ADMIN. 现在在我的应用程序的前端,我需要检查用户角色以及角色是否ROLE_ADMIN呈现一个文件,否则呈现另一个文件。此 url 不属于 security.yml 中定义的模式。

那么如何在不属于 security.yml 中定义的模式的主页上检查用户是管理员还是普通用户?

4

5 回答 5

31

使用该模式在整个应用程序上启用防火墙^/,允许匿名访问并使用access_control限制访问:

security:
    firewalls:
        secured_area:
            pattern: ^/
            anonymous: ~

    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN }

正如@itsmequinn 建议的那样,使用isGranted()安全上下文的方法:

if ($this->get('security.context')->isGranted('ROLE_BRAND')) {
    // the user has the ROLE_BRAND role, so act accordingly
}

Symfony 2.6中,security.context已被拆分为两个独立的服务。因此,您需要使用该security.authorization_checker服务来解决问题:

if ($this->get('security.authorization_checker')->isGranted('ROLE_BRAND')) {
    // the user has the ROLE_BRAND role, so act accordingly
}
于 2012-09-06T06:36:23.580 回答
20

SecurityContext 将在Symfony 3.0

之前Symfony 2.6你会使用SecurityContext.
SecurityContext将被弃用,Symfony 3.0取而代之的是AuthorizationChecker.

Symfony 2.6+&Symfony 3.0使用AuthorizationChecker


Symfony 2.5(及以下)

if ($this->get('security.context')->isGranted('ROLE_ADMIN')) {
    # User is a ROLE_ADMIN
}

Symfony 2.6(及以上)

if ($this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
    # User is a ROLE_ADMIN
}

类似问题:如何检查用户是否在控制器内登录 Symfony2?

在此处阅读更多文档:AuthorizationChecker

于 2015-08-06T21:38:17.280 回答
5

您在页面的控制器中吗?如果是这样,请使用isGranted安全上下文的方法:Access Controls for Controllers

于 2012-09-05T18:54:25.003 回答
1

Symfony 4 及更高版本中,您应该使用如下代码,而不是使用 $this->get('security.authorization_checker') 之类的服务:

$hasAccess = $this->isGranted('ROLE_ADMIN');
$this->denyAccessUnlessGranted('ROLE_ADMIN');

Symfony 安全性

于 2019-02-17T12:25:46.153 回答
1

最简单的解决方案是注释。而不是这个:

    if ($this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
       # User is a ROLE_ADMIN
    }

..尝试使用这个:

/**
 * ...
 * @Security("has_role('ROLE_ADMIN')")
 */

.. 或者 :

/**
 * ...
 * @Security("is_granted('POST_ADD', post)")
 */
public function addAction(Post $post){...}

您可以在此处阅读有关安全注释的更多信息。注释是 Symfony 2 中的最佳实践 看这里享受!

于 2015-12-06T20:27:18.470 回答