Как использовать Spring security в каждом вызове REST при загрузке Spring?

#java #spring-boot #spring-security

#java #spring-boot #spring-безопасность

Вопрос:

Я пытаюсь понять, есть ли способ использовать Spring security, который помогает в моем случае. По сути, я хочу вызывать spring security при каждом вызове REST в spring boot, а не один раз во время запуска приложения, и находить роль пользователя и дополнительно ограничивать конечные точки на основе ролей пользователей.

У меня есть 3 разных контроллера rest, а именно /admin1/* , /admin2/* , /admin3/* .
Я попытался ограничить конечные точки вручную, как показано ниже.

 http.authorizeRequests()
        .antMatchers("/admin1/**").permitAll()
        .and()
    .authorizeRequests()
        .antMatchers("/admin2/**").permitAll()
    .anyRequest().authenticated();
  

Это фактически позволит /admin1/* и /admin2/* API-интерфейсам работать и ограничивать /admin3/* . Однако мой используемый пример выглядит следующим образом.

В каждом вызове rest мы передаем идентификатор пользователя в заголовке. Я хотел бы использовать spring security при каждом вызове rest и использовать идентификатор пользователя из заголовка, чтобы найти роли пользователей из базы данных.

Если у пользователя есть роль пользователя ADMIN 1, мы должны просто включить /admin1/* конечные точки и ограничить /admin2/* и /admin3/* . Аналогично, если у пользователя есть роль пользователя ADMIN 2, мы должны просто включить /admin2/* конечные точки и ограничить /admin1/* и /admin3/* . Точно так же, если у пользователя есть роль пользователя ADMIN 3, мы должны просто включить /admin3/* конечные точки и ограничить /admin1/* и /admin2/* .

Есть ли способ добиться этого с помощью Spring security?

Спасибо

Ответ №1:

НАСКОЛЬКО я понял, вы хотите аутентифицировать и авторизовывать пользователей при каждом вызове. Верно?

один из способов — токенизация ваших REST API с помощью JWT (веб-токена JSON).

Пример в https://dzone.com/articles/spring-boot-security-json-web-tokenjwt-hello-world вероятно, это помогло бы.

Я также предлагаю вместо использования antMatchers в configure методе для ограничения URL доступа на основе Roles , вы используете @PreAuthorize and @PostAuthorize аннотации над классами или методами, которые хотите защитить. Этот способ дает вам больше гибкости в ваших политиках ограничений.

Пример в https://www.baeldung.com/spring-security-method-security также может помочь вам в этом.

Комментарии:

1. Спасибо за ваш ответ. Это действительно помогло. Я действительно поиграл с предварительной авторизацией, и это действительно сработало. По сути, на уровне класса я определил предварительную авторизацию, которая вызывает метод с параметром заголовка (userId). Используя значение userId, я вызываю базу данных, чтобы получить роль, и на основе роли ограничиваю конечную точку. Извините, я проголосовал за, но он не принял, поскольку у меня меньше 15 очков репутации