【发布时间】:2013-07-18 11:38:42
【问题描述】:
servletApi() 对 Spring Security 的支持很棒。
我想像这样注入自定义主体:
public interface UserPrincipal extends Principal {
public Integer getId();
}
@RequestMapping(value = "/")
public ResponseEntity<List<Conversation>> listAfter(UserPrincipal user){
// implementation
}
or
@RequestMapping(value = "/")
public ResponseEntity<List<Conversation>> listAfter(UserPrincipalImpl user){
// implementation
}
Spring 支持在 ServletRequestMethodArgumentResolver 的帮助下注入 Principal 实例。
它是这样注入主体的:
else if (Principal.class.isAssignableFrom(paramType)) {
return request.getUserPrincipal();
}
这是问题开始的地方。 request 是 SecurityContextHolderAwareRequestWrapper 的一个实例。它有一个实现:
@Override
public Principal getUserPrincipal() {
Authentication auth = getAuthentication();
if ((auth == null) || (auth.getPrincipal() == null)) {
return null;
}
return auth;
}
因为Authentication 也是Principal。 (到目前为止,我唯一不喜欢 Spring Security 的部分。我也会单独问这个问题。)
这导致了一个问题。因为Authentication 是Principal 而不是UserPrincipal。
我该如何解决这个问题?我是否也需要实现作为 UserPrincipal 的身份验证?或者我应该更改 HandlerMethodArgumentResolver 命令来创建自定义解析器? (这对于 Spring MVC 来说并不容易,因为内部处理程序具有更高的优先级。)
作为额外信息:
我正在使用 Spring Security M2,我对 AuthenticationManagerBuilder 的配置很简单:
@Override
protected void registerAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(detailsService);
}
有什么帮助吗?
【问题讨论】:
-
这对你有帮助吗:stackoverflow.com/questions/8764545/… -- 是一个稍微不同的问题,但我认为你最终会尝试解决同样的问题。
-
谢谢@Ralph,但它帮不了我。我的情况与那个问题略有不同。有很大的不同,也不喜欢显式的身份验证,这意味着我的模块也必须依赖于 Spring Security。