【问题标题】:How to secure restful webservice without using authentication如何在不使用身份验证的情况下保护 RESTful Web 服务
【发布时间】: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
    }

}

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

【问题讨论】:

    标签: web-services rest spring-security spring-boot spring-rest


    【解决方案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 服务?你能告诉我行业标准方法吗?
    • 请检查我上面答案的最后几行以了解您的用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2012-06-19
    • 2016-02-20
    • 1970-01-01
    • 2017-01-29
    • 2013-04-21
    • 2021-07-26
    相关资源
    最近更新 更多