Symfony Безопасность

scorpion-ds

Новичок
Бьюсь уже час, не могу понять, что делаю не так ...

Имеется новая остановка SF2 версии 2.6.3, установлен FOSUserBundle, который в целом не вызывает вопросов.

Также имеется такой security.yml:
Код:
security:
    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

    role_hierarchy:
        ROLE_ADMIN:            ROLE_USER
        ROLE_SUPER_ADMIN:      ROLE_ADMIN
        ROLE_FC_CLIENT_USER:  ROLE_USER # FC - Client user
        ROLE_FC_CLIENT_ADMIN:  ROLE_FC_CLIENT_USER # FC - Client admin
        ROLE_FC_CLIENT_ALL:    [ROLE_FC_CLIENT_USER, ROLE_FC_CLIENT_ADMIN] # FC - Client all

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
            logout:      true
            anonymous:    true

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }
        - { path: ^/fc, role: ROLE_FC_CLIENT_USER }
Я добавил три роли ROLE_FC_CLIENT_USER, ROLE_FC_CLIENT_ADMIN, ROLE_FC_CLIENT_ALL, по идеи все они наследуют роль ROLE_USER, но этого не происходит.

Если в последней строке, вместо:
- { path: ^/fc, role: ROLE_FC_CLIENT_USER }
указать:
- { path: ^/fc, role: ROLE_USER }
то доступ к /fc есть, но если я указываю любую из своих ролей, то получают 403.

Подскажите, что может быть не так?
 

scorpion-ds

Новичок
Допустил ошибку в иерархии по невнимательности, вот так, работает:
Код:
role_hierarchy:
        ROLE_FC_CLIENT_USER:  ROLE_USER # FC - Client user
        ROLE_FC_CLIENT_ADMIN:  ROLE_FC_CLIENT_USER # FC - Client admin
        ROLE_FC_CLIENT_ALL:    [ROLE_FC_CLIENT_USER, ROLE_FC_CLIENT_ADMIN] # FC - Client all

        ROLE_ADMIN:            [ROLE_USER, ROLE_FC_CLIENT_ALL]
        ROLE_SUPER_ADMIN:      ROLE_ADMIN
 

scorpion-ds

Новичок
У меня стоит задача сделать двух этапную авторизацию:
1. Ввод логин/пароль;
2. (если логин/пароль верен ввод кода который придет через SMS)

На данный момент я поставил FOSUserBundle, сейчас размышляю на каком уровне мне внедрить этот код, одна из идей проверять корректность логин/пароль в неком своем контроллере, после отправлять СМС, после ввода его пользователем, уже проводить саму авторизацию (разуется с проверкой кода из СМС).

Форма полностью на Ajax (авторизация, ввод СМС, регистрация, восстановление пароля), потому контроллеры придется свои писать, от FOS хочу оставить только сам сервис авторизации.

У меня правильное направление мысли? Может проще вообще FOS в топку и написать что-то свое?

Добавил:
Вот нашел, некое решение: https://github.com/scheb/two-factor-bundle/blob/master/Resources/doc/index.md
 
Последнее редактирование:

daemon_master

Новичок
1. Дампните токен и юзера в этот момент. Точно у него есть роль ROLE_FC_CLIENT_USER. По дефолту в FOSUserBundle всем пользователям вешается ROLE_USER, поэтому вы ее и видите
2. Для двухфакторной реализации лучше не использовать FOSUserBundle, а писать свои штуки по работе с Security, ИМХО (тем более в том бандле, что вы скинули, вроде то, что вам нужно).
 

scorpion-ds

Новичок
С ролями я разобрался, спасибо, напутал немного, кроме того, считал что ROLE_SUPER_ADMIN, изначально имеет права на все.

Отказаться от FOSUserBundle, я сейчас не могу, у меня слишком мало опыта в SF2 и мало времени на первый этап (в районе 70-ти часов), где уже должны быть реализовано: двух этапная авторизация, регистрация, восстановление доступа и определится с ролями пользователей.

Я разобрался как через события обеспечить работу FOS на Ajax, с модулем "two-factor-bundle" я тоже разобрался (пока на почту, это это детали), но не совсем в нем уверен, хочу попробовать свою процедуру ввода кода сделать, что-то вроде блокировки определенного фрагмента маршрута ("/fc***"), пока для пользователя не будет установлена некая сессия, указывающая, что верный код из СМС уже получен. Завтра буду пробовать, у меня пока нет полного понимания, как лучше сделать.
 

daemon_master

Новичок
Если вы делаете двухфакторную аутентификацию пользователь до того, как введет верный SMS код еще не считается залогиненым.

Судя по вашему ходу мыслей и использованию FOSUserBundle, вы можете использовать его полностью для первого этапа аутентификации. После первого этапа в сессии появится UsernamePasswordToken. Далее описываете логику по второму методу аутентификации, которая работает только с этими Token-ами. При успешном прохождении второго этапа перезаписываете в рамках одного security.context-а другой токен. В рамках каждого из токенов вы можете ввести свои роли, для удобной проверки доступа по URL-ам.
 

scorpion-ds

Новичок
Если вы делаете двухфакторную аутентификацию пользователь до того, как введет верный SMS код еще не считается залогиненым.
Модуль "two-factor-bundle" работает с FOSUserBundle, после верного ввода логин/пароль пользователь уже считается залогиненым, но пока не введен код, все маршруты блокируются (кроме исключений) и "введут" на окно ввода кода.
 

scorpion-ds

Новичок
daemon_master, сегодня провел несколько экспериментов, на данный момент остановился на данной документации:
http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html

Я вас правильно понял, что лучшим вариантом (если не отказываться от FOSUserBundle), создать свой провайдер аутентификации который будет использоваться вместе с FOS и будет проверять, только валидность кода из СМС?

P.S.: Изначально, я хотел кустарным методом добавить условие, которое при попытке доступа к определенном маршруту, пропускало пользователя или нет.

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