7.2.11的时候没有此现象,升级到7.2.12发现在mvc的Controller里调用Service出错No security context bound to the current thread
能不能详细描述一下调用方式和调用过程
就是一个RestController的类里调用一个定义好的服务,就报错No security context bound to the current thread
你发的这个不是给web用的吧,只能在core里用。我这个Controller在web层里。
按文档里的描述
在每个请求开始的时候都会把SecurityContext塞到线程里,7.2.11的确也是好的,就是升级到7.2.12才会有这个问题,你们自己写个简单的测试样例就能重现问题了。
SecurityContext
类实例存储关于当前执行线程的用户会话信息。它在以下情况下被创建并传递给AppContext.setSecurityContext()
方法:
- 对于 Web 客户端 block 和 Web 门户 block - 在开始处理用户浏览器的每个 HTTP 请求时。
按文档说法,框架会自动给你设置,不应该出问题
我在 7.2.11 测试同样有这个问题。用下面代码可以解决:
@RequestMapping("/test")
@RestController
@CrossOrigin
public class TestController {
@Inject
TestService testService;
@Inject
private TrustedClientService trustedClientService;
@Inject
private RestApiConfig restApiConfig;
// GET at localhost:8080/app/rest/test/testMethod
@GetMapping("/testMethod")
public List<User> testMethod() {
UserSession anonymousSession = trustedClientService.getAnonymousSession(restApiConfig.getTrustedClientPassword(),
restApiConfig.getSecurityScope());
AppContext.setSecurityContext(new SecurityContext(anonymousSession));
try {
return testService.testMethod();
} finally {
AppContext.setSecurityContext(null);
}
}
}
也就是说自己写MVC没法获得当前用户信息了?这不对吧,之前好像都是可以的。
应该是一直需要手动添加安全上下文,因为是 spring mvc 的 controller,不在 cuba 定义的 rest 范围。论坛有过类似的帖子:
7.2.11测试了下,如果用户登录后调用,不需要手动设置,一切正常。