【问题标题】:How can the resource server identify the resource owner using token in oauth2?资源服务器如何使用 oauth2 中的令牌识别资源所有者?
【发布时间】:2017-05-06 01:38:36
【问题描述】:

我正在研究的典型场景是:

  1. User1 向前端 rest 客户端提供正确的凭据(授权类型:密码),客户端获得令牌作为回报。
  2. 客户端发送令牌并访问User1拥有的资源。

在我的场景中,一旦客户端获得了 user1 的访问令牌,我希望客户端只能访问 User1 的资源。

假设客户端访问 URI /users/1/books。响应将包含与 User1 关联的所有书籍。主要问题是,如果客户端使用 User1 的令牌访问 URL /users/2/books,它会获取 User2 的所有不应该被允许的书籍的列表。

如何将范围限制为使用其凭据获取令牌的用户?

如何将令牌映射到资源服务器中的特定用户?

我正在使用 Spring/Java。但任何一般理论也会有所帮助。

【问题讨论】:

    标签: rest security spring-security oauth-2.0 spring-security-oauth2


    【解决方案1】:

    经过大量调试,我得到了答案。

    Spring 安全 1.4 令牌存储:InMemoryTokenStore()

    在 ResourceServerConfiguration 中,配置 HttpSecurity。

    @Override
    public void configure(final HttpSecurity http) throws Exception {
        // @formatter:off
        http.authorizeRequests().
        // antMatchers("/oauth/token").permitAll().
        antMatchers("/api/users/{userId}").access("@webSecurity.checkUserId(authentication,#userId)")
        .anyRequest().authenticated().and().sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().csrf().disable();
        // @formatter:on
    }
    

    创建一个 WebSecurity 类并提供实现。

    public class WebSecurity {
        public boolean checkUserId(Authentication auth, int id) {
            return ((UmUser)auth.getPrincipal()).getId() == id;
        }
    }
    

    资源: http://docs.spring.io/spring-security/site/docs/current/reference/html/el-access.html#el-access-web-path-variables

    http://www.baeldung.com/get-user-in-spring-security

    在使用 JwtTokenStore 时,我不得不进行很多调试。这将 Principal 作为字符串返回,而不是像我期望的那样返回 UserDetails 的实例。

    切换到 InMemoryTokenStore 后,我得到了预期的结果。这对我来说不是问题,因为我可以选择,但我仍然想知道如何使用 JWT 实现它。

    【讨论】:

      猜你喜欢
      • 2018-07-24
      • 2020-12-29
      • 2023-02-22
      • 2021-12-02
      • 2013-10-02
      • 2018-12-11
      • 2022-08-21
      • 1970-01-01
      • 2016-02-03
      相关资源
      最近更新 更多