添加 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