简单的 REST 端点身份验证

Posted

技术标签:

【中文标题】简单的 REST 端点身份验证【英文标题】:Simple REST endpoints authentication 【发布时间】:2019-07-24 22:26:35 【问题描述】:

我正在学习我的端点的安全性,但我搜索的所有内容都包含相当复杂的示例,这并没有真正回答我的问题,而现在,只是为了这个示例项目,我正在寻找一些简单的东西。

我目前的解决方案是让端点返回如下:

return authenticate(request.headers) ? cityService.getCity() : utils.unauthenticatedResponse();

其中 authenticate(request.headers) 检查标头中的令牌。 我想要改进的是在对我的端点的每个请求之前运行该验证方法(除了登录和注册),这样我就可以返回 cityService.getCity(),而且我不必每次都进行检查.

将感谢每一个答案,但请让你容易理解,因为我只是一个初学者。

【问题讨论】:

【参考方案1】:

由于您需要在每个请求之前运行authenticate 方法,因此您需要实现Filter。它非常简单,您可以获得实现过滤器here的步骤和模板。

对端点的每个请求都将首先通过过滤器(这是可配置的),您可以在其中使用 authenticate 方法,然后相应地进一步允许它。

对于初学者,您可以实现如下过滤器:

@Component
public class AuthFilter implements Filter 

    @Override
    public void doFilter
      ServletRequest request, 
      ServletResponse response, 
      FilterChain chain) throws IOException, ServletException 

        HttpServletRequest req = (HttpServletRequest) request;
        if(authenticate(req.getHeaders))
            chain.doFilter(request, response);
         else 
            //else logic, ie throw some exception in case authenticate returns false
        
    


这样做的好处是:

您可以实现多个过滤器 您可以为过滤器提供顺序/优先级 您可以配置哪些端点需要通过过滤器,哪些不需要。

【讨论】:

非常感谢!顺便说一句,这也是保护实际生产应用程序的正确方法,还是您需要使用更复杂的东西? @koxmaxiums 生产级应用程序可以通过实现像上面这样的自定义过滤器并拥有自己的检查令牌的实现来保护,或者通过使用类似 Spring security 的东西来提供预定义的工具来进行身份验证与自定义身份验证一起使用。【参考方案2】:

你可以使用ContainerRequestFilter(如果你使用的是Spring/Tomcat)

每个到达服务器的请求都会经过这个过滤器,所以你可以在其中实现你的代码。

【讨论】:

而且 ContainerRequesrFilter 也可以有一个优先级注解。确保您可以控制何时调用过滤器

以上是关于简单的 REST 端点身份验证的主要内容,如果未能解决你的问题,请参考以下文章

REST端点身份验证的Spring Security意外行为?

如何从 WCS 向 Magnolia Rest 端点进行身份验证

Spring-Boot REST 服务基本 http 身份验证排除一个端点

REST 和服务到服务身份验证

如何使用 Django-oauth-toolkit 使用 Django-rest-framework 测试 API 端点以进行身份​​验证

在 Spring 安全性中使用 rest 服务进行身份验证和授权 [关闭]