资源服务器如何使用oauth2中的标记识别资源所有者?

时间:2016-12-20 18:35:57

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

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

  1. User1为前端休息客户端提供正确的凭据(授权类型:密码),客户端获取令牌作为回报。
  2. 客户端发送令牌并访问User1拥有的资源。
  3. 在我的场景中,一旦客户端拥有user1的访问令牌,我希望客户端的访问权限仅限于User1的资源。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

Spring security 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作为String返回,而不是像我期望的那样返回UserDetails的实例。

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