如何在不使用身份验证的情况下保护 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 服务的主要内容,如果未能解决你的问题,请参考以下文章
在不违反 RESTful 原则的情况下,在 Angular 中进行身份验证和授权的最佳实践?
如何在不维护 jsessionid 的情况下在 Spring Boot 中保护 RESTful API