带有 RESTful 身份验证的 Symfony2 应用程序,使用 FOSRestBundle 和 FOSUserBundle

Posted

技术标签:

【中文标题】带有 RESTful 身份验证的 Symfony2 应用程序,使用 FOSRestBundle 和 FOSUserBundle【英文标题】:Symfony2 App with RESTful authentication, using FOSRestBundle and FOSUserBundle 【发布时间】:2015-03-20 10:28:26 【问题描述】:

我正在为我的 JS 驱动应用程序制作 REST API。

在登录过程中,登录表单通过 AJAX 提交到我的 API 的 url /rest/login

登录成功返回204 如果失败,则返回 401

虽然我为 API 和应用程序本身分离了防火墙,但它们共享相同的上下文,这应该意味着,当用户对 API 进行身份验证时,他也对应用程序进行了身份验证。因此,当服务器返回 204 时,页面将重新加载,它应该将用户重定向到应用程序,因为他现在已经登录了。

我尝试使用 FOSUserBundle 的预制check_login 页面并在此处指向/rest/login

login:
    path: /rest/login
    defaults:
        _controller: FOSUserBundle:Security:check
    methods: [ POST ]

这不起作用,因为无论如何它总是返回重定向。我阅读了 symfony 的文档,但找不到如何制作自定义 check_login 页面。我需要的是这样的东西

use Symfony\Component\Security\Core\Exception\AuthenticationException;
use FOS\RestBundle\Controller\Annotations\View;    

class SecurityController 

    /**
     * @View(statusCode=204)
     */
    public function loginAction($username, $password) 

        /* first I need to somehow authenticate user 
           using normal authentication, that I've set up */
        ...

        /* Then I need to return 204 or throw exception,
           based on result.
           This is done using FOSRestBundle and it's
           listeners. */

        if(!$succesful) 
            throw new AuthenticationException();
        
    

我不知道该怎么做。我在任何文档中找到的任何内容都没有帮助我。如果您有任何可以为我指明正确方向的建议,我将不胜感激。


编辑:为了进一步简化,我的目标是。我希望我的登录功能与正常的 form_login 完全相同。我只想更改响应,它发回 - 而不是重定向我想要 204 成功和 401 失败。

【问题讨论】:

【参考方案1】:

我了解您的问题,因为我遇到了类似的情况,但使用的是 SOAP 服务。在中间我可以重新搜索安全 wsse,Symfony2 已经提供了解决方案

http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html

它使用真正的令牌,您可以匹配 FOSUserBundle 中的用户。我看到的唯一想法是您要比较的字段“密码”与数据库中的相同(加密)然后我决定创建一个仅用于此用途的额外字段。

希望对你有帮助。

问候

【讨论】:

那么,我需要实现全新的自定义身份验证提供程序吗?我觉得这有点矫枉过正,因为我需要改变的是监听器发送 204/401 而不是重定向的行为,而不是整个过程。【参考方案2】:

我找到了一个简单的解决方案。我只需要编写一个实现AuthenticationSuccessHandlerInterfaceAuthenticationFailureHandlerInterface 的类。

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;

class AuthenticationRestHandler implements AuthenticationSuccessHandlerInterface, AuthenticationFailureHandlerInterface 

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception) 
        return new Response('', Response::HTTP_UNAUTHORIZED);
    

    public function onAuthenticationSuccess(Request $request, TokenInterface $token) 
        return new Response('', Response::HTTP_NO_CONTENT);
    

然后我将其注册为服务并配置为防火墙的处理程序。

services:
  security.authentication_rest_handler:
    class: AuthenticationRestHandler

security:
  firewalls:
    rest:
      pattern: ^rest
      context: app
      form_login:
        check_path: /rest/login
        provider: fos_userbundle
        failure_handler: inspireon.security.authentication_rest_handler
        success_handler: inspireon.security.authentication_rest_handler
        username_parameter: login
        password_parameter: password

问题已解决,无需复杂的身份验证提供程序 :-)

【讨论】:

以上是关于带有 RESTful 身份验证的 Symfony2 应用程序,使用 FOSRestBundle 和 FOSUserBundle的主要内容,如果未能解决你的问题,请参考以下文章

ORDS RESTful 服务 + 带有身份验证的 Angular

使用带有摘要身份验证、jquery ajax 调用的 RestFul PHP Web 服务

在 Symfony2 中使用自定义身份验证提供程序

使用 Spring Security 和 Redis 对带有 Java 配置的 RESTFul api 进行基于 Cookie 的身份验证

RESTful API 身份验证

如何在 Spring Boot 中使用 RESTful 和基本身份验证