我正在研究的典型场景是:
在我的场景中,一旦客户端拥有user1的访问令牌,我希望客户端的访问权限仅限于User1的资源。
考虑客户端访问URI / users / 1 / books。响应将包含与User1关联的所有书籍。主要问题是,如果客户端使用User1的令牌访问URL / users / 2 / books,它将获取User2的所有书籍列表,这些书籍不应该被允许。
如何将范围限制为使用其凭据获取令牌的用户?
如何将令牌映射到资源服务器中的特定用户?
我正在使用Spring / Java。但任何一般理论也会有所帮助。
答案 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://www.baeldung.com/get-user-in-spring-security
我在使用JwtTokenStore时需要进行大量调试。这将Principal作为String返回,而不是像我期望的那样返回UserDetails的实例。
一旦我切换到InMemoryTokenStore,我得到了预期的结果。这对我来说不是问题,因为我有选择,但我仍然想知道如何用JWT实现它。