#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 очков репутации