Php Symfony:使用id登录后重定向到用户配置文件

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

在我的应用程序中,我希望在登录后将用户重定向到profile,因此我在我的TWIG页面中使用了一个名为
\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
设为可选<