#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. Я отредактирую свой первый пост, чтобы добавить функцию выхода из системы