Php Symfony:使用id登录后重定向到用户配置文件
在我的应用程序中,我希望在登录后将用户重定向到profile,因此我在我的TWIG页面中使用了一个名为Php Symfony:使用id登录后重定向到用户配置文件,php,symfony,twig,Php,Symfony,Twig,在我的应用程序中,我希望在登录后将用户重定向到profile,因此我在我的TWIG页面中使用了一个名为\u target\u path和值为/profile/{userid}的隐藏输入(我试图使用IF语句来检查app.user.username变量何时存在,但这不是正确的逻辑) 我可以使用参数ID访问配置文件页面,因此url类似于example.com/profile/1,没有ID,它会导致404 因此,我需要在登录到profile/{id}后将用户重定向到autenticationUtils
\u target\u path
和值为/profile/{userid}
的隐藏输入(我试图使用IF语句来检查app.user.username
变量何时存在,但这不是正确的逻辑)
我可以使用参数ID
访问配置文件页面,因此url类似于example.com/profile/1
,没有ID,它会导致404
因此,我需要在登录到profile/{id}
后将用户重定向到autenticationUtils
我确信我的逻辑是错误的,但我在网上找不到任何东西可以解决我的问题
这是我的保安
security:
providers:
user_db:
entity: { class: AppBundle\Entity\User, property: username }
encoders:
Symfony\Component\Security\Core\User\User:
algorithm: bcrypt
cost: 12
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: ~
form_login:
login_path: login
check_path: login
logout: true
logout:
csrf_parameter: _csrf_token
csrf_token_generator: ~
csrf_token_id: logout
path: /logout
target: /
success_handler: ~
invalidate_session: true
delete_cookies:
name:
path: null
domain: null
handlers: []
admin:
pattern: ^/
provider: user_db
http_basic:
realm: 'Admin Area'
provider: in_memory
form_login: ~
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, roles: ROLE_ADMIN }
- { path: ^/profilo, roles: [ROLE_USER, ROLE_ADMIN] }
登录后,您应该在PHP中执行以下操作:
return $this->redirectToRoute('name_profile_route', { id : $this->getUser()->getId()});
登录后,您应该在PHP中执行以下操作:
return $this->redirectToRoute('name_profile_route', { id : $this->getUser()->getId()});
从Symfony文档中: 更改默认页面: 首先,可以设置默认页面(即,如果会话中未存储上一页,则用户重定向到的页面)。要将其设置为
default\u security\u target
路由,请使用以下配置:
# app/config/security.yml
security:
# ...
firewalls:
main:
form_login:
# ...
default_target_path: default_security_target
现在,当会话中没有设置URL时,用户将被发送到default\u security\u target
路由
通过将始终使用\u默认\u目标\u路径
选项设置为true,可以使用户始终重定向到默认页面,而不管他们之前请求了什么URL:
# app/config/security.yml
security:
# ...
firewalls:
main:
form_login:
# ...
always_use_default_target_path: true
从Symfony文档中: 更改默认页面: 首先,可以设置默认页面(即,如果会话中未存储上一页,则用户重定向到的页面)。要将其设置为
default\u security\u target
路由,请使用以下配置:
# app/config/security.yml
security:
# ...
firewalls:
main:
form_login:
# ...
default_target_path: default_security_target
现在,当会话中没有设置URL时,用户将被发送到default\u security\u target
路由
通过将始终使用\u默认\u目标\u路径
选项设置为true,可以使用户始终重定向到默认页面,而不管他们之前请求了什么URL:
# app/config/security.yml
security:
# ...
firewalls:
main:
form_login:
# ...
always_use_default_target_path: true
您需要的是更改DefaultAuthenticationSuccessHandler(假设您使用普通的symfony机制,而不涉及任何包,如FOSUserBundle) 首先要做自己的处理程序(或部件,尤其是AuthenticationSuccess): 根据需要注入更多服务 第二,覆盖DI中的默认服务:
security.authentication.success_handler:
class: AppBundle\Handler\AuthenticationSuccessHandler
arguments: ['@security.http_utils', {}]
tags:
- { name: 'monolog.logger', channel: 'security' }
您需要的是更改DefaultAuthenticationSuccessHandler(假设您使用普通的symfony机制,而不涉及任何包,如FOSUserBundle) 首先要做自己的处理程序(或部件,尤其是AuthenticationSuccess): 根据需要注入更多服务 第二,覆盖DI中的默认服务:
security.authentication.success_handler:
class: AppBundle\Handler\AuthenticationSuccessHandler
arguments: ['@security.http_utils', {}]
tags:
- { name: 'monolog.logger', channel: 'security' }
我应该把这个放在哪里?在所有的登录过程(密码检查…)之后,我想登录过程是由symfony处理的,我不确定这个文件在哪里。对不起,我对这一点很陌生。你是使用FOSUserBundle还是类似的东西?我不认为,但我不确定,我已经遵循了文档指南。我刚刚更新了我的问题,包括
security.yml
,以供参考。在所有登录过程(密码检查…)之后,我认为登录过程由symfony处理,我不确定这些文件在哪里。对不起,我对这一点很陌生。你是使用FOSUserBundle还是类似的东西?我不认为,但我不确定,我已经遵循了文档指南。我刚刚更新了我的问题,包括security.yml
以供参考,但我看不到在哪里指定当前用户ID。您不需要在路由中指定用户ID
。登录后,当前用户已存储在会话中。您可以通过调用控制器中的方法getUser()
和Twig中的全局变量app.user
来访问它。如果您想在您的服务中获取当前用户,只需注入'security.token\u storage'
服务并获取它。很抱歉,我是新手,您能否在回复中解释如何执行此操作?编辑:我正在使用配置文件页面来显示每个用户配置文件,因此用户可以使用ID轻松访问其他配置文件。所以我不能用this@andream如果您想向每个用户公开您的配置文件页面,是的,user\u id
需要在路由中指定,但不是必需的。为了满足您的需求,我们有两种方法:1。让用户id
可选,如果url中的用户id
为null
,则它是当前登录的用户。否则,使用给定的用户id
从数据中获取用户。2. <代码>用户id始终是必需的,正如您所解释的那样。您需要创建自己的登录成功处理程序服务。您可以查看Symfony默认处理程序,例如Symfony\Component\Security\Http\Authentication\DefaultAuthenticationSuccessHandler
@andream,然后将您的服务添加到安全配置:success\u处理程序:your.service.name
谢谢,但是我看不到在哪里指定当前用户ID。您不需要在路由中指定用户ID
。登录后,当前用户已存储在会话中。您可以通过调用控制器中的方法getUser()
和Twig中的全局变量app.user
来访问它。如果您想在您的服务中获取当前用户,只需注入'security.token\u storage'
服务并获取它。很抱歉,我是新手,您能否在回复中解释如何执行此操作?编辑:我正在使用配置文件页面来显示每个用户配置文件,因此用户可以使用ID轻松访问其他配置文件。所以我不能用this@andream如果您想向每个用户公开您的配置文件页面,是的,user\u id
需要在路由中指定,但不是必需的。为了满足您的需求,我们有两种方法:1。如果url中的用户id
为空,则将用户id
设为可选<