Spring Security假设身份验证是一个主体。
public interface Authentication extends Principal, Serializable {}HttpServletRequest有getUserPrincipal方法,负责访问主体对象。
让我们考虑一下这个案例:
public interface RealPrincipal extends Principal {
public Integer getId();
}公共模块A有真正的主体接口和实现。
模块A使用公共模块A,Servlet Api,不依赖于Spring Security:
模块B使用公共模块A,Servlet Api,并配置Spring Security。此模块负责安全和UserDetails实现。
Web A使用模块A和模块B。
为了使用请求方法,我最终实现了这样一个实现:
public ModelAndView someRequestHandler(Principal principal) {
User activeUser = (User) ((Authentication) principal).getPrincipal();
...
}这迫使我对模块A和其他模块依赖Spring Security。我认为正确的servlet api抽象不应该依赖于spring安全性。request.getUserPrincipal应返回实数本金。
请解释为什么org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper返回
身份验证而不是Real Principal。
编辑:我已经将公共模块A添加到我的场景中,并更新了模块B负责安全性。
发布于 2013-07-19 19:04:21
简而言之,Authentication是一个Principal,因此可以在需要API的API(比如您提到的servlet API方法)中使用它。
这在实践中意味着什么?不是很多。Java的Principal接口只有一个方法getName,所以如果您想做的不仅仅是呈现用户名,那么您需要了解更多关于实现的知识。
当您使用“真正的主体”和“适当的servlet api抽象”这两个短语时,您可能应该考虑一下您的意思。例如,如果主体是“真实的”主体,那么如何实现someRequestHandler方法呢?
https://stackoverflow.com/questions/17744272
复制相似问题