我正在开发启用了授权和资源服务器的SpringBoot和SpringSecurityWeb应用程序。我已经定义了一组用户,为他们分配了角色,并试图实现对rest端点的基于角色的访问。我能够实现对端点的基于令牌的访问,但不能限制对最终用户的访问,这将取决于他们的角色。
我已经完成了两个端点: /rest/products/list
及 /rest/products/add
并试图限制访问 /rest/products/add
与属于的用户的终结点 ADMIN
角色
我的 WebSecurityConfigurerAdapter
详情如下:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private PasswordEncoder passwordEncoder;
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.passwordEncoder(passwordEncoder)
.withUser("user1")
.password(passwordEncoder.encode("user1Pass"))
.roles("USER")
.and()
.withUser("user2")
.password(passwordEncoder.encode("user2Pass"))
.roles("USER")
.and()
.withUser("admin")
.password(passwordEncoder.encode("adminPass"))
.roles("ADMIN");
}
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/rest/products/add").hasAnyRole("ADMIN")
.antMatchers("/rest/products/list").denyAll();
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
因此,资源 /rest/products/add
应仅在admin/adminpass用户有权限的情况下才可访问该用户 ADMIN
角色但是,如果尝试使用user1/user1pass访问它,它仍然是可访问的:
获取user1 Postman 屏幕的访问令牌
访问 ADMIN
仅与 user1
Postman 屏幕
我还在配置方法中添加了(出于测试目的)以下规则 .antMatchers("/products/list").denyAll();
这里表明 /products/list
任何用户都不能访问。但它仍然保持响应(提供正确的访问令牌)。
在这里的类似问题中,如何修复spring security中的角色?匹配者的顺序应该从更具体到更少。但在我的例子中,有两个匹配器,没有匹配器可以重叠它们。
我用的是Spring Boot spring-boot-starter-security
插件版本2.5.2。
应进行哪些额外的配置以使 .hasRole("ADMIN")
及 .denyAll()
按预期工作?
1条答案
按热度按时间jw5wzhpr1#
最终,我们能够通过以下方式找到解决方案:
这里有一个例子
ResourceServerConfigurerAdapter
班级。从这个和你的评论中,杜尔,我意识到我很困惑ResourceServerConfigurerAdapter
及WebSecurityConfigurerAdapter
,正在尝试在中定义访问限制匹配器WebSecurityConfigurerAdapter
. 我以以下方式更改了资源服务器配置:方法是在
WebSecurityConfigurerAdapter
```@Override
public void configure(final HttpSecurity http) throws Exception {
@Configuration
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
}