如何从java.security.Principal获取所有属性?



我学习Spring安全性并编写简单的Web应用程序Spring Security 5OAuth2 Login。我想从Principal(电子邮件,用户名等(获取信息,但我找不到任何方法。写一些JSON-parser不是最好的主意,因为我很确定有一些方法可以获取用户帐户详细信息。

配置

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and().oauth2Login();
}
}

控制器

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.security.Principal;
@Controller
public class HomeController {
@GetMapping({"", "/"})
@ResponseBody
public Principal getHome(Principal principal) {
return principal;
}
}

应用.yml

spring:
security:
oauth2:
client:
registration:
google:
client-id: xyz1
client-secret: secret1
facebook:
client-id: xyz2
client-secret: secret2
github:
client-id: xyz3
client-secret: secret3

通过反复试验,以及 Spring Boot 2.3.2,我发现在那个特定场景(带有 Spring Boot 的 OAuth2(中,您必须将您在 AuthenticationSuccess 方法上获得的身份验证对象(是的,这就是我的场景的不同之处,因为我在我的身份验证成功处理程序中观察到了这个对象 - 但这种情况会有很大不同吗?(到 OAuth2AuthenticationToken。如果您实际暂停执行并将身份验证对象添加到监视,您将看到它确实是该类型。现在这个对象的 getPrincipal(( 返回正确转换的 OAuth2User 对象,它有一个方法 getAttributes((。我真的希望更容易弄清楚这一点。

事实上,在我的场景中,OAuth2User 对象可以直接传递给我的控制器方法(我不确定该注释@AuthenticationPrincipal是必要的还是正确的......

@Controller
@RequestMapping("/authorized")
public class AuthorizedController {
@RequestMapping("/default")
public String handle(@AuthenticationPrincipal OAuth2User principal,
Model m) {
// ...
}
}

创建一个新对象,表示要从源返回的数据子集, 即,这些细节的来源具有多个值,因此使用一些列表或集合或映射来存储该数据并表示它, 正如您提到的,您正在使用OAuth2:

@RequestMapping("/user")
public Authentication user(OAuth2Authentication authentication) {
LinkedHashMap<String, Object> details = (LinkedHashMap<String, Object>) authentication.getUserAuthentication().getDetails();
return details.get("email");
}

最新更新