Symfony 3:未设置 RememberMe Cookie
Symfony 3: RememberMe Cookie is not set
在我的 Symfony 3 应用程序中,我的登录页面位于 url“/”(因此不是“/login”)。
不幸的是,应用程序没有设置 REMEMBER_ME cookie,尽管它在 security.yml 中正确配置:
# To get started with security, check out the documentation:
# http://symfony.com/doc/current/book/security.html
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
role_hierarchy:
ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
firewalls:
dev:
pattern: ^/(_(profiler|wdt|error)|css|images|js)/
security: false
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
check_path: /login_check
login_path: /
default_target_path: /home
use_forward: false
failure_path: null
failure_handler: ccdn_user_security.component.authentication.handler.login_failure_handler
require_previous_session: false
logout:
path: /logout
target: /
security: true
anonymous:
secret: "%secret%"
remember_me:
secret: "%secret%"
lifetime: 604800 # 1 week in seconds
path: /
secure: true
switch_user: true
access_control:
- { path: ^/admin, role: ROLE_ADMIN,requires_channel: "%protocol%" }
- { path: ^/user, roles: ROLE_USER, requires_channel: "%protocol%"}
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: "%protocol%" }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: "%protocol%" }
- { path: ^/, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: "%protocol%" }
我没有任何类型的听众设置,这是此 OP 运行 的内容:
Symfony2: remember me token is not set
我对FOSUserBundle的SecurityController做了如下调整:
/**
* Controllers for Anonymous Index Page
*/
class SecurityController extends BaseController
{
/**
* @param Request $request
*
* @return Response
*/
public function loginAction(Request $request)
{
$securityContext = $this->container->get('security.authorization_checker');
if ( $securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED') or $securityContext->isGranted('IS_AUTHENTICATED_FULLY') ) {
return $this->redirect($this->generateUrl('home'));
}
$response = parent::loginAction($request);
return $response;
}
}
但如您所见,这只是重定向用户,以防他已经登录。
然而,FOSUserBundle 附带的 AuthenticationListener 似乎从未被触发。
最后,如果您需要,这是我在登录表单中记住我的小部件:
<div class="checkbox checkbox-css m-b-30">
<input name="_remember_me" checked type="checkbox" id="remember_me_checkbox" />
<label for="remember_me_checkbox">Onthoudt mij</label>
</div>
有谁知道为什么没有设置 cookie?
用户将在 20 分钟左右后自动注销。我想这是因为 PHP 会话到期?
根据评论区回答:
secure: true
表示 cookie 将仅通过安全连接发送。出于测试目的,您可能需要删除此行,或者检查您的 Web 服务器是否已正确配置以处理 https
流量。
确保您通过 https
访问您的应用。我不确定自签名证书是否可能对此产生任何影响。根据 的 Gumbo 回答,它不应该...
另一件事:为了防止过早注销,请改为增加会话超时。 AFAIK,remember_me
只有在用户在会话期间离开时才有用...
希望这对您有所帮助...
在我的 Symfony 3 应用程序中,我的登录页面位于 url“/”(因此不是“/login”)。
不幸的是,应用程序没有设置 REMEMBER_ME cookie,尽管它在 security.yml 中正确配置:
# To get started with security, check out the documentation:
# http://symfony.com/doc/current/book/security.html
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
role_hierarchy:
ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
firewalls:
dev:
pattern: ^/(_(profiler|wdt|error)|css|images|js)/
security: false
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
check_path: /login_check
login_path: /
default_target_path: /home
use_forward: false
failure_path: null
failure_handler: ccdn_user_security.component.authentication.handler.login_failure_handler
require_previous_session: false
logout:
path: /logout
target: /
security: true
anonymous:
secret: "%secret%"
remember_me:
secret: "%secret%"
lifetime: 604800 # 1 week in seconds
path: /
secure: true
switch_user: true
access_control:
- { path: ^/admin, role: ROLE_ADMIN,requires_channel: "%protocol%" }
- { path: ^/user, roles: ROLE_USER, requires_channel: "%protocol%"}
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: "%protocol%" }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: "%protocol%" }
- { path: ^/, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: "%protocol%" }
我没有任何类型的听众设置,这是此 OP 运行 的内容: Symfony2: remember me token is not set
我对FOSUserBundle的SecurityController做了如下调整:
/**
* Controllers for Anonymous Index Page
*/
class SecurityController extends BaseController
{
/**
* @param Request $request
*
* @return Response
*/
public function loginAction(Request $request)
{
$securityContext = $this->container->get('security.authorization_checker');
if ( $securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED') or $securityContext->isGranted('IS_AUTHENTICATED_FULLY') ) {
return $this->redirect($this->generateUrl('home'));
}
$response = parent::loginAction($request);
return $response;
}
}
但如您所见,这只是重定向用户,以防他已经登录。
然而,FOSUserBundle 附带的 AuthenticationListener 似乎从未被触发。
最后,如果您需要,这是我在登录表单中记住我的小部件:
<div class="checkbox checkbox-css m-b-30">
<input name="_remember_me" checked type="checkbox" id="remember_me_checkbox" />
<label for="remember_me_checkbox">Onthoudt mij</label>
</div>
有谁知道为什么没有设置 cookie? 用户将在 20 分钟左右后自动注销。我想这是因为 PHP 会话到期?
根据评论区回答:
secure: true
表示 cookie 将仅通过安全连接发送。出于测试目的,您可能需要删除此行,或者检查您的 Web 服务器是否已正确配置以处理 https
流量。
确保您通过 https
访问您的应用。我不确定自签名证书是否可能对此产生任何影响。根据 的 Gumbo 回答,它不应该...
另一件事:为了防止过早注销,请改为增加会话超时。 AFAIK,remember_me
只有在用户在会话期间离开时才有用...
希望这对您有所帮助...