有没有办法将变量用于access_control路径,以便我可以比较它

时间:2017-11-21 17:31:25

标签: symfony

我正在参加一个symfony应用程序我正在进入决赛。 现在我正在处理安全问题,并且没有人会看到超出需要的内容。

我有一个特定用户只能访问我使用角色管理的特定路由,但是,我有很多用户,需要检查当前用户是否正在访问拥有数据,否则拒绝访问。

例如,我有许多具有相同ROLE的用户,假设我有很多ROLE_EMPLOYER,每个人都有自己的系统访问权限,但他们需要能够访问它自己的展示页面和员工无法访问其他雇主页面。

我研究了安全授权检查程序,看到我可以拒绝访问控制者的行为,但我愿意,如果有更简单的东西:

security.yml
   access_control:
   - { path: ^/fornecedor/{id},  allow_if: "{id} == token.getUser.getId and has_role('ROLE_FORNECEDOR')" }

谢谢

2 个答案:

答案 0 :(得分:0)

您可以通过注释使用方法的访问控制

/**
 * @Route("/", name="homepage")
 * @Security("has_role('ROLE_ADMIN')")
 */
public function indexAction()

对于课堂而言

/**
* Class DefaultController
* @package Canoe\WebBundle\Controller
* @Security("has_role('ROLE_ADMIN')")
*/
class DefaultController extends Controller

答案 1 :(得分:0)

你可以尝试这种方法。

我想说你不需要将用户“Id”与“access_control”进行比较,而是可以在Login操作中指定一个特定角色,然后检查当前路径是否需要像ROLE_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] }