6

我浏览了很多 stackoveflow 问题和文章,但找不到合适的答案。

我正在使用 fosuserbundle、hwiouthbundle 和 lexikjwt 包。

我正在开发一个基于 symfony 的 api,它将被一个 android 应用程序和 angular 应用程序使用。

现在我需要使用 fosuserbundle 使用 hwiouthbundle 登录和使用 lexikjwt 捆绑包进行 api 保护的注册和登录系统。

我已经实现了 fosuserbundle 和 hwiouthbundke 并且两者都可以在没有编写用户控制器的情况下工作。但我需要休息而不是形式。但我不能输入:在路由器中休息。

现在我如何登录,用 fosuserbundle 注册用户并休息?我不想使用 fosouth 服务器。只需要注册并使用 api 登录而不是从网络休息。

4

1 回答 1

15

因此,如果您想使用 FOSUserBundle 手动注册用户,请创建一个控制器并添加一个注册方法:

// Acme/AppBundle/Controller/SecurityController

public function registerAction(Request $request)
{
    $userManager = $this->get('fos_user.user_manager');
    $entityManager = $this->get('doctrine')->getManager();
    $data = $request->request->all();

    // Do a check for existing user with userManager->findByUsername

    $user = $userManager->createUser();
    $user->setUsername($data['username']);
    // ...
    $user->setPlainPassword($data['password']);
    $user->setEnabled(true);

    $userManager->updateUser($user);

    return $this->generateToken($user, 201);
}

并且,generateToken 方法

protected function generateToken($user, $statusCode = 200)
{
    // Generate the token
    $token = $this->get('lexik_jwt_authentication.jwt_manager')->create($user)

    $response = array(
        'token' => $token,
        'user'  => $user // Assuming $user is serialized, else you can call getters manually
    );

    return new JsonResponse($response, $statusCode); // Return a 201 Created with the JWT.
}

还有路线

security_register:
    path: /api/register
    defaults: { _controller: AcmeAppBundle:Security:registerAction }
    methods: POST

和登录一样配置防火墙

// app/config/security.yml

firewalls:
    // ...
    register:
        pattern: ^/api/register
        anonymous: true
        stateless: true
    // ...

access_control:
    // ...
    - { path: ^/api/register, role: IS_AUTHENTICATED_ANONYMOUSLY }

对于登录,只需使用check_path您的 FOSUser 登录防火墙。

有关令牌生成的更多信息,请参阅JWTManager。希望这对您有所帮助。

编辑

如果您想要 LexikJWTAuthenticationBundle + FOSUserBundle + FOSRestBundle 实现的完整示例,请参阅我的symfony-rest-api

于 2016-01-31T23:26:46.167 回答