我在通过管理服务的端口号从管理服务向播发服务发送一些请求时遇到问题。
http://localhost:9002/api/v1/admin_role/alladvertisements
http://localhost:9002/api/v1/user_role/alladvertisements
我得到了403禁止问题为两个网址上面显示。我使用访问令牌作为载体令牌为用户和管理员。虽然管理员负责自己的请求,用户只能处理与其进程。
下面是两个url的结果。
{
"timestamp": "2022-08-31T23:58:15.250+00:00",
"status": 403,
"error": "Forbidden",
"path": "/api/v1/admin_role/alladvertisements"
}
{
"timestamp": "2022-08-31T23:58:15.250+00:00",
"status": 403,
"error": "Forbidden",
"path": "/api/v1/user_role/alladvertisements"
}
下面是管理服务的Web安全部分。
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true)
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/api/v1/admin_role/*").hasAnyRole("ROLE_ADMIN")
.antMatchers("/api/v1/user_role/*").hasAnyRole("ROLE_USER")
.antMatchers("/actuator/health").hasAnyRole("ROLE_ADMIN")
.antMatchers("/actuator/circuitbreakerevents").hasAnyRole("ROLE_ADMIN")
.anyRequest()
.permitAll();
}
@Autowired
protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
KeycloakAuthenticationProvider provider = keycloakAuthenticationProvider();
provider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
auth.authenticationProvider(provider);
}
@Override
@Bean
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}
}
我该如何修复它?
下面是我的github资源库:Link
1条答案
按热度按时间cl25kdpy1#
如果您没有更改
GrantedAuthority
的默认前缀- “ROLE_",那么SecurityExpressionRoot
的.hasRole()
和.hasAnyRole()
方法会将此前缀添加到传递的参数中。您可以在此处和此处阅读。此外,与stated in the javadoc一样,
SimpleAuthorityMapper
在MapGrantedAuthority
时也会向角色添加“ROLE_”前缀。这意味着,当您将“ROLE_ADMIN”传递给这些方法时,它会将其转换为“ROLE_ROLE_ADMIN”,结果您会得到403状态。
因此,请尝试配置不带前缀的安全性,如下所示:
或者,您也可以使用
.hasAuthority()
或.hasAnyAuthority()
方法,这不会更改传递的参数: