在安全访问控制中使用表达式
编辑该页面在安全访问控制中使用表达式
另请参阅
最好的解决方案来处理复杂的授权规则是使用投票系统。
除了安全角色ROLE_ADMIN
,isGranted ()
方法和# (IsGranted ())
属性也接受表达式对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
/ / src /控制器/ MyController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\ExpressionLanguage\表达式;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\安全\Http\属性\IsGranted;类MyController扩展AbstractController{# (IsGranted(新表达式(“is_granted (“ROLE_ADMIN”)或is_granted (“ROLE_MANAGER”))))公共函数显示():响应{/ /……}# (IsGranted(新表达式(“ROLE_ADMIN”role_names或(is_authenticated()和user.isSuperAdmin ())”)))公共函数编辑():响应{/ /……}}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27
/ / src /控制器/ MyController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\ExpressionLanguage\表达式;使用ob娱乐下载\组件\HttpFoundation\响应;类MyController扩展AbstractController{公共函数显示():响应{美元这- >denyAccessUnlessGranted (新表达式(“is_granted (“ROLE_ADMIN”)或is_granted (“ROLE_MANAGER”)”));/ /……}公共函数编辑():响应{美元这- >denyAccessUnlessGranted (新表达式(“ROLE_ADMIN”role_names或(is_authenticated()和user.isSuperAdmin ())”));/ /……}}
6.2
的# (IsGranted ())
属性是在Symfony 6.2中引入的。ob娱乐下载
在这个例子中,如果当前用户ROLE_ADMIN
如果当前用户对象的isSuperAdmin ()
方法返回真正的
,然后将被授予访问(注:可能没有一个用户对象isSuperAdmin ()
方法,该方法发明这个例子)。
安全必须使用任何有效的表达式表达式语言语法可以使用任何这些Symfony创建的变量:ob娱乐下载
-
用户
-
的一个实例用户界面当前用户或代表
零
如果你不进行身份验证。 -
role_names
-
数组与字符串表示的用户角色。这个数组包含任何角色授予间接地通过角色层次结构但是它不包括
IS_AUTHENTICATED_ *
属性(请参阅下面的函数)。 -
对象
-
的对象(如果有的话)作为第二个参数传递
isGranted ()
。 -
主题
-
它存储相同的值
对象
,所以他们是等价的。 -
令牌
- 令牌对象。
-
trust_resolver
-
的AuthenticationTrustResolverInterface对象:你可能会使用
is_ * ()
下面的函数来代替。
此外,您可以访问内有一定数量的函数表达式:
-
is_authenticated ()
-
返回
真正的
如果用户通过“记住我”或验证身份验证“充分”,即返回true,如果用户是“登录”。 -
is_remember_me ()
-
相似,但不等于
IS_AUTHENTICATED_REMEMBERED
,见下文。 -
is_fully_authenticated ()
-
如果用户已经等于检查
IS_AUTHENTICATED_FULLY
的角色。 -
is_granted ()
- 检查用户是否允许。有选择地接受第二个参数与对象权限检查。它相当于使用isGranted()方法从安全服务。
is_remember_me ()
是不同的检查IS_AUTHENTICATED_REMEMBERED
的is_remember_me ()
和is_fully_authenticated ()
函数是类似的使用IS_AUTHENTICATED_REMEMBERED
和IS_AUTHENTICATED_FULLY
与isGranted ()
功能——但它们不相同的。下面的控制器代码片段显示了不同:
1 2 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\ExpressionLanguage\表达式;使用ob娱乐下载\组件\安全\核心\授权\AuthorizationCheckerInterface;/ /……公共函数指数(AuthorizationCheckerInterface美元authorizationChecker):响应{美元access1=美元authorizationChecker- >isGranted (“IS_AUTHENTICATED_REMEMBERED”);美元access2=美元authorizationChecker- >isGranted (新表达式(“is_remember_me()或is_fully_authenticated ()”));}
在这里,access1美元
和access2美元
将相同的值。不同的行为IS_AUTHENTICATED_REMEMBERED
和IS_AUTHENTICATED_FULLY
,is_remember_me ()
函数只有返回true,如果通过一个记得我的饼干和用户身份验证is_fully_authenticated ()
只有返回true,如果用户已经登录在这个会话(即是成熟的)。
的情况下# (IsGranted ())
属性,也可以是一个对象表达式对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/ / src /控制器/ MyController.php名称空间应用程序\控制器;使用应用程序\实体\帖子;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\ExpressionLanguage\表达式;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\安全\Http\属性\IsGranted;类MyController扩展AbstractController{# [IsGranted (属性:新表达式(“用户= = =主题”),主题:新表达式(args(“文章”).getAuthor ()”),)公共函数指数(文章美元帖子):响应{/ /……}}
在这个例子中,我们获取文章的作者,把它作为话题。如果主题匹配当前用户,然后将被授予的访问。
这个问题也可能是一个数组,关键可以用作一个别名为一个表达式的结果:
1 2 3 4 5 6 7 8 9 10 11
# [IsGranted (属性:新表达式(“用户= = =主题(“作者”)和主体(“文章”).isPublished ()”),主题:(“作者”= >新表达式(args(“文章”).getAuthor ()”),“职位”),)公共函数指数(文章美元帖子):响应{/ /……}
在这里,访问将被授予如果作者匹配当前用户和帖子的发表()
方法返回真正的
。
您还可以使用当前请求的主题:
1 2 3 4 5 6 7 8
# [IsGranted (属性:“……”主题:新表达式(“请求”),)公共函数指数():响应{/ /……}
在主题的表达,你可以访问两个变量:
-
请求
- 的ob娱乐下载Symfony的请求对象代表了当前请求。
-
arg游戏
- 控制器参数的数组传递给控制器。