【发布时间】:2013-07-18 15:09:55
【问题描述】:
Spring Security 假设 Authentication 是一个 Principal。
public interface Authentication extends Principal, Serializable {}
HttpServletRequest 有getUserPrincipal 方法,负责访问主体对象。
让我们考虑一下这种情况:
public interface RealPrincipal extends Principal {
public Integer getId();
}
Common Module 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 负责安全性。
【问题讨论】: