我有一个spring数据存储库,并且我使用了@RepositoryRestResource
注释来为其生成REST资源。现在,我想使用Spring Security来控制对其的访问。
我知道可以将@PreAutorize
放在方法上或使用WebSecurityConfigurerAdapter
根据请求路径执行授权。但是这些解决方案都不适合我。因为前者可以保护方法,而我仅在HTTP请求尝试调用方法时才需要应用方法,而后者对我来说似乎很糟糕,因为我需要在添加每个新存储库后修改单个类。 (有点违反开放式封闭原则,恕我直言),如果我更喜欢将每个资源的访问控制规则放在该资源旁边,而不是放在其他地方,并使用路径或名称将其绑定。
因此,对于访问控制解决方案,我有两个标准:
@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
,所以请不要说“编写自己的控制器”。
对不起,很长的问题,谢谢你。
答案 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