如何在Security, Routing, Services和Validation中使用表达式
Symfony自带了强力的 ExpressionLanguage 组件。它允许你在配置中添加高级自定义逻辑。
Symfony 框架在以下方面很好地利用了表达式:
- 配置服务;
- 路由匹配条件;
- 安全检查 (下文有解释) 和 使用allow_if进行访问控制;
- 验证。
关于创建和使用表达式的更多内容请参考 表达式语法。
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.