Spring Security 的 servletApi() 支持很棒。
我想像这样注入自定义主体:
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 支持Principal
在ServletRequestMethodArgumentResolver
.
它正在注入本金:
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;
}
因为 anAuthentication
也是Principal
. (到目前为止,我不喜欢 Spring Security 的唯一部分。我也会问这个单独的问题。)
这导致了一个问题。因为Authentication
是 aPrincipal
不是UserPrincipal
。
我该如何解决这个问题?我是否也需要实现作为 UserPrincipal 的身份验证?或者我应该更改 HandlerMethodArgumentResolver 命令来创建自定义解析器吗?(这对于 Spring MVC 来说并不容易,因为内部处理程序具有更高的优先级。)
作为额外信息:
我正在使用 Spring Security M2,我的配置AuthenticationManagerBuilder
很简单:
@Override
protected void registerAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(detailsService);
}
有什么帮助吗?