авторизованный юзер не мог зайти на страницу авторизации

125
20 октября 2019, 01:50

Мне нужно, что бы авторизованный юзер не мог зайти на страницу авторизации и при попытке его кидало в кабинет. Сначало налепил костылей в контроллере, а потом подумал о security и добавил там вот это

 - { path: ^/fuck, roles: IS_AUTHENTICATED_ANONYMOUSLY }

Правильно ли я понимаю, что если юзер авторизован его туда пускать не должно? Вообщем не пашет, дайте хлебных крошек куда идти плиз.

Answer 1

Так как Security достаточно сложный механизм для понимания. Рекомендую прочесть введение в security на русском. По Вашему кейсу скажу, что вероятно Вам нужно построить традиционную форму входа в систему.

Но перед тем как реализовывать "сложный" механизм входа потренеруйтесь на "легком".

Итак, у вас уже есть Конфигурирование аутентификации ваших пользователей и, следующим шагом, Вам нужно добавить Конфигурирование загрузки пользователей. Для этого нужно добавить провайдера пользователя - это сервис либо описание ролей пользователя, в простой конфигурации нужно просто описать юзеров, записав роль и пароль. Так же необходимо добавить тип энкодинга, в нашем случае это plaintext

config/packages/security.yaml
security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext
    providers:
        in_memory:
            memory:
                users:
                    admin:
                        password: somepass
                        roles: 'ROLE_ADMIN'
    # ...

Мы настроили провайдер и теперь переходим к авторизации, то есть нам нужно запреnить доступ, и самый простой способ это тот, который сейчас написан у Вас. В access_control просто добавить

- { path: ^/admin, roles: ROLE_ADMIN }
- { path: ^/profile, roles: IS_AUTHENTICATED_ANONYMOUSLY }

то при неудачной авторизации будет возвращаться 403.

Для того что бы редиректить на определенный урл отправляется в раздел Как построить традиционную форму входа в систему.

И там описано, что нужно описать login_path и check_path

app/config/security.yml
security:
    # ...
    firewalls:
        main:
            anonymous: ~
            form_login:
                login_path: /some/login
                check_path: some/login

А далее уже действуем по примеру и в контроллере где акшн логина необходимо добавить логику авторизации.

src/AppBundle/Controller/SecurityController.php
public function loginAction(Request $request, AuthenticationUtils $authUtils)
{
    $error = $authUtils->getLastAuthenticationError();
    $lastUsername = $authUtils->getLastUsername();
    return $this->render('security/login.html.twig', array(
        'last_username' => $lastUsername,
        'error'         => $error,
    ));
}
Authorization Checker

Так же Вы можете реализовать проверку роли используя Authorization Checker. И в контроллере Вы проверяете

public function indexAction()
{
    $isUserAnonymous = $this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_ANONYMOUSLY');
    if ( $isUserAnonymous) {
         return $this->redirectToRoute('profile');
    }
}
Answer 2

Решение вопроса не очень сложное. Согласно документации, а именно вот здесь - https://symfony.com/doc/current/security.html

мы находим вот эту "роль"

IS_AUTHENTICATED_REMEMBERED: All logged in users have this, even if they are logged in because of a "remember me cookie". Even if you don't use the remember me functionality, you can use this to check if the user is logged in.

тут если что то не понятно, то речь идет о том что данная "роль" имеется у всех аунтифицированных пользователей, а это значит уже пол победы!

А вторую половину победы можно обеспечить двумя вариантами.

  1. Не правильный! (но имеющий право на жизнь) . Вы создаете EventListener ... (тут я забыл на какое именно событие его вешать и решил что не буду продолжать).
  2. Правильное. Вы делаете "свою" форму авторизации как в документации, а по сути расширяете существующую добавляя нужный контроллер (смотрим вот сюда https://symfony.com/doc/current/security/form_login_setup) и в силу того что он наследует базовый контроллер то вы проверяете в методе login пользователя на роль IS_AUTHENTICATED_REMEMBERED и если да - редиректите на нужный вам роут.

Простите что не очень подробно, мне показалось что вы поймете о чем я.

READ ALSO
PHP сортировка не связанных переменных

PHP сортировка не связанных переменных

Подскажите во что объединить переменные что бы потом их отсортироватьПробовал смотреть на массивы многомерные, но вообще не понял что там...

127
get_fields foreach Дублируются данные

get_fields foreach Дублируются данные

Нужно получить значение дополнительного поля (Advanced Custom Fields)По итогу выдает только последний один массив в таком виде:

121
Доставка по городу

Доставка по городу

Есть сайт на wordpress, необходимо сделать расчет стоимости доставки в зависимости от расстояния и от суммы заказа(если покупатель набрал товаров...

124
static std::condition_variable undefined reference

static std::condition_variable undefined reference

при попытке использовать такую переменную - выдает undefined reference

113