我正在使用Spring Boot组装一个REST api,它将通过OAuth2保护。我有一个安全的应用程序,它可以很好地管理jwt令牌。
我正在整理一个单独的应用程序,该应用程序将处理一些常规用户配置文件资源请求,例如忘记密码,注册和配置文件获取操作。这是使用EnableOAuth2Resource注释的,它正确地将OAuth2AuthenticationProcessingFilter添加到过滤器链。
@SpringBootApplication
@EnableOAuth2Resource
public class ProfileApplication extends SpringBootServletInitializer {
public static void main(String[] args) throws IOException {
SpringApplication.run(ProfileApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(ProfileApplication.class);
}
}
我面临的挑战是,我无法找到配置安全性的方法,以便对来自/ profiles端点的POST请求不安全,而对GET或PUT的请求从提供的承载令牌传递派生的@AuthenticationPrincipal。
我想在API中使用以下内容 POST / profile创建一个新用户 - 没有安全性 GET / profile / {id}按ID获取用户 - 需要管理员权限或用户是authd POST /密码/重置 - 启动密码重置 - 无安全性
我有以下bean来配置安全性
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Order(-10) //SecurityProperties.ACCESS_OVERRIDE_ORDER)
class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/", "/public/**").permitAll()
.antMatchers(HttpMethod.POST, "/profiles/**").permitAll()
.antMatchers(HttpMethod.GET, "/profiles/**").fullyAuthenticated()
.antMatchers("/password/**").permitAll()
.anyRequest().fullyAuthenticated()
.and()
.csrf().disable();
}
}
使用上面的GET端点调用失败,出现403错误,没有任何尝试从令牌中查找当前用户但是帖子将通过。查看日志,我不再在过滤器链中看到OAuth2AuthenticationProcessingFilter。我尝试添加一些额外的过滤器似乎导致它不再被注册。
此控制器方法如下所示:
@RequestMapping(method = {RequestMethod.GET}, value="/profiles/{login:.+}")
@ResponseBody
public ResponseEntity<Profile> get(@AuthenticationPrincipal Principal currentUser, @PathVariable String login) {
如果我将订单设置为SecurityProperties.ACCESS_OVERRIDE_ORDER,那么GET请求会起作用,我会看到基于jwt承载令牌中的配置文件对我的oauth服务进行查找,但是对配置文件或密码控制器的POST请求失败,并且401因此,似乎代码永远不会到达此过滤器,而是被OAuth2AuthenticationProcessingFilter截获,并且请求无法通过授权进行授权。
使用@ EnableOAuth2Resource时,有没有办法部分保护Spring Boot应用程序?我是否必须设置不同的配置bean以提供必要的覆盖,如果是,则基于什么接口?
答案 0 :(得分:3)
我认为您应该从oauth2
中的请求匹配器移动SecurityConfig
资源,并允许资源服务器过滤器处理它们 - 正在扩展ResourceServerConfigurerAdapter
的类。 / p>
我的回答是受到Dave Syer给出的答案的启发here。您可以找到一个好的安全配置here。
或者尝试向bean发出更高的订单。
答案 1 :(得分:2)
@ maleenc上面的建议是正确的。我错过了以下ResourceServerConfigurerAdapter。添加我的OAuth2ServerConfiguration类并删除其他安全过滤器解决了我的问题
@Configuration
public class OAuth2ServerConfiguration {
@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/", "/public/**").permitAll()
.antMatchers("/password/**").permitAll()
.antMatchers(HttpMethod.POST, "/profiles").permitAll()
.and()
.csrf().disable();
}
}
}