Spring Security:如何从委托人那里获取详细信息?

Posted

技术标签:

【中文标题】Spring Security:如何从委托人那里获取详细信息?【英文标题】:Spring Security: How to get details from the principal? 【发布时间】:2018-03-14 20:12:36 【问题描述】:

使用 spring boot 和 spring security,用户的详细信息在主体对象中可用。但它只有少数方法可以检索详细信息,例如getName()

如何从中获取其他详细信息?

目前我的班级是这样的

@SpringBootApplication
@RestController
public class DemoOAuth2Application 

    @RequestMapping("/user")
    public Principal user(Principal principal) 
        return principal;
    


    public static void main(String[] args) 
        SpringApplication.run(DemoOAuth2Application.class, args);
    

它返回这个,


  "authorities": [
    
      "authority": "ROLE_USER"
    
  ],
  "details": 
    "remoteAddress": "0:0:0:0:0:0:0:1",
    "sessionId": "43Fxxxxxx",
    "tokenValue": "ya29.xxxxxxxxx",
    "tokenType": "Bearer",
    "decodedDetails": null
  ,
  "authenticated": true,
  "userAuthentication": 
    "authorities": [
      
        "authority": "ROLE_USER"
      
    ],
    "details": 
      "id": "106xxxxx",
      "email": "xxxxxxxx@gmail.com",
      "verified_email": true,
      "name": "xxxx yyyyyy",
      "given_name": "xxxxxx",
      "family_name": "yyyyy",
      "link": "https://plus.google.com/xxxxxxxxxx",
      "picture": "https://lh5.googleusercontent.com/xxxxxx/photo.jpg",
      "locale": "en"
    ,
    "authenticated": true,
    "principal": "106xxxxx",
    "credentials": "N/A",
    "name": "106xxxxxxx"
  ,
  "principal": "106xxxxxxxxxxx",
  "clientOnly": false,
  "credentials": "",
  "oauth2Request": 
    "clientId": "xxxxxxxxx.apps.googleusercontent.com",
    "scope": [],
    "requestParameters": ,
    "resourceIds": [],
    "authorities": [],
    "approved": true,
    "refresh": false,
    "redirectUri": null,
    "responseTypes": [],
    "extensions": ,
    "refreshTokenRequest": null,
    "grantType": null
  ,
  "name": "106xxxxxxxxxx"

但我不想返回所有数据,而是只返回我需要的特定数据。我如何获取这些数据(特别是电子邮件、姓名、链接、图片)。

【问题讨论】:

【参考方案1】:
import org.springframework.security.oauth2.provider.OAuth2Authentication;

@SpringBootApplication
@RestController
public class DemoOAuth2Application 

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


    public static void main(String[] args) 
        SpringApplication.run(DemoOAuth2Application.class, args);
    

【讨论】:

【参考方案2】:

创建一个新对象,表示您希望从端点返回的数据子集。然后将数据从主体复制到新对象,最后返回新对象。

【讨论】:

但是如何复制数据呢?主体对象不提供任何读取其内容的方法。 抱歉,我还没收到。您是否建议我创建另一个类,从 Principle 为它写一个演员表,然后使用它?在这种情况下,如果没有暴露它们,我将如何从 Principle 访问这些细节?另外,Principle 有 50 多个实现,我不知道如何确定使用的是哪一个。 我建议您将 Principal 对象转换为可能具有访问器方法的实现。至于获取实现类,您可以在调试模式下启动服务器,也可以为 principal.class.getName() 放入日志语句 谢谢。我尝试将其转换为调试时发现的类。他们都没有任何方法来访问数据。我认为数据甚至没有存储到单独的变量中。我是否有可能以某种方式获得一个类似于上面 Spring Boot 自动生成的 JSON?然后,我可以使用一些 JSON 解析器库来获取我想要的任何元素,将它们放入一个类中并返回它。 嗯,它最有可能通过反射访问属性。您可以注入 Spring 用来序列化对象的 ObjectMapper 实例,但是您必须重新解析字符串才能轻松操作它。

以上是关于Spring Security:如何从委托人那里获取详细信息?的主要内容,如果未能解决你的问题,请参考以下文章

存储库查询的 Spring Security 授权

创建委托身份验证提供程序(Spring Security)

iPhone:如何在自定义单元的动态数量上管理 UITextfield 委托方法

如何将委托或函数指针从C#传递给C ++并使用InternalCall在那里调用它

如何使用 Spring Security + Angular 登录/验证

从委托人那里展示警报控制器