Java 验证资源服务器spring安全性中的用户

Java 验证资源服务器spring安全性中的用户,java,spring-boot,spring-security,spring-security-oauth2,Java,Spring Boot,Spring Security,Spring Security Oauth2,我有一个授权服务器和一个资源服务器,它是使用带有oauth2的spring boot实现的。 在资源服务器中,我配置了check_令牌端点和相关信息,以验证来自授权服务器的请求 security: oauth2: resource: token-info-uri: http://localhost:9191/auth-service/oauth/check_token client: client-id: mobile client-sec

我有一个授权服务器和一个资源服务器,它是使用带有oauth2的spring boot实现的。 在资源服务器中,我配置了check_令牌端点和相关信息,以验证来自授权服务器的请求

security:
  oauth2:
    resource:
      token-info-uri: http://localhost:9191/auth-service/oauth/check_token
    client:
      client-id: mobile
      client-secret: secret
因此,现在当请求带有承载令牌时,它允许访问资源服务器。但是,如果令牌被盗并试图更新另一个用户的记录,这仍然是可能的,因为他/她有一个有效的令牌。为了降低这种风险,我想在资源服务器中添加一个过滤器,并在生成令牌时,使用请求头附带的唯一id与我添加到令牌的id字段进行检查。但是身份验证对象只返回令牌所有者的用户名

final OAuth2Authentication authentication=(OAuth2Authentication)SecurityContextHolder
.getContext().getAuthentication();
//此主体对象返回用户名。
对象主体=身份验证。getUserAuthentication().getPrincipal();
我希望这个主体对象或另一个属性将我设置为令牌的userid发送给我。这是我的check_令牌响应,您可以看到它在响应中有userid字段

{
  "aud": [
    "oauth2-resource"
  ],
  "data": {
    "userId": "uid-0c51148d-162a-4fa4-95c5-asd3434",
  },
  "user_name": "test",
  "scope": [
    "READ",
    "WRITE",
    "UPDATE"
  ],
  "active": true,
  "client_id": "mobile",
}

请帮我整理一下

为什么不将数据库中的用户id添加到userdetails对象(主体)中,以便在请求传入时,资源服务器获取并填充主体。uou从主体获取id,然后使用该id更新用户对象。那么每个令牌只能更新一个用户。@ThomasAndolf您是否建议设置用户id而不是用户名?否,我建议您在授权服务器中实现自定义userdetails对象。当您的资源服务器获取主体时,它将获取该自定义userdetail对象,但当您在资源服务器中获取主体时,您需要将其强制转换为自定义userdetail对象。令牌没有任何信息。用户令牌只是一个字符串。您的资源服务器获取令牌,将其发送给您的授权服务器,授权服务对其进行验证,然后返回userdetails对象。你可以定义你自己的自定义userdetails对象并返回你想要的任何内容。如果你不明白我在说什么,我建议你阅读spring安全文档,了解spring安全是如何工作的,userdetails对象是什么,等等。