Spring安全上下文和@Repository bean

时间:2017-08-10 07:34:31

标签: java spring spring-mvc spring-security

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

1 个答案:

答案 0 :(得分:0)

有一种情况,例如你开始一个无法访问请求的作业,因此无法访问身份验证信息,但作业仍然使用存储库。

如果您创建一个新线程并再次从该线程访问存储库可能是一个问题。