Добавление логики на основе ролей на контроллере Spring

Итак, я искал решение, но не могу найти ничего, что мне нужно, я пытаюсь перегрузить метод для разных разрешений в зависимости от пользователя. Я использую Spring boot и Spring Security. Например:

@ResponseBody
@GetMapping("/role")
@Secured("ROLE_ADMIN")
public ResponseEntity<String> areYouAdmin() {
    return new ResponseEntity<>("ADMIN YES", HttpStatus.OK);
}

@ResponseBody
@GetMapping("/role")
@Secured("ROLE_USER")
public ResponseEntity<String> areYouUser() {
    return new ResponseEntity<>("USER YES", HttpStatus.OK);
}

поэтому здесь, если пользователь ROLE_USER, он получит ответ «ПОЛЬЗОВАТЕЛЬ ДА», а ROLE_ADMIN будет «АДМИН ДА». Я знаю, что это возможно с добавлением проверки в фактический метод и использованием роли в качестве условия, но интересно, есть ли более чистый подход. Возможным вариантом использования здесь было бы, если бы они искали ресурс, и если бы они были пользователями, он отображал бы только те, у которых был статус OPEN или что-то в этом роде, тогда как администратор может фильтровать и искать по всем статусам. Другим может быть, если мы хотим вернуть другой dto, т.е. администратор может просматривать всю информацию о пользователе.

Я также подумал о том, чтобы просто использовать другой путь и использовать мою конфигурацию веб-безопасности, IE:

        .antMatchers("/api/admin").hasRole(ADMIN)
        .antMatchers("/api/user").hasRole(USER)

но я действительно не хочу, чтобы мой внешний интерфейс был «умным», бэкэнд должен просто отображать данные в зависимости от роли без каких-либо специальных путей или нового сервлета. Заранее благодарю за любую помощь!

Возможно, этот похожий пост поможет: stackoverflow.com/questions/17995744/…

Jens Van Reusel 01.03.2019 16:02

Можете ли вы иметь два GetMapping с одним и тем же путем?

Jason Portnoy 01.03.2019 17:24

Мой ответ разрешает ваши сомнения? Если решено, закройте проблему, приняв ответ

Romil Patel 05.03.2019 10:51

@PatelRomil нет, я специально сказал, что не хочу использовать разные маршруты в своем вопросе.

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

Ответы 1

Обычно URL-адреса, связанные с администратором, начинаются с /admin/**, поэтому, на мой взгляд, рекомендуется иметь разные URL-адреса для администратора и пользователя, как в вашем файле конфигурации.

Вы можете использовать тот же URL-адрес для другой роли, как показано ниже.

// REST version, Content-type is "application/json"
@RequestMapping(value = "/", consumes = "application/json")
public void myRestService() {
...

// HTML version, Content-type is not "application/json"
@RequestMapping(value = "/", consumes = "!application/json")
public void myHtmlService() {
...

// the url is /?role=guest
@RequestMapping(value = "/", param = "role=guest")
public void guestService() {

// the url is / with header role=admin
@RequestMapping(value = "/", headers = "role=admin")
public void adminService() {

Пользовательские свойства @RequestMapping

Для получения более подробной информации вы должны обратиться к Обратитесь 1 и Обратитесь 2.

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