Spring - добавить защиту на общий CRUD контроллер - PullRequest
0 голосов
/ 15 мая 2018

Я делаю универсальный контроллер с операциями 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 голосов
/ 15 мая 2018

Существует так называемое 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);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...