2015-07-14 2 views
1

Я пытаюсь создать простое действие для деталей членов других членов веб-сайта; мой контроллер выглядеть, что на данный момент:FOS User Bundle: получить доступ к другому профилю пользователя: «У этого пользователя нет доступа к этому разделу».

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+ 

Я geeting в follwong ошибку: «Этот пользователь не имеет доступа к этому разделу.» Есть ли способ, которым я мог бы обойти это? Я использую неправильный метод или есть проблема безопасности, которую я должен включить? Идеи будут приветствовать

ответ

1

1), если вы хотите получить вошедшего в систему пользователя, вы должны использовать этот код, чтобы получить данные пользователя:

$current_user=$this->getUser(); 

, например, если вы хотите получить идентификатор и имя пользователя тока пользователь может использовать это:

$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, 
    )); 
} 

Я надеюсь, что эта помощь U!

2

Я как бы потерял то, что вы просите, но чтение вашей логики меня тоже немного смущает.

Моя интерпретация того, что вы делаете:

  • Отправка запроса на получение пользователя на основе идентификатора пользователя.
  • Использование FOSUserBundle для извлечения информации о пользователе.
  • Проверка того, что полученная информация является экземпляром класса User.
  • Возврат информации о пользователе.

Мой вопрос: почему вы проверяете, является ли возвращенный объект ОТ МЕНЕДЖЕРА ПОЛЬЗОВАТЕЛЯ экземпляром пользователя? Вместо этого вы пытаетесь проверить, что запрос принадлежит действительному зарегистрированному пользователю с надлежащими разрешениями? Если так, тогда вы этого не делаете.

2 Решения Я вижу, являются:

Не VALIDATE зарегистрированного пользователя.

  1. Отправить запрос на получение пользователя через идентификатор пользователя.
  2. Получить информацию, используя диспетчер пользователей.
  3. Информация о возврате.

Validate пользователь вошел в систему перед возвращением информации

  1. Отправить запрос на получение пользователя с помощью идентификатора пользователя.
  2. Подтвердить, что запрос исходил от пользователя, который вошел в систему и имеет соответствующие разрешения.
  3. Получить информацию с помощью Менеджера пользователей
  4. Информация о возврате.

Проверка пользователя является:

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 
    )); 
} 
Смежные вопросы