Spring Security 假设 Authentication 是 Principal 。
public interface Authentication extends Principal, Serializable {}
HttpServletRequest 有getUserPrincipal的方法负责访问主体对象
让我们考虑这种情况:
public interface RealPrincipal extends Principal {
public Integer getId();
}
公共模块 A 具有 Real Principal 接口和实现。
Module A 使用 Common Module A,Servlet Api,不依赖 Spring Security:
Module B 使用 Common Module 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 负责安全性。