如何最好地保护控制器操作并显示不同的内容symfony2

时间:2015-07-31 00:44:13

标签: symfony

我正在使用symfony2构建Web应用程序。我有不同类型的用户,角色不同; ROLE_STUDENT和ROLE_TEACHER,这两个用户可以访问课程的详细信息;如果用户是教师,则显示按钮编辑,如果是学生,则会显示按钮订阅,实际上这不安全,因为它只是隐藏了控制器动作的路径,如果学生类型在地址栏/ course / 2 /编辑中将执行编辑操作,因此我必须使用@security注释保护操作:

这是我到目前为止所做的:

/**
 * @Security("has_role('ROLE_TEACHER')")
 */    public function editAction()
      {}

并在树枝上:

{% if is_granted('ROLE_TEACHER') %} 
   <a href="{{path('edit', {'id': course.id})}}">edit</a>
{% elseif is_granted('ROLE_STUDENT')%}
   <a href="{{path('subscribe', {'id': course.id})}}">subscribe</a> 

问题在于我向两个用户提供了大量可访问的内容,我认为有一个更好的解决方案,而不是复制/通过相同的代码。我是Symfony 2的新手,请耐心等待。

1 个答案:

答案 0 :(得分:1)

有多种方法可以达到这个目的,但你所做的并没有错。

实现此目的的一种方法是为ROLE设置ROUTES,以便ROLE_STUDENT角色只能访问类似此website.com/students的网址,而ROLE_TEACHER只能访问{{1} }}

website.com/teachers

然后,您可以仅为access_control: - { path: ^/student/, roles: ROLE_STUDENT } - { path: ^/teamleader/, roles: ROLE_TEACHER } 等教师设置编辑路线,这样website.com/teachers/course/2/edit无法使用编辑路线,如果他们尝试访问,则会出现404错误或访问被拒绝错误老师路线。您可以对订阅功能执行相同的操作。

就像我说的那样,有更多方法可以实现这一点,而这就是其中之一。