Spring oauth2 InsufficientAuthenticationException

Posted

技术标签:

【中文标题】Spring oauth2 InsufficientAuthenticationException【英文标题】: 【发布时间】:2015-02-03 07:33:35 【问题描述】:

具有以下基于 web.xml 类的配置:

public class WebApp extends AbstractDispatcherServletInitializer 

    @Override
    protected WebApplicationContext createServletApplicationContext() 
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.scan(ClassUtils.getPackageName(getClass()));
        return context;
    

    @Override
    protected String[] getServletMappings() 
        return new String[]"/api/*";
    

    @Override
    protected WebApplicationContext createRootApplicationContext() 
        return null;
    

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException 
        super.onStartup(servletContext);
        DelegatingFilterProxy filter = new DelegatingFilterProxy("springSecurityFilterChain");
        filter.setServletContext(servletContext);
        filter.setContextAttribute("org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcher");
        servletContext.addFilter("springSecurityFilterChain", filter).addMappingForUrlPatterns(null, false, "/api/*");
    


当尝试访问其中一个 oauth 端点时,我得到以下结果:

curl -u core:secret "http://localhost:8081/api/oauth/token?client_id=core&grant_type=password&username=user&password=123&response_type=token&scope=admin" 

"error":"unauthorized","error_description":"There is no client authentication. Try adding an appropriate authentication filter."%

奇怪的是,当我将 servlet 的映射从 /api/* 更改为 / 时,它按预期工作。所以肯定有什么问题,但我一无所知?

【问题讨论】:

【参考方案1】:

解决此问题的方法之一可能是检查您在security.xml 中的身份验证服务器的模式设置:

    <http pattern="/oauth/token"
      create-session="stateless"
      authentication-manager-ref="clientAuthenticationManager"
      use-expressions="true"
      xmlns="http://www.springframework.org/schema/security">

如果你的 servlet 回答请求的 /api/* 时没问题,我想你需要检查你的模式,并从身份验证服务器模式中的链接中删除 api:将 pattern="/api/oauth/token" 更改为 pattern="/oauth/token"

【讨论】:

【参考方案2】:

您可以在FrameworkHandlerMapping 中设置前缀,例如通过AuthorizationServerEndpointsConfigurer

@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter 
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception 
        String prefix = "/api";
        endpoints.prefix(prefix);
    

【讨论】:

以上是关于Spring oauth2 InsufficientAuthenticationException的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security---Oauth2详解

Spring OAuth2.0 - 动态注册 OAuth2.0 客户端

Spring安全中的Oauth2客户端

Spring Cloud Oauth2 初探

OAuth2 Spring Security - OAuth2AuthenticationProcessingFilter 不起作用

Spring 5,401 返回后带有 Google 刷新访问令牌的 OAuth2