我正在使用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注释并尝试避免使用这种方法。我记得我在这里看过一篇关于这个的帖子,但可以找到它。
提前谢谢。
答案 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);
}
}