2015-03-19 164 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