Auth::attempt 在 Symfony 中等效

Auth::attempt equivalent in Symfony

在 Laravel 中有一个简单的 Auth::attempt(... 方法可用。我试图在 Symfony 中找到等效项。

我有一个已实施 AdvancedUserInterface 的原则用户实体。我一直在阅读 Symfony 安全文档,但我只想接受一个非常简单的 POST 请求,对会话的用户进行身份验证,然后使用 JSONResponse 进行响应。

有没有我缺少的简单方法?我是否需要编写某种自定义提供程序或...?

简短的回答是安装 FOSUserBundle 并使用他们的 LoginManager。在您的控制器中,您将需要一个如下所示的身份验证方法:

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Exception\AccountStatusException;
use FOS\UserBundle\Model\UserInterface;

/**
 * Authenticate a user with Symfony Security
 *
 * @param \FOS\UserBundle\Model\UserInterface        $user
 * @param \Symfony\Component\HttpFoundation\Response $response
 */
protected function authenticateUser(UserInterface $user, Response $response)
{
    try {
        $this->container->get('fos_user.security.login_manager')->loginUser(
            $this->container->getParameter('fos_user.firewall_name'),
            $user,
            $response);
    } catch (AccountStatusException $ex) {
        // We simply do not authenticate users which do not pass the user
        // checker (not enabled, expired, etc.).
    }
}

长答案是自己构建一个精简版的 FOSUserbundle。

  1. 创建一个 UserProvider class。 Laravel 已经带有 2 个 UserProvider:Illuminate\Auth\DatabaseUserProvider 和 Illuminate\Auth\EloquentUserProvider。 Symfony 安全组件仅随内存中的用户提供程序一起提供。以下是有关如何执行此操作的方法:http://symfony.com/doc/current/cookbook/security/custom_provider.html。另请注意:因为您使用的是 Doctrine,所以您可以将 UserRepository 设为您的 UserProvider class.

  2. (可选,取决于您要做什么)在 app/config/security.yml

  3. 中定义一个新的防火墙
  4. 在你的控制器中,创建这个:

    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
    
    protected function authenticateUser($firewallName, UserInterface $user) {
        $this->get('security.user_checker')->checkPostAuth($user);
    
        $token = new UsernamePasswordToken($user, null, $firewallName, $user->getRoles());
    
        if ($this->container->isScopeActive('request')) {
            $this->get('security.authentication.session_strategy')->onAuthentication($this->container->get('request'), $token);
        }
    
        $this->get('security.context')->setToken($token);
    }
    

或者您最好将其移至身份验证服务提供商并将该服务调用到您的控制器操作中。

希望对您有所帮助。