离线下载
PDF版 ePub版

极客学院团队出品 · 更新于 2018-11-28 11:00:43

如何在安全,路由,服务和验证中使用表达式

在 Symfony2.4 中,一个强有力的 ExpressionLanguage 组件添加到 Symfony 中。这允许我们在配置中添加高度自定义的逻辑。

Symfony 框架有以下几种方式利用原装的表达式:

配置服务

路由匹配条件

检查安全(解释如下)并且获取 allow_if 的控件

验证

想要知道更多关于如何创建和使用表达式,参见表达式句法

安全:复杂的访问控件表达式

除了像 ROLE_ADMIN 一样的角色,isGranted 方法也接受 Expression 对象:

use Symfony\Component\ExpressionLanguage\Expression;
// ...

public function indexAction()
{
    $this->denyAccessUnlessGranted(new Expression(
        '"ROLE_ADMIN" in roles or (user and user.isSuperAdmin())'
    ));

    // ...
}

在这个例子中,如果当前用户有 ROLE_ADMIN,或者如果当前用户对象是 isSuperAdmin(),返回到 true,将被授予访问(注意:您的用户对象可能没有 isSuperAdmin 方法,该方法专为此例而发明的)。

这使用一个表达式,您可以学习更多的表达式语言句法,参见表达式句法

在表达式中,您可能访问到大部分变量:

user

用户对象(或者您未验证的时候字符串 anon

roles

用户所有的一组角色,包括来自角色等级但不包括 *ISAUTHENTICATED/** 属性(见以下的功能)。

object

对象(若任何)作为第二个参数传递给 isGranted

token

标识对象。

trust_resolver

AuthenticationTrustResolverInterface 对象:您可能使用会使用 **is_*** 的功能。

另外,您可以访问表达式里很多的功能:

is_authenticated

返回 true 如果用户通过“记住我”或者“完全”验证—例如,返回 true 如果用户“注册”。

is_anonymous

等同于使用 IS_AUTHENTICATED_ANONYMOUSLYisGranted 功能。

is_remember_me

相似但不等同于 IS_AUTHENTICATED_REMEMBERED,见下。

is_fully_authenticated

相似但不等同于 IS_AUTHENTICATED_FULLY,见下。

has_role

检查看是否用户有了所给的角色—等同于表达式 'ROLE_ADMIN' in roles

比起检查 IS_AUTHENTICATED_REMEMBEREDis_remember_me 是不同的。

is_remember_meis_authenticated_fully 功能对于使用 IS_AUTHENTICATED_REMEMBEREDIS_AUTHENTICATED_FULLYisGranted 功能是相似的—但是它们一样。以下体现了区别:

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 的行为,如果用户通过 cookie 验证,is_remember_me 的功能只是返回 true 并且如果用户在这个部分确实注册了(例如,完备的),is_fully_authenticated 只是返回 true。