Spring Security: внешняя аутентификация и внутренняя аутентификация - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть служба REST, которая полагается на внешнюю систему для аутентификации токена, но должна сама выполнить авторизацию (доступ на уровне API с использованием @Secured).

Требование:

  1. Пользовательский интерфейс генерирует токен с помощью внешней системы.
  2. Пользовательский интерфейс выполняет вызовы REST с токеном для моей службы.
  3. Моя служба проверяет токен с помощью внешней системы, но аутентификация для вызовов API выполненамоим сервисом

Одним из возможных решений было сделать это с помощью фильтра:

  1. Пользовательский интерфейс генерирует токен с использованием внешней системы.
  2. Пользовательский интерфейс делает RESTзвонки с токеном в мою службу.
  3. В моей службе есть фильтр, который вызывает внешнюю систему с токеном.
  4. Внешняя система для действительного токена отправляет обратно данные пользователя.
  5. Моя служба при успешном наборе вызова имеет тип SecurityContextHolder, такой как

    SecurityContextHolder.getContext (). SetAuthentication (new AuthorizedUser ("test", Arrays.asList (new SimpleGrantedAuthority ("test_role")), "test", null));

Есть ли другой способ, которым это может быть достигнуто?

1 Ответ

0 голосов
/ 10 декабря 2018

Если вы ищете предложения по своей архитектуре, вы можете сохранить дополнительный вызов во «внешней системе», изменив первый шаг и другие шаги:

  1. Пользовательский интерфейс генерирует токен, используявнешняя система.

    1.1.Внешняя система сохраняет пользовательские данные в некоторой базе данных значений ключей в памяти (например, Redis).

...

В моей службе есть фильтр, который извлекает данные пользователя из Redis с помощью токена.

Имеет смысл защищать «внешнюю систему» ​​от нежелательной почты, вызванной множественными вызовами из вашего фильтра.

Если вы ищете подсказки для реализации, тогда мне нужно позвонить SecurityContextHolder.getContext().setAuthentication(), когда ваш код подтвердил аутентификацию и завершенную авторизацию, для меня это нормально.

Может быть, лучше использовать @javax.annotation.security.RolesAllowed вместо@Secured (работает так же, но название более очевидно).

И иногда вам может потребоваться использовать org.springframework.http.client.ClientHttpRequestInterceptor вместо фильтра, см. Например: Разница между перехватчиком и фильтромвесной MVC

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