我已经使用spring 5构建了一个Spring boot oauth2服务器。oauth服务器可以工作,并且我可以使用基本auth和用户名/密码登录。我获得了承载令牌,并且可以使用/ oauth / check_token网址来验证令牌。
在同一Spring引导项目中,我想添加一个端点,该端点将打印出经过身份验证的用户信息,以便oauth2客户端可以通过已登录的用户获取信息。我创建了一个端点/ user,它看起来像这样:
@GetMapping("/user")
@ResponseBody
public Principal user(Principal user) {
return user;
}
我启动了邮递员,以便可以进行api调用,例如,调用/ oauth / token,我会收到一个令牌。然后,我开始一个新请求,将身份验证方法设置为承载令牌,并填写接收到的承载令牌。我对URL(http://localhost:8080/user)进行了GET调用,结果表明主体始终为null。我知道,因为我可以在Spring工具套件中调试应用程序,而Principal始终为空。我也尝试过:
OAuth2Authentication oAuth2Authentication = (OAuth2Authentication)SecurityContextHolder.getContext() .getAuthentication();
那也是空的。如何创建将打印用户信息的终结点,以便客户端可以设置userInfoUri属性。
答案 0 :(得分:0)
我有答案。我将其张贴在这里,以防其他人遇到此问题。
我有一个ResourceServerConfigurerAdapter,其中包含以下配置:
public void configure(HttpSecurity http) throws Exception {
http.anonymous()
.disable()
.requestMatchers()
.antMatchers("/api/user/**").and().authorizeRequests()
.antMatchers("/user").authenticated()
// More rules here
由于第一个antMatchers(“ / api / user / **”)而不起作用的原因。我将其更改为:
http.anonymous()
.disable()
.requestMatchers()
.antMatchers("**").and().authorizeRequests()
我相信第一个antMatchers确定了它强制执行authorizeRequests的路径(在该路径中启用oauth2安全性),因此,如果第一个路径是.antMatchers(“ / api / user / **”),那么之后是.antMatchers( “ / user”),则它将不匹配,并且/ user网址不会启用oauth2安全性。