FOS用户包:访问其他用户配置文件:"此用户无权访问此部分。"

时间:2015-07-14 15:26:20

标签: symfony fosuserbundle

我正在尝试为网站其他成员的会员详细信息设置一个简单的操作;我的控制器现在看起来像那样:

public function modalProfileAction($id) {
    $userManager = $this->get('fos_user.user_manager');
    $user = $userManager->findUserBy(array('id' => $id));
    if (!is_object($user) || !$user instanceof UserInterface) {
        throw new AccessDeniedException('This user does not have access to this section.');
    }
    return $this->render('TESTUserBundle:Profile:modal_short_profile.html.twig', array(
        'user' => $user
    ));
}

此操作由JS(AJAX方法GET)触发。我的路由是:

TEST_user_modal:
    pattern: /team-member/{id}
    defaults: { _controller: TESTUserBundle:User:modalProfile }
    methods:  [GET]
    requirements:
        id: \d+

我正在纠正以下错误:"此用户无权访问此部分。" 有没有办法解决这个问题?我使用错误的方法还是存在安全问题? 欢迎提出想法

2 个答案:

答案 0 :(得分:2)

我有点迷失在你所问的问题上,但阅读你的逻辑也让我感到困惑。

我对你所做的事情的解释是:

  • 根据用户ID发送检索用户的请求。
  • 使用FOSUserBundle检索用户信息。
  • 验证检索到的信息是User类的实例。
  • 返回用户信息。

我的问题是你为什么要验证返回的对象来自用户管理器是否是用户的实例?您是否尝试验证请求是否来自具有适当权限的有效登录用户?如果是这样,那么你根本就不这样做。

我看到的解决方案是:

不要验证登录用户。

  1. 通过用户ID发送检索用户的请求。
  2. 使用用户管理器检索信息。
  3. 返回信息。
  4. 验证用户在返回信息之前已登录

    1. 通过用户ID发送检索用户的请求。
    2. 验证请求来自已登录且具有适当权限的用户。
    3. 使用用户管理器检索信息
    4. 返回信息。
    5. 验证用户是:

      public function modalProfileAction($id) {
          $users = $this->getUser();
          if (!is_object($users) || $users instanceof UserInterface) {
              throw new AccessDeniedException('You must be logged in to view this information.');
          }
          $user = $em->getRepository('UserBundle:User')->find($id);
      
          return $this->render('TESTUserBundle:Profile:modal_short_profile.html.twig', array(
              'user' => $user
          ));
      }
      

答案 1 :(得分:1)

1)如果您想获得当前登录用户,则必须使用此代码获取用户数据:

$current_user=$this->getUser();

例如,如果你想获得当前用户的id和用户名,可以使用:

$id=$current_user->getId();
$username=$current_user->getUsername();

2)如果您想在管理面板中获取其他用户信息,则必须使用存储库来获取信息:

public function showAction($id)
{
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('UserBundle:User')->find($id);

    if (!$entity)
    {
        throw $this->createNotFoundException('Unable to find User entity.');
    }



    return $this->render('UserBundle:User:show.html.twig', array(
                'entity' => $entity,
    ));
}

我希望这有助于你!