2015-03-19 325 views
2

在我的應用程序中,我實現了oauth2 AuthorizationServer和ResourceServer。我係統中的每個用戶都有一組他的角色(權限)。REST API,oAuth2,彈簧安全和角色

我想用oauth2和基於用戶角色的安全保護我的Spring MVC REST端點。

是否有可能使用在UserDetails.getAuthorities()方法中定義的不同角色(權限)來使用oAuth2認證/授權?

我CONFIGS:

private final static class DBUserDetails extends User implements UserDetails { 

    private static final long serialVersionUID = 1L; 

    private DBUserDetails(User user) { 
     super(user); 
    } 

    public Collection<? extends GrantedAuthority> getAuthorities() { 
     return AuthorityUtils.createAuthorityList("ROLE_USER"); 
    } 

    public String getUsername() { 
     return getName(); 
    } 

    public boolean isAccountNonExpired() { 
     return true; 
    } 

    public boolean isAccountNonLocked() { 
     return true; 
    } 

    public boolean isCredentialsNonExpired() { 
     return true; 
    } 

    public boolean isEnabled() { 
     return true; 
    } 

} 

@Configuration 
@EnableResourceServer 
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { 

    @Override 
    public void configure(ResourceServerSecurityConfigurer resources) { 
     resources 
      .resourceId(RESOURCE_ID); 
    } 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
       .antMatchers("/profile/*").hasRole("PERMISSION_ADMIN")      
       .and().csrf() 
       .disable().sessionManagement().sessionCreationPolicy(STATELESS); 
    } 

} 



@RestController 
@RequestMapping("/api/v1.0/profile") 
public class ProfileController { 

    @PreAuthorize("hasRole('PERMISSION_ADMIN')") 
    @RequestMapping("/currentUser") 
    public User currentUser(@AuthenticationPrincipal User user) { 
     return user; 
    } 

} 

我想,以確保與用戶誰擁有PERMISSION_ADMIN/profile/*路徑。但現在,任何具有accessToken的人都可以訪問此端點。我錯在哪裏?

回答

1

我想你可以在你的ResourceServerConfiguration使用OAuth2SecurityExpressionMethods對我來說,它的工作原理是這樣的:

http 
.requestMatchers().antMatchers("/oauth/api") 
.and() 
.authorizeRequests() 
.antMatchers("/oauth/api").access("#oauth2.hasRole('ADMIN')")... 
+0

謝謝,會嘗試在附近的幾個小時!有沒有機會以相同的方式從註釋中使用這些方法? – alexanoid 2015-03-19 15:28:46

+0

@alexanoid老實說,我沒有嘗試。要調查的好點 – 2015-03-19 15:37:09

+2

這不起作用。沒有方法#oauth2.hasRole。正確的方法只是hasRole:.antMatchers(「/ oauth/api」)。access(「hasRole('ADMIN')」) – 2017-03-16 22:35:13