如何在安全,路由,服务和验证中使用表达式
Symfony的自带了强力的表达式语言组件。它允许你在配置中添加高级自定义逻辑。
Symfony框架在以下方面很好地利用了表达式:
- 配置服务 ;
- 路由匹配条件 ;
- 安全检查(下文有解释)和使用allow_if进行访问控制 ;
- 验证。
创建³³关于使用状语从句:表达式的更多内容请参考表达式语法。
安全性:表达式使用复杂进行访问控制 ¶
接受除了ROLE_ADMIN
ROLE_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_ADMIN
ROLE_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
🎜🎜函数🎜🎜🎜🎜🎜仅当🎜🎜🎜🎜🎜用户通过了remember_me cookie认证时返回true,同时🎜🎜is_fully_authenticated
🎜🎜🎜仅当🎜🎜🎜🎜🎜用户在会话周期之内(比如是full-fedged)是成功登录的状态,才会返回真。🎜🎜🎜🎜🎜🎜🎜