添加 OAuth2 后 Spring http 安全性停止工作

Posted

技术标签:

【中文标题】添加 OAuth2 后 Spring http 安全性停止工作【英文标题】:Spring http security stop working after adding OAuth2 【发布时间】:2015-11-22 17:38:13 【问题描述】:

我使用 java config 在我的 MVC 项目中添加了 spring 安全过滤器。该项目有一个/home 方法,只允许经过身份验证的用户访问。

@Override
protected void configure(HttpSecurity http) throws Exception 
    http.authorizeRequests().antMatchers("/home").authenticated()
    .and().formLogin()
    .and().httpBasic(); 

按预期工作,当我请求“http://localhost:8080/project/home”时,它会将我踢到“/login”。登录成功后,现在可以查看“/home”了

然后我添加 OAuth2,与 Sparklr2 示例几乎相同的设置

@Configuration
public class OAuthServerConfig 
private static final String RESOURCE_ID = "cpe";



@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter 

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) 
        resources.resourceId(RESOURCE_ID).stateless(false);
    

    @Override
    public void configure(HttpSecurity http) throws Exception 
        // @formatter:off
        http
            // Since we want the protected resources to be accessible in the UI as well we need 
            // session creation to be allowed (it's disabled by default in 2.0.6)
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
        .and()
            .requestMatchers().antMatchers("/device/**", "/oauth/users/**", "/oauth/clients/**","/me")
        .and()
            .authorizeRequests()
                .antMatchers("/me").access("#oauth2.hasScope('read')")                  
                .antMatchers("/device").access("#oauth2.hasScope('read') or (!#oauth2.isOAuth() and hasRole('ROLE_USER'))")                                        
                //.antMatchers("/device/trusted/**").access("#oauth2.hasScope('trust')")
                .antMatchers("/device/user/**").access("#oauth2.hasScope('trust')")                 
                .antMatchers("/device/**").access("#oauth2.hasScope('read') or (!#oauth2.isOAuth() and hasRole('ROLE_USER'))")
                .antMatchers("/device/register").access("#oauth2.hasScope('write') or (!#oauth2.isOAuth() and hasRole('ROLE_USER'))")
                .regexMatchers(HttpMethod.DELETE, "/oauth/users/([^/].*?)/tokens/.*")
                    .access("#oauth2.clientHasRole('ROLE_CLIENT') and (hasRole('ROLE_USER') or #oauth2.isClient()) and #oauth2.hasScope('write')")
                .regexMatchers(HttpMethod.GET, "/oauth/clients/([^/].*?)/users/.*")
                    .access("#oauth2.clientHasRole('ROLE_CLIENT') and (hasRole('ROLE_USER') or #oauth2.isClient()) and #oauth2.hasScope('read')")
                .regexMatchers(HttpMethod.GET, "/oauth/clients/.*")
                    .access("#oauth2.clientHasRole('ROLE_CLIENT') and #oauth2.isClient() and #oauth2.hasScope('read')");
        // @formatter:on
    



@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter 

    @Autowired
    private DataSource dataSource;      
    @Autowired
    private TokenStore tokenStore;
    @Autowired
    private UserApprovalHandler userApprovalHandler;

    @Autowired
    @Qualifier("authenticationManagerBean")
    private AuthenticationManager authenticationManager;

    //needs to be change
    @Value("$tonr.redirect:http://localhost:8080/tonr2/sparklr/redirect")
    private String tonrRedirectUri;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception 

        //JdbcClientDetailsServiceBuilder           
        clients.jdbc(dataSource);           
    

    @Bean
    public TokenStore tokenStore() 
        //return new InMemoryTokenStore();
        return new JdbcTokenStore(dataSource);
    

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception 
        endpoints.tokenStore(tokenStore).userApprovalHandler(userApprovalHandler)
                .authenticationManager(authenticationManager);
    

    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception 
        oauthServer.realm("dragonfly/client");
    



