我在我的spring boot应用程序中使用openid和spring boot security进行了安全设置。
由于偶然的原因,我忘了将角色类型添加到我的 @PreAuthorize("hasAnyRole('...)")
标记并尝试打电话作为 USER
并被拒绝(403),但我确实在我的securityconfig文件中声明了hasanyrole。一旦我将角色添加到preauth标记中,它就工作了,但我想知道这是否是预期的行为?还是我在安全配置文件中做错了什么?
我正在使用以下spring boot安全设置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
<version>2.2.13.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-openid</artifactId>
</dependency>
网络安全文件
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private JdbcOidcBearerTokenFilter filter;
@Autowired
public WebSecurityConfig(@Value("${security.oauth2.client.wellKnownUrl}") String wellKnown
, @Value("${security.oauth2.client.clientId}") String clientId
, @Value("${security.oauth2.client.clientSecret}") String clientSecret
, EaUserService usersService, LoginService loginService) {
OidcService oidcService = new OidcService(wellKnown, clientId, clientSecret);
this.filter = new JdbcOidcBearerTokenFilter(oidcService, usersService, loginService, "Authorization");
}
@Override
public void configure(WebSecurity webSecurity) {
webSecurity
.ignoring()
.antMatchers("/error", "/403.html");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.addFilterAfter(new OAuth2ClientContextFilter(), AbstractPreAuthenticatedProcessingFilter.class)
.addFilterAfter(this.filter, OAuth2ClientContextFilter.class)
.authorizeRequests()
.antMatchers("/api/login/**", "/static/**").permitAll()
.antMatchers("/api/enforcementactions/**").hasAnyRole("ADMIN","DEVELOPER","USER")
}
}
控制器与预授权标签在这里我忘了添加'用户'的标签,在第一次被拒绝访问,但不应该在httpsecurity方法中的上述设置已经照顾它?
@PreAuthorize("hasAnyRole('ADMIN','DEVELOPER','USER')")
@RestController
@RequestMapping("/api/enforcementactions")
public class EnforcementActionsController {
@Autowired
private EnforcementActionsService service;
@GetMapping("/getallactions")
public ResponseEntity<?> getAllEnforcementActions() {
... do stuff here and return data
}
1条答案
按热度按时间xqnpmsa81#
世界的规则
HttpSecurity
配置没有被忽略,只是在中的规则之前对其进行了评估@PreAuthorize
.打电话给
/api/enforcementactions
来自角色为的用户USER
将首先通过Spring安全过滤器链。这就是规则的来源
HttpSecurity
将进行检查。它指出,如果用户具有以下任何角色
"ADMIN"
,"DEVELOPER"
或"USER"
然后他们可以继续。该用户具有该角色
"USER"
因此,请求将沿着过滤器链继续。一旦请求通过了过滤器链,那么规则将在
@PreAuthorize
将在调用控制器方法之前进行检查。此规则声明只有具有角色的用户
"ADMIN"
及"DEVELOPER"
可以访问此方法,并且我们的用户只有角色"USER"
所以他们的请求在这一点上被拒绝了。看来
@PreAuthorize
规则是唯一被考虑的,但这是因为它更具体。如果规则生效
HttpSecurity
更具体的是,请求将在到达之前在过滤器链中被拒绝@PreAuthorize
.