gpt4 book ai didi

java - Spring 安全 : all endpoints return status 200 and unresponsive to constraints as antMatchers

转载 作者:行者123 更新时间:2023-12-05 05:57:47 24 4
gpt4 key购买 nike

我想根据角色限制端点的使用:admin/user

所以我尝试使用 NoOpPasswordEncoder 实现 Spring Security(用于测试目的),但问题是:
所有端点都返回状态 200 并且作为 antMatchers 对约束没有响应。

澄清一下:我想以 user 身份登录,由于 antMatcher 而出现错误:

.antMatchers("/api/addresses")
.hasAuthority("ROLE_ADMIN")

但我现在使用当前配置得到 200

我已经测试了 Spring Security 配置格式:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(inMemoryUserDetailsManager());
}

@Bean
public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
final Properties users = new Properties();
users.put("admin","{noop}admin,ROLE_ADMIN,enabled");
users.put("user","{noop}user,ROLE_USER,enabled");
return new InMemoryUserDetailsManager(users);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/addresses")
.access("hasAuthority('ROLE_ADMIN')")
.antMatchers("/api/address/**")
.access("hasAuthority('ROLE_ADMIN') or hasAuthority('ROLE_USER')")
.anyRequest()
.authenticated()
.and()
.httpBasic()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}

基于 example config .

在调查过程中,我尝试发表评论,例如行:

.antMatchers("/api/address/**")
.access("hasAuthority('ROLE_ADMIN') or hasAuthority('ROLE_USER')")

以用户身份登录时检查发生了什么并且仍然收到 200

我也尝试过使用 hasAuthority() 方法,例如:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(inMemoryUserDetailsManager());
}

@Bean
public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
final Properties users = new Properties();
users.put("ADMIN","{noop}admin,ROLE_ADMIN,enabled");
users.put("USER","{noop}user,ROLE_USER,enabled");
return new InMemoryUserDetailsManager(users);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/addresses")
.hasAuthority("ROLE_ADMIN")
.antMatchers("/api/address/**")
.hasAnyAuthority("ROLE_ADMIN", "ROLE_USER")
.anyRequest()
.authenticated()
.and()
.httpBasic()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}

correct order 之后使用 antMatchers(),当必须首先执行更具体的规则时,它仍然对我没有帮助。

有谁知道我在这里缺少什么?提前感谢您的任何想法。

UPD #1:

我试过 clear cookies在 Postman 中,以用户身份登录,但我仍然收到 200

enter image description here

仅当我不在 Postman 中为 GET 请求使用 Basic Auth 时,我才会收到 401:

enter image description here

更新#2:

我已经使用技术版本重现了这个问题:

  • Java 11
  • spring-boot-starter-parent 2.5.3
  • spring-boot-starter-security 2.5.3

最佳答案

原因及解决方法:


问题的原因冗余配置 option :

server.servlet.context-path=/api

因为 /api 前缀已经存在于 .antMatchers()


解决方案#1:

为了修复它,我已将其从 application.properties 文件中删除,并将此前缀直接添加到端点。


解决方案#2:反过来也可以解决:去掉antMatchers()中的前缀/api,留下:

server.servlet.context-path=/api

使用application.properties


解决方案 #3:

我还使用另一种配置解决了这个问题:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(inMemoryUserDetailsManager());
}

@Bean
public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
final Properties users = new Properties();
users.put("admin","{noop}admin,ROLE_ADMIN,enabled");
users.put("user","{noop}user,ROLE_USER,enabled");
return new InMemoryUserDetailsManager(users);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.anyRequest()
.permitAll()
.and()
.httpBasic()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}

加上annotations关于 Controller 的方法:

@PreAuthorize("hasAuthority('ROLE_ADMIN')") 

相应地:

@PreAuthorize("hasAuthority('ROLE_ADMIN') or hasAuthority('ROLE_USER')")

结果我得到 403 而不是 200:

enter image description here

关于java - Spring 安全 : all endpoints return status 200 and unresponsive to constraints as antMatchers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68725999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com