Jersey的ContainerRequestContext在Spring中的等价物及SecurityContext获取
Spring MVC中获取SecurityContext的等价方案
当然有啦!在Spring MVC里,你完全可以实现和Jersey中ContainerRequestContext.getSecurityContext()一样的效果,而且方式还挺灵活的,给你整理几个常用的方法:
- 直接注入
SecurityContext到控制器方法参数
这是最直观的方式,Spring会自动把当前请求对应的安全上下文注入到方法参数中,用法和Jersey里的调用逻辑几乎一致:
@GetMapping("/demo") public String getDemoInfo(SecurityContext securityContext) { Authentication currentAuth = securityContext.getAuthentication(); // 这里就可以获取当前用户的认证信息、权限等内容了 return "demo-response"; }
- 使用
SecurityContextHolder静态工具类
如果不想在方法参数里注入,也可以用Spring Security提供的全局静态工具类,随时随地获取当前线程绑定的SecurityContext:
@GetMapping("/demo") public String getDemoInfo() { SecurityContext securityContext = SecurityContextHolder.getContext(); Authentication currentAuth = securityContext.getAuthentication(); // 同样能拿到你需要的安全信息 return "demo-response"; }
注意:在Web请求场景下,Spring已经帮你处理好了线程绑定的逻辑,不用担心线程安全问题。
- 通过
HttpServletRequest间接获取
SecurityContext会被绑定到当前请求的属性中,所以也可以通过HttpServletRequest来获取,不过这种方式相对繁琐一些,一般更推荐前两种:
@GetMapping("/demo") public String getDemoInfo(HttpServletRequest request) { SecurityContext securityContext = (SecurityContext) request.getAttribute("SPRING_SECURITY_CONTEXT"); Authentication currentAuth = securityContext.getAuthentication(); return "demo-response"; }
简单总结下:Spring MVC里没有和Jersey的ContainerRequestContext完全一一对应的组件,但获取SecurityContext的方式更灵活,上面几种方案都能满足你的需求,本质都是获取当前请求的安全上下文信息。
内容的提问来源于stack exchange,提问作者user9176614
相关产品推荐
相关产品推荐

