我正在研究我要参加决赛的Symfony应用程序。目前,我正在处理安全问题,批准没有人会看到超出所需的更多。
我有一个只能访问特定路由的特定用户,我使用角色管理,但是,我将有很多用户,并且需要检查当前用户是否访问其自己的数据,并且否则拒绝访问。
例如,我将有许多用户具有相同的角色,可以说我有很多coole_employer,每个人都可以自己访问系统,但是他们需要能够仅访问自己的展示页面和员工无法访问其他雇主页面。
我研究了安全授权检查器,发现我可以否认访问控制者的行为,但是如果有这样的简单的东西,我愿意:
security.yml
access_control:
- { path: ^/fornecedor/{id}, allow_if: "{id} == token.getUser.getId and has_role('ROLE_FORNECEDOR')" }
谢谢
您可以通过注释使用访问控制
/**
* @Route("/", name="homepage")
* @Security("has_role('ROLE_ADMIN')")
*/
public function indexAction()
和上课
/**
* Class DefaultController
* @package CanoeWebBundleController
* @Security("has_role('ROLE_ADMIN')")
*/
class DefaultController extends Controller
您可以尝试此方法。
我会说您不需要将用户的" id"比较为" access_control",而是可以在登录操作中分配特定角色,只需检查当前路径是否需要特定的角色,例如cole_admin访问,否则拒绝访问该路线。
例如,在登录操作中,您可以通过ID找到用户并检索角色名称:
//Controller
public function loginAction(Request $request) {
......
$aRolesName = $oEntityLogin->getRepository('AppBundle:TitUserRol')->findRolesByUserId($oUser->getUseUserId());
$aRoleNameToken = count($aRolesName) > 0 ? $aRolesName : array('ROLE_USER');
$token = new UsernamePasswordToken($formlogin['username'], null, 'secured_area', $aRoleNameToken);
$this->get('security.context')->setToken($token);
......
检查路线是否需要特定角色(security.yml)
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, roles: [ROLE_ADMIN] }
- { path: ^/home, roles: [ROLE_ADMIN,ROLE_USER] }