@Security & @IsGranted
在当前的 Symfony 应用中,不再建议使用此捆绑包。此捆绑包提供的所有注解现在都内置在 Symfony 中,作为 PHP 属性。查看 Symfony 属性的完整列表。
用法
@Security 和 @IsGranted 注解限制对控制器的访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
class PostController extends Controller
{
/**
* @IsGranted("ROLE_ADMIN")
*
* or use @Security for more flexibility:
*
* @Security("is_granted('ROLE_ADMIN') and is_granted('ROLE_FRIENDLY_USER')")
*/
public function index()
{
// ...
}
}
@IsGranted
@IsGranted() 注解是限制访问的最简单方法。使用它按角色限制,或者使用自定义投票器根据传递给控制器的变量来限制访问
1 2 3 4 5 6 7 8 9
/**
* @Route("/posts/{id}")
*
* @IsGranted("ROLE_ADMIN")
* @IsGranted("POST_SHOW", subject="post")
*/
public function show(Post $post)
{
}
每个 IsGranted() 都必须授予用户访问控制器的权限。
提示
@IsGranted("POST_SHOW", subject="post") 是使用自定义安全投票器的示例。有关更多详细信息,请参阅 安全投票器页面。
您还可以控制消息和状态码
1 2 3 4 5 6 7 8 9 10 11 12
/**
* Will throw a normal AccessDeniedException:
*
* @IsGranted("ROLE_ADMIN", message="No access! Get out!")
*
* Will throw an HttpException with a 404 status code:
*
* @IsGranted("ROLE_ADMIN", statusCode=404, message="Post not found")
*/
public function show(Post $post)
{
}
@Security
@Security 注解比 @IsGranted 更灵活:它允许您传递一个可以包含自定义逻辑的表达式
1 2 3 4 5 6 7
/**
* @Security("is_granted('ROLE_ADMIN') and is_granted('POST_SHOW', post)")
*/
public function show(Post $post)
{
// ...
}
表达式可以使用您可以在安全捆绑包配置的 access_control 部分中使用的所有函数,以及 is_granted() 函数。
表达式可以访问以下变量
token: 当前安全令牌;user: 当前用户对象;request: 请求实例;roles: 用户角色;- 以及所有请求属性。
您可以使用 statusCode 选项抛出 Symfony 异常,而不是 Symfony
1 2 3 4 5 6
/**
* @Security("is_granted('POST_SHOW', post)", statusCode=404)
*/
public function show(Post $post)
{
}
message 选项允许您自定义异常消息
1 2 3 4 5 6
/**
* @Security("is_granted('POST_SHOW', post)", statusCode=404, message="Resource not found.")
*/
public function show(Post $post)
{
}
提示
您还可以在控制器类上添加 @IsGranted 或 @Security 注解,以阻止访问该类中的所有操作。
此作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。