在Spring Boot上使用OAuth2保护特定资源ID

时间:2018-07-11 22:33:16

标签: spring spring-boot oauth

我在Spring Boot上有一个可行的OAUTH2实现,使用密码授予功能将AuthorizationServer和ResourceServer放在同一实现上。 关于服务器:

  • TokenStore是自定义的,并使用WebService远程存储令牌。
  • 我有一个自定义的AuthenticationProvider。

这用于基于给定的权限(例如,在ResourceServer配置中)控制对资源的访问:

    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/api/resource/**")
                .hasAnyAuthority("USER", "ADMIN")
            .antMatchers("/api/admin/**")
                .hasAnyAuthority("ADMIN");
    }

现在,我需要控制USER可以访问“ / api / resource / 1”,但不能访问“ / api / resource / 2”,此ID可以更改,并且在身份验证期间可以获取列表。

我尝试将ID的列表添加到OAuth2AccessToken其他信息,并在ResourceServer配置中添加自定义过滤器,但是它始终为空。

那么,在不使用JWT的情况下实现此目标的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

经过一番思考和研究,如果有人试图实现类似目标,这就是我要做的事情:

  • 将允许的ID映射到授权机构,例如ID_201和模块作为角色,所以我将有一个ROLE_ADMIN。
  • 可以在Web安全表达式中引用路径变量,如here中所述。因此,我们的想法是传递变量(资源ID)并检查是否允许该变量。

    public class WebSecurity {
       public boolean checkResourceId(Authentication authentication, int id) {
            //check if the list of authorities contains ID_{id}.
       }
    }
    

    在“网络安全”配置中:

    http
    .authorizeRequests()
            .antMatchers("/resource/{resourceId}/**").access("@webSecurity.checkResourceId(authentication,#resourceId)")
            ...
    

如果您正在使用Spring Security 4.0.4进行Spring Boot,请确保按照此bug中的报告升级到4.1.1。