Spring 未从 @AuthenticationPrincipal 解析安全 HeaderPreAuthentication 主体
Spring Security HeaderPreAuthentication Principal Not Resolved from @AuthenticationPrincipal
我有一个现有的 Spring 启动应用程序,它对由第三方身份验证服务处理的 Web 应用程序进行了身份验证。与 SiteMinder 一样,第 3 方服务将 header 注入 HTTP 请求,例如 USER_HEADER。我的任务是配置现有应用程序以提取此 HTTP header 并通过 Spring 安全性 @AuthenticatedPrincipal
注释使生成的 Auth object 可用于 MVC 层的控制器。
如前所述,项目是一个 Spring 引导应用程序,版本 1.1.9.RELEASE,Java 8.
(下面显示的代码来自一个镜像功能的测试项目)
请注意,此应用程序只是 Java 配置。不允许 XML(我领导的授权)
通过深入研究 Spring Security reference 和其他各种文章,我知道我需要使用 RequestHeaderAuthenticationFilter
并将其注入过滤器链以从请求 header 中获取用户名.
过滤器:
public class HeaderAuthenticationFilter extends RequestHeaderAuthenticationFilter {
private static final Logger logger = LoggerFactory.getLogger(HeaderAuthenticationFilter.class);
private final String HEADER = "USER_HEADER";
public HeaderAuthenticationFilter() {
super();
this.setPrincipalRequestHeader(HEADER);
// This setting returns an HTTP 404 with no error message instead of an HTTP 500 with the "missing header" exception message
this.setExceptionIfHeaderMissing(false);
}
@Override
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
logger.debug("Authorizing URI: " + request.getRequestURI());
try {
return super.getPreAuthenticatedPrincipal(request);
} catch(PreAuthenticatedCredentialsNotFoundException e) {
logger.error("Could not find request header " + HEADER + " in request", e);
return null;
}
}
}
如您所见,非常基本的过滤器。
使用我现在的代码,用户从 HTTP 请求中提取出来,通过 PreAuthentication 过程,其中 PreAuthenticatedAuthenticationToken 由自定义 AuthenticationManager 创建,用户业务 object 被注入到令牌中作为委托人,令牌最终被分配给 SecurityContext:
SecurityContextHolder.getContext().setAuthentication(主体);
然而,当我用 @AuthenticationPrincipal User user
注释我的控制器方法时,返回的用户 object 是一个空的用户 object。当我将方法参数更改为 Authentication user
并显式调用 user.getPrincipal()
时,我得到了用户 object 就好了。 @AuthenticationPrincipal 这样失败是有原因的吗?
谢谢,如果需要更多详细信息,请告诉我!
@AuthenticationPrincipal
没有解析的原因是我没有用 @EnableWebMvcSecurity
注释我的 WebSecurityConfigurerAdapter class
添加此注释解决了问题
我有一个现有的 Spring 启动应用程序,它对由第三方身份验证服务处理的 Web 应用程序进行了身份验证。与 SiteMinder 一样,第 3 方服务将 header 注入 HTTP 请求,例如 USER_HEADER。我的任务是配置现有应用程序以提取此 HTTP header 并通过 Spring 安全性 @AuthenticatedPrincipal
注释使生成的 Auth object 可用于 MVC 层的控制器。
如前所述,项目是一个 Spring 引导应用程序,版本 1.1.9.RELEASE,Java 8.
(下面显示的代码来自一个镜像功能的测试项目)
请注意,此应用程序只是 Java 配置。不允许 XML(我领导的授权)
通过深入研究 Spring Security reference 和其他各种文章,我知道我需要使用 RequestHeaderAuthenticationFilter
并将其注入过滤器链以从请求 header 中获取用户名.
过滤器:
public class HeaderAuthenticationFilter extends RequestHeaderAuthenticationFilter {
private static final Logger logger = LoggerFactory.getLogger(HeaderAuthenticationFilter.class);
private final String HEADER = "USER_HEADER";
public HeaderAuthenticationFilter() {
super();
this.setPrincipalRequestHeader(HEADER);
// This setting returns an HTTP 404 with no error message instead of an HTTP 500 with the "missing header" exception message
this.setExceptionIfHeaderMissing(false);
}
@Override
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
logger.debug("Authorizing URI: " + request.getRequestURI());
try {
return super.getPreAuthenticatedPrincipal(request);
} catch(PreAuthenticatedCredentialsNotFoundException e) {
logger.error("Could not find request header " + HEADER + " in request", e);
return null;
}
}
}
如您所见,非常基本的过滤器。
使用我现在的代码,用户从 HTTP 请求中提取出来,通过 PreAuthentication 过程,其中 PreAuthenticatedAuthenticationToken 由自定义 AuthenticationManager 创建,用户业务 object 被注入到令牌中作为委托人,令牌最终被分配给 SecurityContext: SecurityContextHolder.getContext().setAuthentication(主体);
然而,当我用 @AuthenticationPrincipal User user
注释我的控制器方法时,返回的用户 object 是一个空的用户 object。当我将方法参数更改为 Authentication user
并显式调用 user.getPrincipal()
时,我得到了用户 object 就好了。 @AuthenticationPrincipal 这样失败是有原因的吗?
谢谢,如果需要更多详细信息,请告诉我!
@AuthenticationPrincipal
没有解析的原因是我没有用 @EnableWebMvcSecurity
添加此注释解决了问题