[英]Symfony 2.6 authentication with third party cookie or login form
我正在努力应对symfony的安全性组件。 我想基于第三方cookie和/或传统的登录表单来实现身份验证。 更详细一点:首先,应用程序应检查用户在我们环境中是否有来自其他应用程序的cookie。 在这种情况下,如果外部api中的会话有效,则该应用可以识别该cookie,并针对外部api对其进行验证,并验证用户身份。 如果无效或用户没有这样的cookie,则应用程序会将请求转发到普通登录表单。 我已经尝试了很多方法来实现此行为,从自定义登录表单身份验证提供程序开始,通过自定义侦听器等。
目前,我正在两个独立的安全工厂中进行尝试。 一个使用自定义侦听器和提供程序实现SecurityFactoryInterface,另一个使用自定义提供程序和默认侦听器扩展FormLoginFactory。
这里是一些当前状态的示例代码:
CustomCookieSecurityFactory.php
class CustomCookieSecurityFactory implements SecurityFactoryInterface
{
public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint)
{
$providerId = 'security.authentication.provider.custom.cookie.'.$id;
$container
->setDefinition($providerId, new DefinitionDecorator('security.authentication.provider.custom.cookie'))
->replaceArgument(0, new Reference($userProvider))
;
$listenerId = 'security.authentication.listener.custom.cookie.'.$id;
$listener = $container->setDefinition($listenerId, new DefinitionDecorator('security.authentication.listener.custom.cookie'));
return array($providerId, $listenerId, $defaultEntryPoint);
}
public function getPosition()
{
return 'pre_auth';
}
public function getKey() {
return 'custom_cookie';
}
}
CustomFormLoginSecurityFactory
class CustomFormLoginSecurityFactory extends FormLoginFactory
{
public function getKey()
{
return 'custom_form_login';
}
/**
* Create custom provider.
*
*/
protected function createAuthProvider(ContainerBuilder $container, $id, $config, $userProviderId)
{
$provider = 'security.authentication.provider.custom.form.'.$id;
$container
->setDefinition($provider, new DefinitionDecorator('security.authentication.provider.custom.form'))
->replaceArgument(0, new Reference($userProviderId))
->replaceArgument(2, $id)
;
return $provider;
}
}
service.yml
security.authentication.listener.custom.cookie:
class: AppBundle\Security\Http\Firewall\CustomCookieAuthenticationListener
arguments: ["@security.token_storage", "@security.authentication.manager", "@service_container", "@logger"]
security.authentication.provider.custom.cookie:
class: AppBundle\Security\Authentication\Provider\CustomCookieAuthenticationProvider
arguments: ["", "@logger"]
security.authentication.provider.custom.form:
class: AppBundle\Security\Authentication\Provider\CustomFormLoginAuthenticationProvider
arguments: ["", "@security.user_checker", "", "@security.encoder_factory", true, "@logger", "@custom_router", "@doctrine.orm.entity_manager", "@request_stack"]
安全性
firewalls:
dev:
pattern: ^/(_(profiler|wdt|error)|css|images|js)/
security: false
secured_area:
anonymous: ~
custom_cookie: ~
custom_form_login:
provider: custom_user
login_path: /login
check_path: /login-check
username_parameter: form[username]
password_parameter: form[password]
logout:
path: /logout
target: /
我的主要问题是,如果基于cookie的身份验证不起作用,则不会调用第二种身份验证。 也许我的方式完全错误,或者只是没有正确配置防火墙。
能够从知道symfony的安全组件的人员那里获得一些帮助会很好。
根据Symfony2文档,您可以在security.yml
使用simple_preauth
参数:
# app/config/security.yml
security:
# ...
firewalls:
secured_area:
pattern: ^/admin
stateless: false
simple_preauth:
authenticator: apikey_authenticator
provider: api_key_user_provider
providers:
api_key_user_provider:
id: api_key_user_provider
您还可以连锁提供程序 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.