我在Spring Boot上有一个可行的OAUTH2实现,使用密码授予功能将AuthorizationServer和ResourceServer放在同一实现上。 关于服务器:
这用于基于给定的权限(例如,在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的情况下实现此目标的正确方法是什么?
答案 0 :(得分:0)
经过一番思考和研究,如果有人试图实现类似目标,这就是我要做的事情:
可以在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。