protected static class Stuff 

    @Autowired
    private ClientDetailsService clientDetailsService;

    @Autowired
    private TokenStore tokenStore;

    @Bean
    public ApprovalStore approvalStore() throws Exception 
        TokenApprovalStore store = new TokenApprovalStore();
        store.setTokenStore(tokenStore);
        return store;
    

    @Bean
    @Lazy
    @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
    public DragonflyUserApprovalHandler userApprovalHandler() throws Exception 
        DragonflyUserApprovalHandler handler = new DragonflyUserApprovalHandler();
        handler.setApprovalStore(approvalStore());
        handler.setRequestFactory(new DefaultOAuth2RequestFactory(clientDetailsService));
        handler.setClientDetailsService(clientDetailsService);
        handler.setUseApprovalStore(true);
        return handler;
    

只有 1 个客户详细信息

client.dataSource(dataSource)
    .withClient("my-trusted-client-with-secret")
     .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit")
     .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT")
     .scopes("read", "write", "trust")
     .secret("somesecret");

我在我的 tomcat 服务器上运行它,OAuth 有效,我向/oauth/token 发出请求,它成功地将令牌返回给我。

我重新启动我的应用程序,然后在没有登录的情况下请求/home,它以完整的内容显示我的主页视图,没有登录,我无法理解。这是我请求/home时的服务器日志

它首先尝试匹配具有Order 0 的OAuth 过滤器。未找到匹配项。然后检查会话,没有找到会话,创建一个新的。 然后它说它不是 OAuth 请求,也没有找到令牌。 它继续沿着过滤器链AnonymousAuthenticationFilter,然后授予ROLE_ANONYMOUS,通过它成功响应请求。 这与我的规则相反.antMatchers("/home").authenticated()

这是怎么发生的?

