- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我希望我的服务器是 ResourceServer,它可以接受承载访问 token
但是,如果这样的 token 不存在,我想使用 OAuth2Server 来验证我的用户。
我尝试这样做:
@Configuration
@EnableOAuth2Sso
@EnableResourceServer
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated();
}
}
但是,在这种情况下,只有 @EnableResourceServer
注释有效。它返回
Full authentication is required to access this resource
并且不要将我重定向到登录页面
我提到 @Order
很重要,如果我添加 @Order(0)
注释,我将被重定向到登录页面,但是,我无法使用 Http header 中的 access_token 访问我的资源:
Authorization : Bearer 142042b2-342f-4f19-8f53-bea0bae061fc
我怎样才能实现我的目标?我希望它同时使用访问 token 和 SSO。
谢谢~
最佳答案
在同一个请求上同时使用这两种配置是不明确的。可能有一些解决方案,但更清楚地定义单独的请求组:
为此,请使用请求匹配器将配置分开:
@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Bean("resourceServerRequestMatcher")
public RequestMatcher resources() {
return new AntPathRequestMatcher("/resources/**");
}
@Override
public void configure(final HttpSecurity http) throws Exception {
http
.requestMatcher(resources()).authorizeRequests()
.anyRequest().authenticated();
}
}
并从 sso 过滤器链中排除这些:
@Configuration
@EnableOAuth2Sso
public class SsoSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("resourceServerRequestMatcher")
private RequestMatcher resources;
@Override
protected void configure(final HttpSecurity http) throws Exception {
RequestMatcher nonResoures = new NegatedRequestMatcher(resources);
http
.requestMatcher(nonResoures).authorizeRequests()
.anyRequest().authenticated();
}
}
并将你所有的资源放在 /resources/**
当然,在这种情况下,两者都将使用相同的 oauth2 配置(accessTokenUri
、jwt.key-value
等)
更新1:
实际上您可以通过使用此请求匹配器进行上述配置来实现您的原始目标:
new RequestHeaderRequestMatcher("Authorization")
更新 2:(@sid-morad 评论的解释)
Spring Security 为每个配置创建一个过滤器链。每个过滤器链的请求匹配器按照配置的顺序进行评估。WebSecurityConfigurerAdapter
默认顺序为 100,ResourceServerConfiguration
默认顺序为 3。这意味着首先评估 ResourceServerConfiguration
的请求匹配器。对于这些配置,可以覆盖此顺序,例如:
@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Autowired
private org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfiguration configuration;
@PostConstruct
public void setSecurityConfigurerOrder() {
configuration.setOrder(3);
}
...
}
@Configuration
@EnableOAuth2Sso
@Order(100)
public class SsoSecurityConfiguration extends WebSecurityConfigurerAdapter {
...
}
所以是的,上述示例中的 SsoSecurityConfiguration
不需要请求匹配器。但很高兴知道背后的原因:)
关于Spring Boot 1.3.3 同时使用@EnableResourceServer 和@EnableOAuth2Sso,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37059128/
我是一名优秀的程序员,十分优秀!