Spring Security HeaderPreAuthentication Principal未从@AuthenticationPrincipal解析

时间:2015-01-13 16:43:38

标签: java spring spring-security spring-boot pre-authentication

我有一个现有的Spring Boot应用程序,它对第三方认证服务处理的Web应用程序进行身份验证。与SiteMinder一样,第三方服务会在HTTP请求中注入标头,例如USER_HEADER。我的任务是配置现有应用程序以提取此HTTP标头,并通过Spring Security @AuthenticatedPrincipal注释使得生成的Auth对象可供MVC层控制器使用。

如上所述,project是一个Spring Boot应用程序,版本为1.1.9.RELEASE,带有Java 8。

(下面显示的代码来自反映功能的测试项目)

请注意,此应用程序仅限Java Config。不允许使用XML(我的主管授权)

通过挖掘Spring Security reference和其他各种文章,我知道我需要使用RequestHeaderAuthenticationFilter并将其注入过滤器链以从请求标头中获取用户名。

过滤器:

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创建,用户业务对象作为主体注入到令牌中,最终将token分配给SecurityContext:     SecurityContextHolder.getContext()setAuthentication(主要);

但是,当我使用@AuthenticationPrincipal User user注释我的Controller方法时,返回的User对象是一个null< user用户对象。当我将方法参数更改为Authentication user并显式调用user.getPrincipal()时,我得到的用户对象就好了。 @AuthenticationPrincipal是否有这样的失败原因?

谢谢,如果需要更多详细信息,请告诉我们!

1 个答案:

答案 0 :(得分:0)

@AuthenticationPrincipal未解决的原因是因为我没有使用@EnableWebMvcSecurity

注释我的WebSecurityConfigurerAdapter类

添加此注释解决了问题