REST API、oAuth2、spring 安全和角色

REST API, oAuth2, spring security and roles

在我的应用程序中,我实现了 oauth2 AuthorizationServer 和 ResourceServer。我系统中的每个用户都有一组角色(权限)。

我想使用 oauth2 和基于用户角色的安全性来保护我的 Spring MVC REST 端点。

是否可以将 oAuth2 authentication/authorization 与 UserDetails.getAuthorities() 方法中定义的不同角色(权限)一起使用?

我的配置:

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 的人都可以访问这个端点。我哪里错了?

我想你可以在 ResourceServerConfiguration 中使用 OAuth2SecurityExpressionMethods 对我来说它是这样工作的:

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