Symfony 3 - 管理两种身份验证模式,注销问题



on 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

服务.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: ""

我可以使用页面底部栏中的"注销"注销。缺点是,使用断开连接按钮,我返回主页并且没有断开连接。

我的基地.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(我们服务的身份验证页面),我希望被重定向到主页以选择我想要如何识别自己。但是匿名访问不起作用

您可以尝试将Security.yml中的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 }

因为您的注销路由似乎无法访问。

最新更新