如何在Security, Routing, Services和Validation中使用表达式

3.4 版本
维护中的版本

Symfony自带了强力的 ExpressionLanguage 组件。它允许你在配置中添加高级自定义逻辑。

Symfony 框架在以下方面很好地利用了表达式:

关于创建和使用表达式的更多内容请参考 表达式语法

Security:使用表达式进行复杂访问控制 

除了接受 ROLE_ADMIN 这种角色之外, isGranted 也接受 Expression 对象:

1
2
3
4
5
6
7
8
9
10
11
use Symfony\Component\ExpressionLanguage\Expression;
// ...
 
public function indexAction()
{
    $this->denyAccessUnlessGranted(new Expression(
        '"ROLE_ADMIN" in roles or (user and user.isSuperAdmin())'
    ));
 
    // ...
}

本例中,如果当前用户有 ROLE_ADMIN 或者当前的user对象的 isSuperAdmin() 方法返回 true 那么访问将被授权 (注意:你的User对象未必拥有 isSuperAdmin 方法,这个方法只为此例出现)。

这就用到了一个表达式,你还可以学习更多关于expression languange的语法,参考 表达式语法

在表达式中,你可以访问以各种变量:

user
user对象 (或者是 anon,如果未经认证的话)。
roles
用户所拥有的roles数组,包括 role hierarchy(角色层级) 但是不包括 IS_AUTHENTICATED_* 属性(参考下面的功能)。
object
作为第二个参数传到 isGranted 方法的对象(如果有的话)。
token
token对象。
trust_resolver
AuthenticationTrustResolverInterface 接口,其对象是:你可能希望使用下面的 is_* 函数来替代。

另外,你可以在表达式中访问各种函数:

is_authenticated
返回 true,如果用户通过"remember-me"或是"fully"身份认证通过的话 - 比如,如果用户已登录,就返回true。
is_anonymous
等同于在 isGranted 函数中使用 IS_AUTHENTICATED_ANONYMOUSLY
is_remember_me
类似但不完全等同于 IS_AUTHENTICATED_REMEMBERED,见下文。
is_fully_authenticated
类似但不完全等同于 IS_AUTHENTICATED_FULLY,见下文。
has_role
查看一个用户是否拥有给定的ROLE - 等同于一个这样的表达式 'ROLE_ADMIN' in roles.

is_remember_me不同于检查

IS_AUTHENTICATED_REMEMBERED

is_remember_meis_authenticated_fully 函数与在 isGranted 函数中使用 IS_AUTHENTICATED_REMEMBEREDIS_AUTHENTICATED_FULLY是类似的 —— 但它们并相同。下例展示了其区别:

1
2
3
4
5
6
7
8
9
use Symfony\Component\ExpressionLanguage\Expression;
// ...
 
$ac = $this->get('security.authorization_checker');
$access1 = $ac->isGranted('IS_AUTHENTICATED_REMEMBERED');
 
$access2 = $ac->isGranted(new Expression(
    'is_remember_me() or is_fully_authenticated()'
));

在这里,$access1$access2 的值是相同的。不同于 IS_AUTHENTICATED_REMEMBEREDIS_AUTHENTICATED_FULLY 的行为,is_remember_me 函数仅当 用户通过了 remember_me cookie认证时返回true,同时 is_fully_authenticated 仅当 用户在session周期之内(比如是full-fledged)是成功登录的状态,才会返回true。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)