动态保护Spring Rest端点

时间:2019-02-09 10:15:46

标签: spring spring-security

实际上我的代码如下:

@PreAuthorize("hasAuthority('admin')")
@RequestMapping(value = "/xxxx", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<> method(@RequestBody RequestClass request) {

}

如您所见,允许的权限以Java代码硬编码。 有没有一种方法可以覆盖PreAuthorize的行为,或者在启动时从外部源(数据库或配置文件)加载正确的端点配置?

1 个答案:

答案 0 :(得分:0)

我想您可以尝试这样的操作(可能需要一些调整),但这很丑陋,我自己不会做...

  1. 在配置中将方法设置为角色映射。例如:
permissions.method1: admin
permissions.method2: admin
permissions.method3: user
  1. 然后使用@ConfigurationProperties类将地图加载到地图中。
@ConfigurationProperties("")
public class SecurityMappingProperties {

    private final Map<String, String> permissions = new HashMap<>();

    public Map<String, String> getPermissions() {
        return permissions;
    }

}
  1. 然后设置服务以处理查找。
@Service
public class MethodPermissionService {

  @Autowired
  private SecurityMappingProperties mappingProperties;

  //lookup the mapped role and see if you user has it..
  public Boolean lookupPermissionForMethod(String method){
     return doesUserHaveRole(mappingProperties.get(method));
  }

  private Boolean doesUserHaveRole(String role){
     //implement whatever logic you want to look up the requesting user's role...
  }

}
  1. 然后在您的控制器中,调用methodPermissionService并传入方法名称,就像这样...
@PreAuthorize("@methodPermissionService('method1')")

当然,这需要您在所有控制器的所有中具有每个安全方法,并具有@Preauthorize,其匹配方法名称作为参数的参数。 methodPermissionService('xxx')。

由于我们已经在这个兔子洞中了,如果您真的想要,则可以只在一个MethodRoleHolder类中声明一个所有对象,您可以在其中将它们设为静态字符串,如下所示:

 public static final String METHOD1_SECURITY = "@methodPermissionService('method1')";

 public static final String METHOD2_SECURITY = "@methodPermissionService('method2')";

然后在您的控制器中使用它们...

@PreAuthorize(MethodRoleHolder.METHOD1_SECURITY)

预先警告:我实际上并没有完全按照此处的说明尝试此操作,但是我实现了与此类似的安全方案,只是没有动态角色映射查找部分。