【发布时间】:2021-01-20 05:15:00
【问题描述】:
我有一个提供 REST API 端点的 Web 应用程序,由 Spring Security 和 SSO Keycloak 保护。
我的 Web 应用程序在启用保护的情况下工作正常,我可以使用 Web 浏览器访问 REST API 端点,在 keycloak 上进行身份验证并重定向回端点后。我收到了预期的 JSON 响应,这意味着应该正确配置用户和角色。
但是当我想从另一个 Web 应用程序或使用 Postman 调用提供的 REST API 端点时,我每次都会遇到错误 401 错误:未授权。
在我提出的请求的标题中: “授权”:“承载 eyJhbGciOiJSUzI1NiIsInR5cCIgO....”令牌。
我能够从消费者 Web 应用程序中的 keycloak 以及当我使用邮递员发出请求时获取此令牌。
我的 Spring Security 配置中的 Keycloak 配置:
@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.json 文件:
{
"realm": "realm-name",
"auth-server-url": "https://auth.server.com/auth/",
"ssl-required": "external",
"resource": "resource-name",
"verify-token-audience": true,
"credentials": {
"secret": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"use-resource-role-mappings": true,
"confidential-port": 0
}
我在api控制器中的方法:
@RestController
@RequestMapping("/api/v1")
public class WakeMeUpController {
@RequestMapping(value = "/test", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE)
public String testMeUp() {
return "I am tested!";
}
}
这是我在 keycloak 中的客户端配置的一部分: keycloak Client screen
Rest keycloak 配置是默认的。
感谢您的帮助!
【问题讨论】:
-
将此添加到您的应用属性:
logging.level.org.springframework.security=DEBUG并在获得 401 后粘贴您的日志输出。 -
谢谢!这让我明白了这个问题,我能够解决它。
标签: api rest oauth-2.0 keycloak http-status-code-401