0

我有一条通过 id 查找用户的路线。我想根据用户是访问自己的个人资料还是其他用户的个人资料,在个人资料上显示不同的内容。

控制器中的方法:

/**
 * @Route("/u/{id}", name="profile_show")
 * @ParamConverter("user", class="UserBundle:User")
 * @Template()
 */
public function showAction(User $user)
{
    $auth = $this->getUser();

    if ($user->getId() == $auth->getId()) {
        $auth->addRole('ROLE_PROFILE_OWNER');
    }

    return array(
        'user' => $user
    );
}

Twig 中的输出:

        {% if is_granted('ROLE_PROFILE_OWNER') %}
            <p>This is my profile</p>
        {% else %}
            <p>This is not my profile</p>
        {% endif %}

如果我执行 {{ dump(app.user) }},该角色会显示在用户身上,但它会输出不是我的个人资料的文本。任何人都知道为什么这不起作用?

我也不知道这是否真的是做这样的事情的正确方法。我想遵循最佳实践,所以如果这完全错误,请赐教。

谢谢你的帮助。

4

1 回答 1

1

凭据检查是在showAction()执行之前进行的,因此该$auth->addRole('ROLE_PROFILE_OWNER');行永远不会运行。这就是为什么您总是收到“这不是您的个人资料”消息的原因。

此外,您不应使用用户角色来执行此类配置文件所有权检查。相反,只需比较登录用户的id(存储在 Session 中)和 profile user_id。如果它们不相同,则抛出AccessDeniedException().

查看文档保护控制器会话管理页面。

于 2012-11-29T13:02:56.957 回答