我正在使用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的新手,请耐心等待。
答案 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错误或访问被拒绝错误老师路线。您可以对订阅功能执行相同的操作。
就像我说的那样,有更多方法可以实现这一点,而这就是其中之一。