В чем преимущество предоставления Tokenized Authentication в приложении с Spring Boot Backend по сравнению с SecurityContextHolder? - PullRequest
0 голосов
/ 20 января 2019

Я начал работать с Spring Boot и Angular 7, и я столкнулся с аутентификацией пользователя.

Давайте предположим следующее: у меня есть веб-интерфейс с Angular 7 и бэкэнд с Spring Boot, который предлагает API, к которым можно получить доступ через HTTP.

Так что я знаю, что обычно веб-интерфейс аутентифицирует пользователянапример, JWT, в котором хранится вся необходимая информация о пользователе.Но я столкнулся с SecurityContextHoler Spring Boot Security:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

Это позволяет мне просто получить доступ к предоставленным полномочиям и так далее.Поэтому я подумал о следующем:

Использование JWT для внешнего интерфейса дает следующие преимущества (насколько мне известно): * Пользователи могут идентифицировать при использовании API * Пользователи могут быть лишены определенных элементов интерфейса (на основероли, хранящиеся в JWT) * Предотвращение модификации из-за контрольной суммы (неверный токен впоследствии)

Теперь я мог бы также добавить проверку в моем контроллере в бэкэнд, которая проверяет SecurityContextHolder на предмет разрешения пользователя (что-то вроде службы, котораяпроверяет текущие разрешения контекста и необходимые разрешения и возвращает true / false).Разве это не было бы еще более экономно, так как оно находится в бэкэнде (так что в моем воображении все, что выполняется на стороне сервера, всегда немного больше, чем то, что работает на стороне клиента)?

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

Но очевидно, что так не принято (по крайней мере, я никогда не видел), так в чем же преимущество токенизации?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Они не являются взаимоисключающими. Вы будете использовать то, что вы называете «Tokenized Authentication», например, токен oAuth2 Bearer, скорее всего, в JWT, когда аутентификация выполняется отдельной системой из вашего бэкэнда Spring Boot. Например, вы можете использовать Okta, Keycloak, Google или Facebook для аутентификации пользователя.

Как минимум, ваш бэкэнд Spring Boot хранит имя пользователя, извлеченное из JWT в Authentication. Вы можете заставить Spring Boot извлечь любые роли в токене и добавить их в Authentication::grantedAuthorites. Если ваша бэкэнд-система имеет свой собственный набор ролей в дополнение к тому, что находится в токене, тогда бэкэнд может реализовать PrincipalExtractor для загрузки объекта UserDetails для этого пользователя из базы данных как Principal и объединения ролей в токен с этим хранилищем в локальной базе данных.

Возможно, вы захотите защитить определенные методы в своем бэкэнде с помощью аннотаций безопасности методов, таких как @PreAuthorize(), поскольку вы не должны доверять внешнему интерфейсу. Метод безопасности проверяет разрешения, например hasRole("ADMIN") или hasPermission(object, 'READ'), используя объект Principal в SecurityContextHolder.getContext().getAuthentication();

В конце концов, токен гарантирует, что пользователь, обращающийся к нему, является бэкэндом, то есть кем он себя называет, т. Е. Аутентификация, но не обязательно сообщает бэкэнду, что ему разрешено делать. Да, если вы управляете сервером аутентификации, вы можете включать роли в JWT, но роли обычно не обеспечивают столь детального контроля, как требуется.

Независимо от того, какой уровень безопасности вы реализуете, токен преобразуется в Авторизацию, поэтому вы можете использовать инфраструктуру Spring Security для управления доступом в своем бэкэнд-коде.

0 голосов
/ 20 января 2019

В весенней безопасности OAuth2 существует 3 типа токенов: 1. Хранилище токенов InMemory 2. Хранилище токенов JJT 3. Хранилище токенов JDBC

Итак, вы говорите о хранилище токенов JWT.Самое мощное хранилище токенов JWT - предотвращение загрузки сервера авторизации в базу данных для проверки, например, роль, срок действия токена истек, так что это связано с производительностью загрузки базы данных.Поскольку вся информация, такая как: роль, имя пользователя, токен истекает и т. Д., Включена в сам токен.Таким образом, сервер авторизации или другой сервер ресурсов могут использовать открытый ключ для проверки самого токена без обращения к хранилищу данных.

Надеюсь, полезно!☺️

...