Я делаю общий контроллер с операциями 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 и попытки избежать подобных методов. Я помню, что видел здесь один пост об этом, но смог его найти.
Заранее спасибо.




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