问题描述
我有一个Web应用程序,该应用程序提供REST API端点,并由spring安全性和SSO Keycloak保护。
我的Web应用程序可以在保护良好的情况下正常工作,并且在对密钥斗篷进行身份验证之后,可以使用Web浏览器访问REST API端点,然后重定向回端点。我收到预期的JSON响应,这意味着应该正确配置用户和角色。
但是,当我想从另一个Web应用程序或使用Postman调用提供的REST API端点时,每次都会出现错误401错误:未经授权。
我在请求的标题中输入: “授权”:“承载者eyJhbGciOiJSUzI1NiIsInR5cCIgO ...”令牌。
我可以从消费者Web应用程序中的密钥库中获取此令牌,也可以使用邮递员进行请求时获取。
我的spring安全配置中的我的Keycloak配置:
select *
from mytable
where (name,date) in
(
select name,max(date)
from mytable
where num = 33
group by name
);
我的 keycloak.json 文件:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@recogito/annotorIoU[email protected]/dist/annotorIoUs.min.css">
我在api控制器中的方法:
@KeycloakConfiguration
public class KeycloakSecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
/**
* Registers the KeycloakAuthenticationProvider with the authentication manager.
*/
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
auth.authenticationProvider(keycloakAuthenticationProvider);
}
/**
* Defines the session authentication strategy.
*/
@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http
.authorizeRequests()
.antMatchers("/api/v1/**").hasRole("USER")
.antMatchers("/admin/**","/app/**").hasRole("ADMIN")
.anyRequest().permitAll();
}
}
这是我在keycloak中的客户端配置的一部分: keycloak Client screen
Rest keycloak配置是默认情况下的方式。
谢谢您的帮助!
解决方法
谢谢。问题出在密钥斗篷的观众配置中。
对于客户端,您需要在“客户端-> ->映射器”下配置新的“映射”,并添加映射器类型为“受众群体”和适当的“包含的目标受众”的另一个映射(我选择了我以前用来创建请求)
在解决此问题后,我还面临另一个问题,即该用户已通过身份验证但被禁止访问端点。 明确地将角色添加到客户端配置本身中,然后将此角色分配给用户即可解决该问题,并且该角色可以正常工作。
在巨大的帮助下,将春季日志记录设置为DEBUG logging.level.org.springframework.security =调试
还有服务器响应中的XXX-Authentication标头,可以更好地描述问题所在。