如何在 RestController 中获取 header 值并将其传递给 parent 控制器

How to get a header value in a RestController and pass it to the parent controller

我是 spring-boot 的新手,也是网络服务的新手。

我想在(抽象的)通用 RestController 中实现授权过程,它应该获取 basic-auth 的内容。 header来自扩展控制器,然后执行授权。

类似的东西:

public class GenericController
{
  // Constructor 
  protected GenericController(String basicAuth) throws MalformedURLException, ProtocolException, IOException
  {
    // check user can execute action
  }
}


@RestController
@RequestMapping( "/users" )
public class UserController extends GenericController
{
  private static final Logger logger = LoggerFactory.getLogger(UserController.class);
  
  // Constructor
  protected UserController() throws MalformedURLException, ProtocolException, IOException
  {
    // somehow get the basic auth information from header and pass it to the parent's constructor
    basicAuth = ???
    
    super(basicAuth);
  }

  @GetMapping( "/user/{cn}" )
  public String getUser( @PathVariable String cn )
  {
    logger.error("Start getUser(...): cn=" + cn);

  }

我该怎么做? (这可能吗?)

补充信息: 我的网络服务本身就是其他网络服务的消费者。

一旦调用用户被授权“使用”我的 Web 服务,我必须 forward/set 将基本身份验证添加到我调用的 Web 服务的请求中。

那么,how/where 我可以在调用我的服务时“拦截”并获取 header 吗?

您可以使用 HttpServletRequest 从请求中获取 header。

 protected UserController(HttpServletRequest httpServletRequest) throws MalformedURLException, ProtocolException, IOException
    {

        System.out.println( httpServletRequest.getHeaders("key name"));
        // somehow get the basic auth information from header and pass it to the parent's constructor
        basicAuth = ???

        super(basicAuth);
    }

我建议看一下 Spring Security framework. There are many tutorials showing how to configure it to perform basic authentication, e.g.: here

主要思想是将身份验证/授权问题与控制器和业务逻辑代码分离。为了实现这个过滤器,使用了拦截每个请求并根据不同条件对其进行验证的过滤器。实现无状态 REST-service(每个请求都独立于其他请求)时并不难。在处理会话时,逻辑会变得复杂得多。 Spring 安全实现过滤器链,由多个过滤器组成,每个过滤器执行自己的检查。

Spring安全性在spring-based项目中用的非常多,绝对值得一看,虽然第一次接触可能会觉得有点难