Symfony 3 — Управление двумя режимами аутентификации, проблема с выходом из системы

#symfony #fosuserbundle #cas

#symfony #fosuserbundle #cas

Вопрос:

на symfony мне нужно разработать приложение, которое может управлять подключением через форму на сайте, а также подключением CAS.

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

Для подключения CAS (пользователи, внутренние для службы, являющиеся частью LDAP), когда они заходят на сайт, они автоматически перенаправляются на сайт подключения, и они будут перенаправлены на нужный сайт после подключения.

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

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

Итак, это мой код :

Security.yml:

 # app/config/security.yml

security:
    encoders:
        FOSUserBundleModelUserInterface: bcrypt

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN

providers:
    app:
       id: bes_auth.user_provider

firewalls:

    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
       # anonymous:    true

    main:
        logout_on_user_change: true
        pattern: ^/

        guard:
            authenticators:
                - app.security.login_form_authenticator
                - bes_auth.authenticator

            entry_point: SitePagesBundleSecurityLoginFormAuthenticator

        logout:
            path:   /logout #nom de la route de déconnexion
            target: /
            success_handler: bes_auth.authenticator
        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_SUPER_ADMIN }
    - { path: ^/profile/.*, role: ROLE_USER }
    - { path: ^/logout, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/.*, role: IS_AUTHENTICATED_FULLY }
  

укоренение.yml:

 # app/config/routing.yml
fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"

auth_cas_logout:
    path: /logout
  

services.yml:

 ############ Guard with FOSUserBundle ##############

app.security.login_form_authenticator:
    class: SitePagesBundleSecurityLoginFormAuthenticator
    autowire: true


################ CAS ###########################    

SitePagesBundleSecurityAuthAuthCasService:
    autowire: true
    parent: BesanconAuthBundleSecurityAbstractsAuthAbstract
    public: false  
    autoconfigure: false
  

config.yml:

 # FOS User Bundle
fos_user:
    db_driver: orm
    firewall_name: main
    user_class: SitePagesBundleEntityUser
    service:
        mailer: fos_user.mailer.twig_swift
    registration:
        form:
            type: FOSUserBundleFormTypeRegistrationFormType
            name: fos_user_registration_form
            validation_groups: [Registration, Default]
        confirmation:
            enabled: true
            template: '@FOSUser/Registration/email.txt.twig'
    profile:
        form:
            type: FOSUserBundleFormTypeProfileFormType
            #validation_groups: [Profile, Default]
    resetting:
        email:
            template: '@FOSUser/Resetting/email.txt.twig'
    group:
        group_class: FosSf3MainBundleEntityGroup
    from_email:
        address: mail
        sender_name: username


besancon_auth:
    use_default_provider : true
    user_entity: ~
    homepage: "homepage"
    authentication_service: SitePagesBundleSecurityAuthAuthCasService
    type_auth: Cas

    cas:
        hostname: "######.######.fr"
        port: ###
        uri: ""
  

Я могу выйти из системы, используя «выход из системы» на панели внизу страницы. По минусам, используя кнопку отключения, я возвращаюсь на домашнюю страницу, и я не отключен.

My base.html.twig :

 <a class="nav-link" href="{{ path('deconnexion') }}">Déconnexion</a>
  

Моя функция контроллера:

 /**
     * @Route("/logout", name="deconnexion")
     */
    public function deconnexionAction()
    {
        $token = $this->get('security.token_storage')->getToken();
        //dump($token->getAttribute('nomComplet'));

    $typeAuth = $token->getAttribute('typeAuth');
    dump($typeAuth);

    if($typeAuth == 'cas')
    {
        return $this->redirectToRoute('auth_cas_logout');
    }

    else
    {
        return $this->redirectToRoute('fos_user_security_logout');
    }

}
  

Я отредактировал маршрут функции отмены подключения к / logout , и ссылка теперь работает! Однако он сразу перенаправляет меня на SESHAT (страницу аутентификации нашего сервиса), и я хотел бы перенаправиться на домашнюю страницу, чтобы выбрать, как я хочу идентифицировать себя. Но анонимный доступ не работает

Комментарии:

1. Почему ваш маршрут отмены подключения переходит в «/» ?

2. Эффективно. Я изменил и установил значение / logout, и ссылка теперь работает! Однако он сразу перенаправляет меня на SESHAT (страницу аутентификации нашего сервиса), и я хотел бы перенаправиться на домашнюю страницу, чтобы выбрать, как я хочу идентифицировать себя. Но анонимный доступ не работает

3. Я отредактировал свой первый пост своим новым кодом

Ответ №1:

Можете ли вы попытаться изменить свой access_control в Security.yml на

 #    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
#   - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
#  - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/.*, role: ROLE_SUPER_ADMIN }
- { path: ^/profile/.*, role: ROLE_USER }
- { path: ^/logout, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/.*, role: IS_AUTHENTICATED_FULLY }
  

Потому что кажется, что ваш маршрут выхода из системы недоступен.

Комментарии:

1. Спасибо за ваш ответ! Итак, я изменил код, и проблема всегда одна и та же. На самом деле было бы необходимо иметь возможность двух выходов из системы. Тот, который будет эффективен для внешних пользователей, и тот, который будет применяться к пользователям, прошедшим проверку подлинности CAS. И в моем коде я должен был бы обрабатывать вызов одного или другого из этих выходов из системы в зависимости от типа пользователя PS: извините за мой плохой английский, я француз

2. Я отредактирую свой первый пост, чтобы добавить функцию выхода из системы