7.2.12在mvc的Controller里调用Service出错No security context bound to the current thread

7.2.11的时候没有此现象,升级到7.2.12发现在mvc的Controller里调用Service出错No security context bound to the current thread

能不能详细描述一下调用方式和调用过程

image
就是一个RestController的类里调用一个定义好的服务,就报错No security context bound to the current thread

在 controller 里面加上系统身份验证即可。

你发的这个不是给web用的吧,只能在core里用。我这个Controller在web层里。

按文档里的描述
QQ20210319-160652@2x
在每个请求开始的时候都会把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.13解决了问题,应该是这个bug导致的,https://github.com/cuba-platform/cuba/issues/3167

7.2.11测试了下,如果用户登录后调用,不需要手动设置,一切正常。