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


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

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

创建³³关于使用状语从句:表达式的更多内容请参考表达式语法

安全性:表达式使用复杂进行访问控制 

接受除了ROLE_ADMINROLE_ADMIN这种角色之外,isGranted也。接受Expression这种角色之外,isGranted

也。接受🎜🎜Expression🎜🎜🎜对象:🎜🎜🎜
use Symfony\Component\ExpressionLanguage\Expression;// ... public function indexAction(){
    $this->denyAccessUnlessGranted(new Expression(
        '"ROLE_ADMIN" in roles or (user and user.isSuperAdmin())'
    ));     // ...}

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

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

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

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

true那么访问将被授权(注意:你的用户对象未必拥有isSuperAdmin

🎜方法,这个方法只为此例出现)。🎜🎜
🎜🎜🎜🎜这就用到了一个表达式,你还可以学习更多关于表达languange的语法,参考🎜🎜🎜🎜表达式语法🎜🎜🎜🎜。🎜🎜🎜🎜🎜🎜在表达式中,你可以访问以各种变量:🎜🎜🎜
  • user🎜
  • 🎜🎜用户对象(或者是🎜🎜anon🎜🎜,如果未经认证的话)。🎜🎜🎜
  • roles🎜
  • 🎜🎜用户所拥有的角色数组,包括🎜🎜🎜🎜角色层级🎜🎜🎜🎜(角色层级)但是不包括🎜🎜IS_AUTHENTICATED_*🎜🎜属性(参考下面的功能)。🎜🎜🎜
  • object🎜
  • 🎜🎜第二作为个参数传到🎜🎜isGranted🎜🎜方法的对象(如果有的话)。🎜🎜🎜
  • token🎜
  • 🎜🎜令牌对象。🎜🎜🎜
  • trust_resolver🎜
  • AuthenticationTrustResolverInterface🎜🎜接口,其对象是:可能你希望使用下面的🎜🎜is_*🎜🎜函数来替代。🎜🎜🎜🎜🎜🎜🎜另外,你可以在表达式中访问各种函数:🎜🎜🎜
    • is_authenticated
    • is_authenticated
    • 返回true,如果用户通过“记住我”或“完全”身份认证通过的话 - 比如,如果用户已登录,就返回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_me状语从句:is_authenticated_fully函数与在isGranted函数中使用IS_AUTHENTICATED_REMEMBERED状语从句:IS_AUTHENTICATED_FULLY返回true,如果用户通过“记住我”或“完全”身份认证通过的话 - 比如,如果用户已登录,就返回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_me🎜🎜状语从句:🎜🎜is_authenticated_fully🎜🎜函数与在🎜🎜isGranted🎜🎜函数中使用🎜🎜IS_AUTHENTICATED_REMEMBERED🎜🎜状语从句:🎜🎜IS_AUTHENTICATED_FULLY🎜🎜的英文类似的-它们但并🎜🎜🎜🎜🎜不🎜🎜🎜🎜🎜相同下例展示了其区别:🎜🎜🎜

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$access1$access2的值是相同的。不同于IS_AUTHENTICATED_REMEMBEREDIS_AUTHENTICATED_FULLY的行为,is_remember_me函数仅当用户通过了remember_me cookie认证时返回true,同时is_fully_authenticated$access2的值是相同的。不同于IS_AUTHENTICATED_REMEMBERED
IS_AUTHENTICATED_FULLY

的行为,
is_remember_me🎜🎜函数🎜🎜🎜🎜🎜仅当🎜🎜🎜🎜🎜用户通过了remember_me cookie认证时返回true,同时🎜🎜is_fully_authenticated 🎜🎜🎜仅当🎜🎜🎜🎜🎜用户在会话周期之内(比如是full-fedged)是成功登录的状态,才会返回真。🎜🎜🎜🎜🎜🎜🎜