如何在 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项目中用的非常多,绝对值得一看,虽然第一次接触可能会觉得有点难
我是 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项目中用的非常多,绝对值得一看,虽然第一次接触可能会觉得有点难