我的任务是构建一个REST服务,该服务需要对一些操作进行身份验证,同时允许其他人使用匿名用户。
例如:
| Path | Requires authentication |
| /add | YES |
| /{name} | NO |
| /report/{id} | YES |
但是我在设置弹簧安全性方面遇到了问题。
如果我覆盖WebSecurityConfigurerAdapter
configure
这样的功能:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.and()
.httpBasic()
.and()
.authorizeRequests()
//.antMatchers(HttpMethod.GET, "/{name}").permitAll() // I can't really specify a dynamic url here, can i?
.anyRequest().authenticated();
}
使用此配置,我调用的任何操作将首先显示标准浏览器基本身份验证弹出窗体。这就是我想要的,除了我不想在动态网址/{name}
操作上这样做。
所以我尝试删除.anyRequest().authenticated()
并激活@PreAuthorize
和@PostAuthorize
注释
@EnableGlobalMethodSecurity(proxyTargetClass = true, prePostEnabled = true)
并向控制器操作添加注释,如下所示:
| Path | Annotation |
| /add | @PreAuthorize("isAuthenticated()") |
| /{name} | @PreAuthorize("permitAll()") |
| /report/{id} | @PreAuthorize("isAuthenticated()") |
使用此/{name}
操作可以按预期允许匿名用户,但/add
和/report/{id}
操作现在只返回"访问被拒绝"状态为500,而不是强制基本身份验证。
如何在选择控制器方法上强制进行基本身份验证,同时允许匿名访问其他方法?
答案 0 :(得分:1)
指定每个网址的配置应该可以解决问题:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.and()
.httpBasic()
.and()
.authorizeRequests()
.antMatchers(HttpMethod.GET, "/*").permitAll()
.antMatchers(HttpMethod.GET, "/add").authenticated()
.antMatchers(HttpMethod.GET, "/report/*").authenticated()
.anyRequest().authenticated();
}