14:40:51.843 [http-nio-8080-exec-6] 调试 o.s.s.w.u.matcher.OrRequestMatcher - 尝试使用 Ant 进行匹配 [pattern='/oauth/token'] 14:40:51.843 [http-nio-8080-exec-6] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配: '/家';反对'/oauth/token' 14:40:51.843 [http-nio-8080-exec-6] 调试 o.s.s.w.u.matcher.OrRequestMatcher - 尝试使用 Ant 进行匹配 [pattern='/oauth/token_key'] 14:40:51.843 [http-nio-8080-exec-6] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配: '/家';反对'/oauth/token_key' 14:40:51.843 [http-nio-8080-exec-6] 调试 o.s.s.w.u.matcher.OrRequestMatcher - 尝试使用 Ant [pattern='/oauth/check_token'] 14:40:51.843 进行匹配 [http-nio-8080-exec-6] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配:'/home';反对'/oauth/check_token' 14:40:51.843 [http-nio-8080-exec-6] 调试 os.s.w.u.matcher.OrRequestMatcher - 未找到匹配项 14:40:51.843 [http-nio-8080-exec-6] 调试 o.s.s.w.u.matcher.OrRequestMatcher - 尝试使用匹配 org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfiguration$NotOAuthRequestMatcher@7926d3d3 14:40:51.843 [http-nio-8080-exec-6] 调试 os.s.w.u.matcher.OrRequestMatcher - 匹配 14:40:51.843 [http-nio-8080-exec-6] 调试 os.security.web.FilterChainProxy - /home 在附加过滤器链中的第 11 个位置;发射过滤器: 'WebAsyncManagerIntegrationFilter' 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.security.web.FilterChainProxy - /home 位于第 2 个位置,共 11 个 额外的过滤器链;发射过滤器: 'SecurityContextPersistenceFilter' 14:40:51.844 [http-nio-8080-exec-6] 调试 os.s.w.c.HttpSessionSecurityContextRepository - 没有 HttpSession 当前存在 14:40:51.844 [http-nio-8080-exec-6] 调试 os.s.w.c.HttpSessionSecurityContextRepository - 没有 SecurityContext 可从 HttpSession 获得:null。将创建一个新的。 14:40:51.844 [http-nio-8080-exec-6] 调试 os.security.web.FilterChainProxy - /home 在 11 的位置 3 额外的过滤器链;触发过滤器:'HeaderWriterFilter' 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.s.w.h.writers.HstsHeaderWriter - 自此不注入 HSTS 标头 它与 requestMatcher 不匹配 org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@3d823ea7 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.security.web.FilterChainProxy - /home 在 11 的第 4 位 额外的过滤器链;触发过滤器:'LogoutFilter' 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配:'/home';反对'/注销' 14:40:51.844 [http-nio-8080-exec-6] 调试 os.security.web.FilterChainProxy - /home 在附加过滤器链中的 11 的第 5 位;发射过滤器: 'OAuth2AuthenticationProcessingFilter' 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.s.o.p.a.BearerTokenExtractor - 令牌 在标题中找不到。尝试请求参数。 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.s.o.p.a.BearerTokenExtractor - 令牌 在请求参数中找不到。不是 OAuth2 请求。 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.s.o.p.a.OAuth2AuthenticationProcessingFilter - 没有令牌 请求,将继续链。 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.security.web.FilterChainProxy - /home 在 11 的位置 6 额外的过滤器链;触发过滤器:'RequestCacheAwareFilter' 14:40:51.844 [http-nio-8080-exec-6] 调试 os.security.web.FilterChainProxy - /home 在 11 的第 7 位 额外的过滤器链;发射过滤器: 'SecurityContextHolderAwareRequestFilter' 14:40:51.844 [http-nio-8080-exec-6] 调试 os.security.web.FilterChainProxy - /home 在附加过滤器链中的第 11 位中的第 8 位;发射过滤器: 'AnonymousAuthenticationFilter' 14:40:51.844 [http-nio-8080-exec-6] 调试 os.s.w.a.AnonymousAuthenticationFilter - 已填充 带有匿名令牌的 SecurityContextHolder: 'org.springframework.security.authentication.AnonymousAuthenticationToken@9055c2bc: 委托人:anonymousUser;凭证:[受保护];已认证: 真的;细节: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: 远程IP地址:0:0:0:0:0:0:0:1;会话ID:空;的确 权威:ROLE_ANONYMOUS' 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.security.web.FilterChainProxy - /home 在 11 中的第 9 位 额外的过滤器链;触发过滤器:'SessionManagementFilter' 14:40:51.844 [http-nio-8080-exec-6] 调试 os.security.web.FilterChainProxy - /home 在 11 的第 10 位 额外的过滤器链;触发过滤器:'ExceptionTranslationFilter' 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.security.web.FilterChainProxy - /home 在 11 中的第 11 位 额外的过滤器链;触发过滤器:'FilterSecurityInterceptor' 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配: '/家';针对 '/me' 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配: '/家';针对 '/device' 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配: '/家';针对 '/device/user/' 14:40:51.844 [http-nio-8080-exec-6] DEBUG o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配: '/家';针对 '/device/' 14:40:51.844 [http-nio-8080-exec-6] DEBUG o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配: '/家';针对 '/device/register' 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.s.w.u.m.RegexRequestMatcher - 检查请求的匹配:'/home';反对 '/oauth/clients/([^/].?)/users/.' 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.s.w.u.m.RegexRequestMatcher - 检查请求的匹配:'/home';反对 '/oauth/clients/.' 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.s.w.a.i.FilterSecurityInterceptor - 公共对象 - 身份验证 未尝试 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.security.web.FilterChainProxy - /home 已到达附加结束 过滤链;继续原链 14:40:51.844 [http-nio-8080-exec-6] 调试 os.web.servlet.DispatcherServlet - 名称为“dispatcher”的 DispatcherServlet 处理 GET 请求 [/蜻蜓/home] 14:40:51.844 [http-nio-8080-exec-6] 调试 o.s.w.s.m.m.a.RequestMappingHandlerMapping - 查找处理程序方法 对于路径 /home 14:40:51.845 [http-nio-8080-exec-6] 调试 o.s.w.s.m.m.a.RequestMappingHandlerMapping - 返回处理程序方法 [公共 java.lang.String com.umedia.Dragonfly.controller.HomeController.home()] 14:40:51.845 [http-nio-8080-exec-6] 调试 o.s.b.f.s.DefaultListableBeanFactory - 返回单例 bean 'homeController' 的缓存实例 14:40:51.845 [http-nio-8080-exec-6] 调试 o.s.web.servlet.DispatcherServlet - Last-Modified 值 [/蜻蜓/home] 是:-1 14:40:51.845 [http-nio-8080-exec-6] 调试 os.web.servlet.DispatcherServlet - 渲染视图 [org.springframework.web.servlet.view.JstlView:名称“家”;网址 [/WEB-INF/views/home.jsp]] 在 DispatcherServlet 中,名称为“dispatcher” 14:40:51.845 [http-nio-8080-exec-6] 调试 o.s.b.f.s.DefaultListableBeanFactory - 返回缓存的实例 单例 bean 'requestDataValueProcessor' 14:40:51.845 [http-nio-8080-exec-6] 调试 o.s.web.servlet.view.JstlView - 转发到资源 [/WEB-INF/views/home.jsp] 中 InternalResourceView 'home' 14:40:51.847 [http-nio-8080-exec-6] 调试 o.s.web.servlet.DispatcherServlet - 成功完成请求 14:40:51.847 [http-nio-8080-exec-6] 调试 o.s.s.w.a.ExceptionTranslationFilter - 链处理正常 14:40:51.847 [http-nio-8080-exec-6] 调试 o.s.s.w.c.HttpSessionSecurityContextRepository - SecurityContext 是 空或内容是匿名的 - 上下文不会存储在 HttpSession。 14:40:51.847 [http-nio-8080-exec-6] 调试 o.s.s.w.c.SecurityContextPersistenceFilter - 现在是 SecurityContextHolder 清除,因为请求处理完成 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.u.matcher.OrRequestMatcher - 尝试使用 Ant [pattern='/oauth/token'] 14:40:51.865 进行匹配 [http-nio-8080-exec-7] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配:'/resources/05.jpg';反对 '/oauth/token' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.u.matcher.OrRequestMatcher - 尝试使用 Ant 进行匹配 [pattern='/oauth/token_key'] 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配: '/resources/05.jpg';反对'/oauth/token_key' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.u.matcher.OrRequestMatcher - 尝试使用 Ant [pattern='/oauth/check_token'] 14:40:51.865 进行匹配 [http-nio-8080-exec-7] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配:'/resources/05.jpg';反对 '/oauth/check_token' 14:40:51.865 [http-nio-8080-exec-7] 调试 os.s.w.u.matcher.OrRequestMatcher - 未找到匹配项 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.u.matcher.OrRequestMatcher - 尝试使用匹配 org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfiguration$NotOAuthRequestMatcher@7926d3d3 14:40:51.865 [http-nio-8080-exec-7] 调试 os.s.w.u.matcher.OrRequestMatcher - 匹配 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.security.web.FilterChainProxy - /resources/05.jpg 位于附加过滤器链中 11 的第 1 位; 触发过滤器:'WebAsyncManagerIntegrationFilter' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.security.web.FilterChainProxy - /resources/05.jpg 位于附加过滤器链中第 11 个位置的第 2 位; 触发过滤器:'SecurityContextPersistenceFilter' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.c.HttpSessionSecurityContextRepository - HttpSession 返回 SPRING_SECURITY_CONTEXT 14:40:51.865 的空对象 [http-nio-8080-exec-7] 调试 os.s.w.c.HttpSessionSecurityContextRepository - 没有 SecurityContext 可从 HttpSession 获得: org.apache.catalina.session.StandardSessionFacade@ba8ab6a。一个新的 将被创建。 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.security.web.FilterChainProxy - /resources/05.jpg 在位置 3 11 个附加过滤器链;触发过滤器:'HeaderWriterFilter' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.h.writers.HstsHeaderWriter - 自此不注入 HSTS 标头 它与 requestMatcher 不匹配 org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@3d823ea7 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.security.web.FilterChainProxy - /resources/05.jpg 在位置 4 11 个附加过滤器链;触发过滤器:'LogoutFilter' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配: '/resources/05.jpg';反对“/注销” 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.security.web.FilterChainProxy - /resources/05.jpg 位于附加过滤器链中 11 个位置的第 5 位; 触发过滤器:'OAuth2AuthenticationProcessingFilter' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.o.p.a.BearerTokenExtractor - 令牌 在标题中找不到。尝试请求参数。 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.o.p.a.BearerTokenExtractor - 令牌 在请求参数中找不到。不是 OAuth2 请求。 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.o.p.a.OAuth2AuthenticationProcessingFilter - 没有令牌 请求,将继续链。 14:40:51.865 [http-nio-8080-exec-7] 调试 os.security.web.FilterChainProxy - /resources/05.jpg at 附加过滤器链中 11 个中的第 6 位;发射过滤器: 'RequestCacheAwareFilter' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.security.web.FilterChainProxy - /resources/05.jpg 在位置 7 11 个附加过滤器链;发射过滤器: 'SecurityContextHolderAwareRequestFilter' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.security.web.FilterChainProxy - /resources/05.jpg 位于附加过滤器链中 11 个位置的第 8 位; 触发过滤器:'AnonymousAuthenticationFilter' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.a.AnonymousAuthenticationFilter - 使用匿名令牌填充 SecurityContextHolder: 'org.springframework.security.authentication.AnonymousAuthenticationToken@6faeba70: 委托人:anonymousUser;凭证:[受保护];已认证: 真的;细节: org.springframework.security.web.authentication.WebAuthenticationDetails@fffbcba8: 远程IP地址:0:0:0:0:0:0:0:1;会话 ID: 737F9CEEE6747FABCB433614EF76CF3B;授予权限:ROLE_ANONYMOUS' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.security.web.FilterChainProxy - /resources/05.jpg 在位置 9 11 个附加过滤器链;发射过滤器: 'SessionManagementFilter' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.security.web.FilterChainProxy - /resources/05.jpg 在位置 10 附加过滤器链中的 11 个;发射过滤器: 'ExceptionTranslationFilter' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.security.web.FilterChainProxy - /resources/05.jpg 在位置 11 附加过滤器链中的 11 个;发射过滤器: 'FilterSecurityInterceptor' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配: '/resources/05.jpg';反对 '/me' 14:40:51.865 [http-nio-8080-exec-7] DEBUG o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配: '/resources/05.jpg';针对 '/device' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配:'/resources/05.jpg';反对 '/device/user/' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配: '/resources/05.jpg';针对 '/device/' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.u.m.AntPathRequestMatcher - 检查请求的匹配:'/resources/05.jpg';反对 '/device/register' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.u.m.RegexRequestMatcher - 检查请求的匹配: '/resources/05.jpg';反对 '/oauth/clients/([^/].?)/users/.' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.u.m.RegexRequestMatcher - 检查请求的匹配: '/resources/05.jpg';反对 '/oauth/clients/.' 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.s.w.a.i.FilterSecurityInterceptor - 公共对象 - 未尝试身份验证 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.security.web.FilterChainProxy - /resources/05.jpg 到达附加过滤器链的末尾;进行中 原始链 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.web.servlet.DispatcherServlet - 带名称的 DispatcherServlet 'dispatcher' 处理 [/Dragonfly/resources/05.jpg] 的 GET 请求 14:40:51.865 [http-nio-8080-exec-7] 调试 o.s.w.s.m.m.a.RequestMappingHandlerMapping - 查找处理程序方法 对于路径 /resources/05.jpg 14:40:51.866 [http-nio-8080-exec-7] 调试 o.s.w.s.m.m.a.RequestMappingHandlerMapping - 没有找到处理程序 [/resources/05.jpg] 14:40:51.866 [http-nio-8080-exec-7] 的方法 调试 o.s.s.o.p.e.FrameworkEndpointHandlerMapping - 查找处理程序 路径 /resources/05.jpg 14:40:51.866 [http-nio-8080-exec-7] 的方法 调试 o.s.s.o.p.e.FrameworkEndpointHandlerMapping - 没有找到 [/resources/05.jpg] 14:40:51.866 的处理程序方法 [http-nio-8080-exec-7] 调试 o.s.w.s.h.SimpleUrlHandlerMapping - 请求的匹配模式 [/resources/05.jpg] 是 [/resources/**] 14:40:51.866 [http-nio-8080-exec-7] 调试 o.s.w.s.h.SimpleUrlHandlerMapping - 请求的 URI 模板变量 [/resources/05.jpg] 是 14:40:51.866 [http-nio-8080-exec-7] 调试 o.s.w.s.h.SimpleUrlHandlerMapping - 将 [/resources/05.jpg] 映射到 带有处理程序的 HandlerExecutionChain [ResourceHttpRequestHandler [locations=[ServletContext 资源 [/resources/]], 解析器=[org.springframework.web.servlet.resource.PathResourceResolver@20458412]]] 和 1 个拦截器 14:40:51.866 [http-nio-8080-exec-7] 调试 o.s.web.servlet.DispatcherServlet - Last-Modified 值 [/Dragonfly/resources/05.jpg] 为:-1 14:40:51.867 [http-nio-8080-exec-7] 调试 os.web.servlet.DispatcherServlet - Null ModelAndView 返回到 DispatcherServlet,名称为“dispatcher”: 假设 HandlerAdapter 完成请求处理 14:40:51.867 [http-nio-8080-exec-7] 调试 os.web.servlet.DispatcherServlet - 成功完成请求 14:40:51.867 [http-nio-8080-exec-7] DEBUG o.s.s.w.a.ExceptionTranslationFilter - 链处理正常 14:40:51.867 [http-nio-8080-exec-7] 调试 o.s.s.w.c.HttpSessionSecurityContextRepository - SecurityContext 是 空或内容是匿名的 - 上下文不会存储在 HttpSession。 14:40:51.867 [http-nio-8080-exec-7] 调试 o.s.s.w.c.SecurityContextPersistenceFilter - 现在是 SecurityContextHolder 清除,因为请求处理完成

【问题讨论】:

我有一个 *** 不允许我发布的日志,它说它看起来像垃圾邮件。 您有多个 HttpSecurity 配置,在您的安全配置类中使用 @Order(1) 过滤 /home。在这里查看我的答案***.com/questions/32206843/… 你是对的,这正是问题所在。我知道 OAuth2 正在使用 Order(0),但我不知道我必须指定 Order(1) 才能使用它。非常感谢。 在测试我的 oauth 资源后,将 Order(1) 添加到我的安全性将破坏我的 oauth 资源保护。也就是说,我在ResourceServerConfiguration 中的所有安全设置都被跳过了。我的 oauth 资源现在无需任何身份验证和授权即可访问。也许需要做其他事情来处理这个 Order(1)? 您的订单价值应该在 3 以上,这是因为 OAuth 的 order=3。尝试用Order(4)注释它 【参考方案1】:

您的项目设置和 pom 配置似乎有问题

    您添加了 Spring Boot 依赖项,但未使用 Spring Boot。 您的项目是打包为 jar,但您有 WEB-INF 并使用 WebApplicationInitializer 而不是 spring boot 你的 pom 依赖是错误的

我修改了几处:

    移动WebContent文件夹并将其重命名为src/main/webapp

    更新你的 pom 配置

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.umedia</groupId>
    <artifactId>Dragonfly</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    
    <name>Dragonfly</name>
    <url>http://maven.apache.org</url>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.4.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.4.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.4-1201-jdbc41</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
            <version>2.0.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>1.1.7</version>
        </dependency>
    
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.0</version>
                <configuration>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
        <finalName>liveBLE</finalName>
    </build>
    </project>
    

使用mvn tomcat7:run 运行它。如果我访问/home,我将被重定向到登录页面,如果我访问/device,我将获得

<oauth>
<error_description>
Full authentication is required to access this resource
</error_description>
<error>unauthorized</error>
</oauth>

这是使用 OAuth 和 Spring 安全性的预期行为。

【讨论】:

Mang,你是对的,你修复得很好。我不知道我的项目设置弄乱了弹簧安全性,这是我的错。我真的不知道如何打包一个项目,我会继续努力的。非常感谢 我已经进一步测试了这个,使用war包和tomcat7:运行,它按预期运行。如果我使用 eclipse m2eclipse 插件调试项目战争,并以 java 1.8 为目标,问题仍然存在。那可能是插件问题还是java 1.8问题?你能在服务器上用 eclipse debug 测试一下吗? 你在eclipse中使用的tomcat版本是什么?我曾尝试在 Eclipse 中使用 jdk 1.8 和 tomcat 8 并且仍然有效。如果您使用 jdk 1.8 和 tomcat 7 虽然***.com/questions/23541532/… 运行,则会出现一些问题

以上是关于添加 OAuth2 后 Spring http 安全性停止工作的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security OAuth2 - 将参数添加到授权 URL

如何在spring + java中添加(覆盖)oAuth2访问令牌的到期时间

使用oauth2的Spring安全性向授权URL添加其他参数?

无法使用 access_token 访问资源:spring boot Oauth2

如何在 Spring Boot 2.x 中将 CORS 添加到 oauth2/resource 服务器?

Oauth2 Spring 中的更改响应