Существует так называемое Aspect-Orientated Programming - AOP, и вы можете использовать реализацию AspectJ, которая интегрирована в Spring. АОП - это то, что вы берете аспект, такой как безопасность, из своего кода и помещаете его в аспект. Это помогает избежать повсеместного дублирования кода, и у вас просто есть перехватчики, которые при необходимости запускают проверки безопасности.
Если вы не хотите вводить инфраструктуру AOP, такую как AspectJ, вы можете вместо этого поместить безопасность в другое место, например, в ваш супертип, и иметь какой-то bean-компонент, который вводится в поле в вашем абстрактном Супер тип, который обеспечивает безопасность для вас. Пока все подтипы также будут бобами Spring, это будет работать.
@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);
}
}