Spring - 在通用CRUD控制器上添加安全性

时间:2018-05-14 21:41:56

标签: java spring rest security generics

我正在使用CRUD操作创建一个通用控制器(比如https://gist.github.com/wvuong/5673644),我正在寻找一种在这些端点上包含安全性的方法。

由于我的所有控制器实现也具有通用权限(例如CATEGORY_LIST,PROJECT_LIST,LOCATION_LIST)是否有办法使用@PreAuthorize注释或任何其他方法将其包含在通用控制器中。

这个项目差不多完成了,所以我不能使用全新的rest实现,而我正在尝试清理一些代码,因为我们的控制器只有这样调用超级实现的方法:

@Override
    @PreAuthorize("hasAuthority('CATEGORY_ADD')")
    @PostMapping(value = "")
    public ResponseEntity<Object> create(@Valid @RequestBody  Category m,BindingResult bindingResult) throws CustomValidateException {
        return super.create(m,bindingResult);
    }

仅针对@PreAuthorize注释并尝试避免使用这种方法。我记得我在这里看过一篇关于这个的帖子,但可以找到它。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

有一种所谓的面向方面编程 - AOP,您可以使用集成到Spring中的AspectJ实现。 AOP是一种方面,例如代码中的安全性,并将其放入Aspect中。这有助于防止在整个地方出现重复的代码,并且您只需拥有可在需要时触发安全检查的拦截器。

如果您不想引入像AspectJ这样的AOP框架,您也可以将安全性放在不同的位置,就像在超级类型中一样,并且将某种bean注入到字段中您的抽象超级类型,为您执行安全性。因为所有子类型也将是Spring Beans,这将起作用。

@Component
public class SecurityBean {

    @PreAuthorize("hasAuthority('CATEGORY_ADD')")
    public void doSecurityChecks(Category m) {
        // any other custom security logic you want
    }
}

public abstract class ControllerSuperType {

    @Autowired
    SecurityBean securityBean;

    public ResponseEntity<Object> create(@Valid @RequestBody  Category m, BindingResult bindingResult) throws CustomValidateException {
        // other stuff already in your super type
        securityBean.doSecurityChecks(m);
    }

}