如何在不使用身份验证的情况下保护 RESTful Web 服务

Posted

技术标签:

【中文标题】如何在不使用身份验证的情况下保护 RESTful Web 服务【英文标题】:How to secure restful webservice without using authentication 【发布时间】:2015-12-20 21:30:06 【问题描述】:

谁能告诉我有什么方法可以保护使用spring rest在spring boot项目中编写的restful web服务(没有用户凭据检查,因为该服务是由位于不同服务器上的远程应用程序调用的)

问题陈述:

我有一个休息类和一个方法,应该由另一个远程应用程序访问。远程应用程序不会发送除正文内容和内容类型之外的任何内容。在这种情况下,我怎样才能保护这个休息服务,以便只能由那个特定的远程应用程序访问服务。

@RequestMapping("/rest")
@RestController 
public class WorkflowController 

    @RequestMapping(value = "ticket/create", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    @ResponseStatus(HttpStatus.CREATED)
    @ResponseBody
    public Long startWorkflow(@RequestBody TicketInfo ticketInfo) 
        ...//DO SOMETHING

        Long id = 1L;

        return id; // return some long value
    


请提出实现这一目标的方法。 提前致谢

【问题讨论】:

【参考方案1】:

好的,所以我不知道我是否完全理解您的问题,但我会假设不同的情况。 假设您的客户端应用程序位于 静态 ip 你可以创建一个过滤器和一个 IP 地址白名单,这真的很简单,而且可能还不够好。

如果不是这样,您可以使用 GET 或 POST 参数并再次创建过滤器,您必须在第一次调用中发送身份验证字符串以获取身份验证。您还必须实现身份验证管理器。

        if(hsr.getParameter("ex_code") != null) 
            String exCode= hsr.getParameter("ex_code");


            String userToken = new String( Base64.getDecoder().decode(hsr.getParameter("ex_code")));

            PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken(serviceThatReturnsAUserDetailsFacade.loadUserByUsername(userToken),
                    exCode);

            token.setDetails(authenticationDetailsSource.buildDetails((HttpServletRequest) request));

            try 


                authentication = authenticationManager.authenticate(token);
             ....

【讨论】:

我无法通过身份验证机制保护我的 Web 服务,因为我的应用程序不会包含其他应用程序的用户详细信息。我想知道如何在我的应用程序和其他应用程序之间安全地共享我的 Web 服务?你能告诉我最好的方法吗? 如果不需要认证,可以使用 SSL。如果您使用的是 spring-boot,您可以通过编辑属性文件轻松实现此目的。客户可以拿到钥匙。【参考方案2】:

如果您不想实现任何安全性并且只想验证主机和端口(只有一个应用程序可以在特定主机和端口上运行)并假设您使用 Spring,那么您可以简单地从传入的 HttpServletRequest 获取以下内容: -

a) RemoteAddr -> IP address of machine from which request originated.
b) RemoteHost -> Host name of machine from which request originated.
c) RemotePort -> Port of machine from which request originated.

有一个接口方法可以验证这个&如果有效则允许它通过,如果无效则返回相应的错误消息给客户端。

除此之外,还有另一个选项也称为“匿名授权”,详细信息为 here。

【讨论】:

我想实现安全,但用户不会传递用户名和密码。注意:我的应用程序不会有其他应用程序的用户详细信息,因此我无法基于身份验证保护我的 Web 服务 那么在这种情况下如何保护我的 Web 服务?你能告诉我行业标准方法吗? 请检查我上面答案的最后几行以了解您的用例。

以上是关于如何在不使用身份验证的情况下保护 RESTful Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何在不经过注册用户身份验证的情况下保护公共API请求

在不违反 RESTful 原则的情况下,在 Angular 中进行身份验证和授权的最佳实践?

如何在不维护 jsessionid 的情况下在 Spring Boot 中保护 RESTful API

如何在不丢失身份验证的情况下模拟Session.request?

使用第三方身份验证保护资源服务器 RESTful API

在不重新发明***的情况下保护 REST API