我编写了一个自定义应用程序,其中具有带有Azure Active Directory的SSO。用户成功通过身份验证后,所有 API 服务都需要发送 JWT 令牌以访问服务。我正在尝试使用以下方法在身份验证中查找电子邮件ID
@GetMapping("/details")
public Authentication getUserDetails()
{
//logger.info();
Authentication auth=SecurityContextHolder.getContext().getAuthentication();
return auth;
}
当我调用 API 时,我可以看到以下响应作为 Json 响应
{
"authorities": [
{
"authority": "ROLE_Admin"
}
],
"details": null,
"authenticated": true,
"principal": {
"userGroups": [
{
"objectID": "a5f70709",
"displayName": "Outlook"
}
],
"name": "Karthik",
"subject": "J",
"claim": "65f9",
"issuer": "",
"claims": {
},
"uniqueName": "karthik@microsoftoutlook.com",
"upn": "karthik@microsoftoutlook.com",
"kid": ""
},
"credentials": null,
"name": "com.microsoft.azure.spring.autoconfigure"
}
由于我的电子邮件 ID 在主体对象中,我正在尝试强制转换为自定义类并强制转换为我将在其中使用 key 获得的哈希映射。但这两种方式我都得到了铸造错误。
通过哈希图投射
CustomPrincipal principal=(CustomPrincipal)auth.getPrincipal();
通过哈希图投射
Map<Object, Object> details = (HashMap<Object,Object>) auth.getPrincipal();
我所需要的只是来自身份验证对象的电子邮件 ID。
这个问题的答案取决于你如何配置 Spring 安全性。首先调用System.out.println(auth.getPrincipal().getClass().getName())
以查看作为经过身份验证的主体的类,或使用 IDE 设置断点并检查值。
最有可能的是,此类将包含用户的 OpenId Connect 令牌(JSON Web 令牌(,然后您必须对其进行解码。