从@Repository
bean访问Spring Security上下文是否安全?
我们说我们有一些@Repository
:
public interface FooRep {
Foo getFoo();
}
@Repository
public class FooRepImpl {
public Foo getFoo() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return (Foo)authentication.getDetails();
}
}
它被包装到服务层:
public interface FooService {
Foo getFoo();
}
@Service
public class FooServiceImpl {
@Autowired FooRep fooRep;
public Foo getFoo() {
return fooRep.getFoo();
}
}
让我们说这个方法是从安全的控制器访问的,类似的东西:
@RestController
@Secured
public void FooController {
@Autowired FooService fooSer;
@RequestMapping("/foo");
public Foo getFoo() {
return fooSer.getFoo();
}
}
这是一个非常简化的例子,但逻辑的基本部分就在这里。
请不要问我为什么需要它,不要给我建议如何重组这个架构。
我只需要知道,它是否会导致与多线程使用相关的任何问题?
问题出现了,因为我们遇到的情况是authentication.getDetails()
包含Foo
实例与放置在身份验证拦截器中的实例不同。这很奇怪,看起来不可能。
答案 0 :(得分:0)
有一种情况,例如你开始一个无法访问请求的作业,因此无法访问身份验证信息,但作业仍然使用存储库。
如果您创建一个新线程并再次从该线程访问存储库可能是一个问题。