【问题标题】:Spring security context and @Repository beanSpring 安全上下文和 @Repository bean
【发布时间】:2017-08-10 07:34:31
【问题描述】:

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

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案1】:

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

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

    【讨论】:

    • 请问,您描述的场景与我提供的场景(控制器 -> 服务 -> 存储库)如何吻合?
    • 在简单的情况下很好,但您询问了多线程。我描述了潜在的问题。一般来说,最好保留层,这样您就可以从控制器获取身份验证并将其传递给服务,并作为参数而不是直接访问更深地传递给存储库。
    猜你喜欢
    • 2015-03-27
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2012-09-02
    • 2011-05-29
    相关资源
    最近更新 更多