Symfony 手动登录用户

Posted

技术标签:

【中文标题】Symfony 手动登录用户【英文标题】:Symfony Manually Log User In 【发布时间】:2021-01-05 11:48:26 【问题描述】:

存在创建用户实体的页面(这超出了正常的注册流程)。

创建用户后,他们应该登录,guardHandler 与验证器一起使用,如下所示。

use App\Security\FakeAuthenticator;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;

        $response = $guardHandler->authenticateUserAndHandleSuccess(
                $user, // the User object you just created
                $request,
                $authenticator, // authenticator whose onAuthenticationSuccess you want to use
                'main'          // the name of your firewall in security.yaml
        );

但是验证器是一团糟,它只是为onAuthenticationSuccess的一种方法创建的。

use Symfony\Component\Security\Guard\AbstractGuardAuthenticator;

class FakeAuthenticator extends AbstractGuardAuthenticator

    public function supports(Request $request)
    
    return false;
    

    public function getCredentials(Request $request)
    
    throw new \RuntimeException('Unreachable code');
    

    public function getUser($credentials, UserProviderInterface $userProvider)
    
    throw new \RuntimeException('Unreachable code');
    

    public function checkCredentials($credentials, UserInterface $user)
    
    throw new \RuntimeException('Unreachable code');
    

    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
    

    return null;
    

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    
    throw new \RuntimeException('Unreachable code');
    

    public function start(Request $request, AuthenticationException $authException = null)
    
    throw new \RuntimeException('Unreachable code');
    

    public function supportsRememberMe()
    
    return true;
    

必须实现很多方法,因为方法 handleAuthenticationSuccess 需要一个实现 AuthenticatorInterface 的类。

代码有效且用户已登录,但感觉不是最干净的解决方案,是否有另一种登录用户的方法?

FosUserBundle 正在项目中使用,以下确实有效,但我不确定是否支持 loginManager 上的调用方法,我在文档中找不到任何内容,我不希望我的代码依赖于可能会改变的功能。

\FOS\UserBundle\Security\LoginManagerInterface::logInUser('main', $user, $response);

【问题讨论】:

【参考方案1】:

我决定使用loginManager 及其公共方法logInUser,这是最简洁的解决方案,无需为单个方法创建额外的类。

use FOS\UserBundle\Security\LoginManager;

...

public function createUserInControllerAction(LoginManagerInterface $loginManager): Response

    $user = new User(); // create user however you like

    $loginManager->logInUser('main', $user, $response);

    return $this->json(['success']);

【讨论】:

以上是关于Symfony 手动登录用户的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2:手动登录和 Json Web Token

Symfony LDAP 自动登录

如何在事件订阅者中访问Symfony 3.3中的登录用户,而不会丢失Web分析器

使用新的 Symfony 5 Authenticator 注册后如何手动验证用户?

Symfony2 获取登录用户

Symfony 2:如何检查用户是不是未在模板中登录?