Spring - добавить безопасность в общий контроллер CRUD

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

Заранее спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
162
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Существует так называемое аспектно-ориентированное программирование - АОП, и вы можете использовать его реализацию 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);
    }

}

Другие вопросы по теме