FOSUser - 记住我功能问题
FOSUser - Remember me functionality issue
我用 symfony 2.8 建立了一个网站,我使用 FOSUserBundle 进行身份验证、用户管理等,我有一个问题可以解决。
对我来说没有明显的原因,"rememberme" cookie 不会像预期的那样运行。
我很确定我只是以某种方式遗漏了一个配置参数,但我找了几个小时都找不到它。
我在 apache 2.0 服务器上使用 php 7.0。
有我的 config.yml 文件(大部分):
framework:
#esi: ~
translator: { fallbacks: ["%locale%"] }
secret: "%secret%"
router:
resource: "%kernel.root_dir%/config/routing.yml"
strict_requirements: ~
form: ~
csrf_protection: ~
validation: { enable_annotations: true }
#serializer: { enable_annotations: true }
templating:
engines: ['twig']
default_locale: "%locale%"
trusted_hosts: ~
trusted_proxies: ~
session:
# handler_id set to null will use default session handler from php.ini
handler_id: ~
save_path: "%kernel.root_dir%/sessions/"
fragments: ~
http_method_override: true
...
fos_user:
db_driver: orm
firewall_name: main
user_class: UserBundle\Entity\User
from_email:
address: "%email_referer%"
sender_name: "App"
group:
group_class: UserBundle\Entity\Group
group_manager: sonata.user.orm.group_manager
resetting:
email:
template: :mail:resetting_password.html.twig
service:
mailer: fos_user.mailer.twig_swift
user_manager: sonata.user.orm.user_manager
还有我的 security.yml :
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_CHAMPION: [ROLE_USER]
ROLE_ENTREPRISE: [ROLE_USER]
ROLE_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN, ROLE_A, ROLE_B]
ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
SONATA:
- ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT
providers:
fos_userbundle:
id: fos_user.user_manager
firewalls:
admin:
pattern: ^/admin
context: user
form_login:
provider: fos_userbundle
login_path: login
use_forward: true
check_path: sonata_user_admin_security_check
failure_path: null
default_target_path: sonata_admin_dashboard
logout:
path: sonata_user_admin_security_logout
target: homepage
invalidate_session: false
anonymous: true
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: .*
context: user
form_login:
provider: fos_userbundle
login_path: login
use_forward: false
check_path: /login_check
failure_path: null
csrf_token_generator: security.csrf.token_manager
default_target_path: profile
logout:
path: logout
target: homepage
invalidate_session: false
anonymous: true
remember_me:
secret: '%secret%'
lifetime: 15724800 # 6 months
path: /
domain: ~
secure: true
access_control:
# Some public pages
- { path: ^/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/cgu$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/cgv$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/contact$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/faq$, role: IS_AUTHENTICATED_ANONYMOUSLY }
# URL of FOSUserBundle which need to be available to anonymous users
- { path: ^/connexion, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
# Admin login page needs to be accessed without credential
- { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/login_check$, role: IS_AUTHENTICATED_ANONYMOUSLY }
# - { path: ^/admin/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
# Admin
- { path: ^/admin/, role: [ROLE_ADMIN, ROLE_SONATA_ADMIN] }
# Partie connectée
- { path: ^/, role: IS_AUTHENTICATED_REMEMBERED }
acl:
connection: default
编辑:
我做了一些测试,我的 REMEMBERME cookie 似乎没有被删除,它仍然在这里,开始日期和结束日期与以前相同。
所以,我可以关闭并打开我的浏览器,cookie 仍然在这里,当我这样做时,我仍然经过身份验证(并且可以转到管理员)。但是当我在 "idle" 停留一段时间并且我想访问管理部分时,我被重定向到登录页面。
REMEMBERME cookie 仍然存在,但此时,我无法访问我在启动浏览器时可以访问的页面。
编辑 2:
看来会话生命周期是我的问题的 "cause"。但我想要的是,当用户选中 "Remember me" 选项时,他不再需要再次登录,即使他在后台打开我网站的标签 x 天(就像移动浏览器那样)。我该怎么做?
编辑 2017 年 8 月 16 日:
我在 security.yml 文件中添加了一行:
域:~
这条线似乎使系统正常工作。在我使用 Chrome 和 Firefox 的计算机上不再检测到该问题(如果这两个中的一个在玩我的 cookie)。
PS : 如果问题不再出现,我会在几天内更新这张票,到 "validate" 它。
我认为您谈论的是您的会话生命周期,而不是记住我的功能。
在您的 config.yml 中,您可以将框架配置为使用自定义会话生命周期。
framework:
session:
cookie_lifetime: 3600
如果未设置此配置,将使用您 php.ini 中的值。
希望对您有所帮助。
问题不再出现,解决方案似乎是"domain"参数:
domain: ~
我用 symfony 2.8 建立了一个网站,我使用 FOSUserBundle 进行身份验证、用户管理等,我有一个问题可以解决。 对我来说没有明显的原因,"rememberme" cookie 不会像预期的那样运行。
我很确定我只是以某种方式遗漏了一个配置参数,但我找了几个小时都找不到它。
我在 apache 2.0 服务器上使用 php 7.0。
有我的 config.yml 文件(大部分):
framework:
#esi: ~
translator: { fallbacks: ["%locale%"] }
secret: "%secret%"
router:
resource: "%kernel.root_dir%/config/routing.yml"
strict_requirements: ~
form: ~
csrf_protection: ~
validation: { enable_annotations: true }
#serializer: { enable_annotations: true }
templating:
engines: ['twig']
default_locale: "%locale%"
trusted_hosts: ~
trusted_proxies: ~
session:
# handler_id set to null will use default session handler from php.ini
handler_id: ~
save_path: "%kernel.root_dir%/sessions/"
fragments: ~
http_method_override: true
...
fos_user:
db_driver: orm
firewall_name: main
user_class: UserBundle\Entity\User
from_email:
address: "%email_referer%"
sender_name: "App"
group:
group_class: UserBundle\Entity\Group
group_manager: sonata.user.orm.group_manager
resetting:
email:
template: :mail:resetting_password.html.twig
service:
mailer: fos_user.mailer.twig_swift
user_manager: sonata.user.orm.user_manager
还有我的 security.yml :
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_CHAMPION: [ROLE_USER]
ROLE_ENTREPRISE: [ROLE_USER]
ROLE_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN, ROLE_A, ROLE_B]
ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
SONATA:
- ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT
providers:
fos_userbundle:
id: fos_user.user_manager
firewalls:
admin:
pattern: ^/admin
context: user
form_login:
provider: fos_userbundle
login_path: login
use_forward: true
check_path: sonata_user_admin_security_check
failure_path: null
default_target_path: sonata_admin_dashboard
logout:
path: sonata_user_admin_security_logout
target: homepage
invalidate_session: false
anonymous: true
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: .*
context: user
form_login:
provider: fos_userbundle
login_path: login
use_forward: false
check_path: /login_check
failure_path: null
csrf_token_generator: security.csrf.token_manager
default_target_path: profile
logout:
path: logout
target: homepage
invalidate_session: false
anonymous: true
remember_me:
secret: '%secret%'
lifetime: 15724800 # 6 months
path: /
domain: ~
secure: true
access_control:
# Some public pages
- { path: ^/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/cgu$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/cgv$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/contact$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/faq$, role: IS_AUTHENTICATED_ANONYMOUSLY }
# URL of FOSUserBundle which need to be available to anonymous users
- { path: ^/connexion, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
# Admin login page needs to be accessed without credential
- { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/login_check$, role: IS_AUTHENTICATED_ANONYMOUSLY }
# - { path: ^/admin/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
# Admin
- { path: ^/admin/, role: [ROLE_ADMIN, ROLE_SONATA_ADMIN] }
# Partie connectée
- { path: ^/, role: IS_AUTHENTICATED_REMEMBERED }
acl:
connection: default
编辑:
我做了一些测试,我的 REMEMBERME cookie 似乎没有被删除,它仍然在这里,开始日期和结束日期与以前相同。
所以,我可以关闭并打开我的浏览器,cookie 仍然在这里,当我这样做时,我仍然经过身份验证(并且可以转到管理员)。但是当我在 "idle" 停留一段时间并且我想访问管理部分时,我被重定向到登录页面。 REMEMBERME cookie 仍然存在,但此时,我无法访问我在启动浏览器时可以访问的页面。
编辑 2: 看来会话生命周期是我的问题的 "cause"。但我想要的是,当用户选中 "Remember me" 选项时,他不再需要再次登录,即使他在后台打开我网站的标签 x 天(就像移动浏览器那样)。我该怎么做?
编辑 2017 年 8 月 16 日: 我在 security.yml 文件中添加了一行: 域:~ 这条线似乎使系统正常工作。在我使用 Chrome 和 Firefox 的计算机上不再检测到该问题(如果这两个中的一个在玩我的 cookie)。
PS : 如果问题不再出现,我会在几天内更新这张票,到 "validate" 它。
我认为您谈论的是您的会话生命周期,而不是记住我的功能。
在您的 config.yml 中,您可以将框架配置为使用自定义会话生命周期。
framework:
session:
cookie_lifetime: 3600
如果未设置此配置,将使用您 php.ini 中的值。
希望对您有所帮助。
问题不再出现,解决方案似乎是"domain"参数:
domain: ~