【问题标题】:REST API, oAuth2, spring security and rolesREST API、oAuth2、spring 安全性和角色
【发布时间】:2015-05-22 04:29:38
【问题描述】:

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

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

是否可以将 oAuth2 身份验证/授权与 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 的人都可以访问这个端点。我哪里错了?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,几小时后试试!是否有机会通过方法上的注释以相同的方式工作?
    • @alexanoid 老实说我没试过。调查的好点
    • 这不起作用。没有方法#oauth2.hasRole。正确的方法就是 hasRole: .antMatchers("/oauth/api").access("hasRole('ADMIN')")
    猜你喜欢
    • 2016-03-29
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2012-09-06
    • 2017-12-05
    • 1970-01-01
    相关资源
    最近更新 更多