KU案例2之07拒绝访问:AccessDeniedException

让我们的用户再次登录并访问/new。他有ROLE_USER角色,我们允许他进入。现在我们改变Security.yml里的access_control里面的角色为ROLE_ADMIN并刷新页面:

这个页面遭到了拒绝。这意味着我们的角色,不具备了访问权限。当然在symfony的生产环境,我们就可以自定义。下面我们将讨论如何自定义错误页面。

综上所述在Security.yml里的access_control是控制访问的最简单方法,但也是最不灵活的。将access_control还改回ROLE_USER并且注释他们。后面,我们从控制器来限制他们的访问:

从Controller中限制访问:AccessDeniedException

找到EventController里的newAction。我们需要get这个“security context”,去获取这个服务。isGranted方法去检查现有用户是否有角色。

如何判断这个用户有ROLE_ADMIN角色可以使用如下代码:

如果这个用户没有ROLE_ADMIN,会抛出一个非常特别的异常:被称为AccessDeniedException。首先添加一个use声明,然后在if块中实例化这个异常。并添加一个消息,只有开发者才能够看到。

在symfony2.5或更高版本,有一种快捷方式,就是用事件createAccessDeniedException来替换之前的代码:

现在刷新,可以看到一个拒绝访问的页面。但是如果用户有admin角色,他就能够继续看到一个正常的页面。

AccessDeniedException异常:在security的特别类

通常情况下,如果你抛出一个异常,他会变成一个500错误页面。但是AccessDeniedException异常就很特殊。首先,如果我们还没有登录时,它仍然会把我们重定向到登录页面。但是如果我们处于登录状态,它会显示拒绝访问的403页面。所以在这里我们就不用关心用户是否登录。

哦,security真的很难,但是现在,你已经很认真的了解了,几乎所有你需要的知识。现在你只需要关心真正的难点,例如这种情况,你需要创建一个自定义的认证系统时,需要通过一个api键,而不是一个登录表单来验证用户。在这种情况下,你需要阅读symfony2的cookbookd的How to Authenticate Users with API Keys。这是symfony2.4的新功能,你可能在老的文章中无法发现它。

好,我们在控制器中创建一个名为enforceUserSecurity的私有函数并复制我们的安全检测代码到这个函数中:

现在,我们在newAction, createAction, editAction, updateAction and deleteAction里面使用:

你可以看到,这种方式更加灵活,使用access_control很简单。你可以选择最适合你的方式来工作。

提示:你也可以使用annotations的方式!请查看SensioFrameworkExtraBundle

 

 

 

发表评论