如何在Spring Data Rest中保护RepositoryRestResource

时间:2019-07-16 06:55:52

标签: spring spring-security spring-data-rest

我有一个spring数据存储库,并且我使用了@RepositoryRestResource注释来为其生成REST资源。现在,我想使用Spring Security来控制对其的访问。

我知道可以将@PreAutorize放在方法上或使用WebSecurityConfigurerAdapter根据请求路径执行授权。但是这些解决方案都不适合我。因为前者可以保护方法,而我仅在HTTP请求尝试调用方法时才需要应用方法,而后者对我来说似乎很糟糕,因为我需要在添加每个新存储库后修改单个类。 (有点违反开放式封闭原则,恕我直言),如果我更喜欢将每个资源的访问控制规则放在该资源旁边,而不是放在其他地方,并使用路径或名称将其绑定。

因此,对于访问控制解决方案,我有两个标准:

  1. 我只想将其应用于HTTP请求。
  2. 我想在自己的类中而不是其他地方定义它。
@RepositoryRestResource
@PreAuthorize("hasRole('ADMIN')")
public interface VehicleRepository extends CrudRepository<Vehicle,Integer>{

}

这是第一个不适用于我的解决方案。

@Configuration
@EnableGlobalMethodSecurity(
        prePostEnabled = true,
        securedEnabled = true,
        jsr250Enabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

...

    @Override
    protected void configure(HttpSecurity http) throws Exception {
       ...

       http.authorizeRequests().antMatchers("/vehicles/**").hasRole("ADMIN");

       ...
    }

...

}

这是我不喜欢的第二种解决方案。

我想知道是否还有其他解决方案。我已阅读参考文档并在网上搜索,但没有找到想要的东西。 请注意,我要使用RepositoryRestResource,所以请不要说“编写自己的控制器”。

对不起,很长的问题,谢谢你。

1 个答案:

答案 0 :(得分:0)

您可以从CrudRepository注释方法,如下所示:

@PreAuthorize("hasRole('ADMIN')")
@Override
Optional<Vehicle> findById(Integer id);

您可以在Spring Data REST Docs中找到更多信息:https://docs.spring.io/spring-data/rest/docs/current/reference/html/#security