Java Spring安全上下文和@Repository bean

Java Spring安全上下文和@Repository bean,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,从@Repositorybean访问Spring安全上下文安全吗 假设我们有一些@存储库: public interface FooRep { Foo getFoo(); } @Repository public class FooRepImpl { public Foo getFoo() { Authentication authentication = SecurityContextHolder.getContext().getAuthenticati

@Repository
bean访问Spring安全上下文安全吗

假设我们有一些
@存储库

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
实例时,该实例与在身份验证拦截器中放置的实例不同。这很奇怪,看起来不可能

有一种情况是,当您启动一个作业时,该作业无法访问请求,因此无法访问身份验证信息,但该作业仍然使用存储库


如果创建一个新线程并再次从该线程访问存储库,则可能会出现问题

有一种情况是,当您启动一个作业时,该作业无法访问请求,因此无法访问身份验证信息,但该作业仍然使用存储库


如果创建一个新线程并再次从该线程访问存储库,则可能会出现问题

请问,您描述的场景与我提供的场景(控制器->服务->存储库)如何一致?在简单的情况下可以,但您询问了多线程。我描述了潜在的问题。一般来说,最好保留层,以便您可以从控制器获得身份验证,并将其作为参数传递到服务和存储库,而不是直接访问。请问,您描述的场景与我提供的场景(控制器->服务->存储库)如何一致?在简单的情况下可以,但您询问了多线程。我描述了潜在的问题。一般来说,最好保留层,这样您就可以从控制器获得身份验证,并将其作为参数传递到服务和存储库,而不是直接访问。