Как аутентифицировать предварительно аутентифицированного пользователя LDAP, используя Spring Security, используя ping-доступ и имя пользователя, переданное в заголовке?
Ранее я использовал базовую аутентификацию, но мне нужно переключиться на федеративную аутентификацию с помощью Ping Access. Пользователь уже аутентифицирован, и имя пользователя вместе с токеном отправляются в заголовке запроса. Как связать имя пользователя с принципалом пользователя ldap, используя Spring Security?
1 ответ
Итак, есть ряд вещей, которые необходимо учитывать при рассмотрении вашей реализации. Вот очень краткое изложение пьес в игре.
Цепочка фильтров
Цепочка фильтров обычно предназначена для различения сервлетов и остальной части приложения. Если вы продлили OncePerRequestFilter
тогда вы, вероятно, уже на правильном пути.
Если вы намерены следовать типичной модели Spring Security, этот фильтр подготовит Authentication
объект, который затем может быть аутентифицирован в AuthenticationManager
, Вы можете попробовать и использовать существующий Authentication
реализация как PreAuthenticatedAuthenticationToken
, или вы можете создать свой собственный и назвать его JwtAuthenticationToken
,
Диспетчер аутентификации
AuthenticationManager
по сути, это набор провайдеров, которые могут аутентифицировать токен, например, ваш токен Jwt. Их контракт отделен от сервлетов и поэтому немного более гибок.
Вы, вероятно, создали бы JwtAuthenticationProvider
это подтвердит токен, а затем вызовет UserDetailsService
чтобы получить основного пользователя.
Spring Security не имеет специальной поддержки для JWT, но у них есть некоторые библиотеки, которые используют Nimbus. Вы можете проверить код в spring-security-oauth2-resource-server, чтобы увидеть, как они проверяют JWT, используя UW Set JWK. Вы не хотели бы зависеть от этой библиотеки, поскольку она ориентирована на OAuth, но она может дать вам некоторые идеи.
Сервис данных пользователя
UserDetailsService
Реализация отвечает за запрос серверной части и извлечение из нее пользователя. Например, есть LdapUserDetailsService
что вы могли бы использовать.
Резюме
Итак, со всем вышесказанным, вот краткое изложение того, что я, вероятно, буду делать:
Создать
JwtAuthenticationToken
объект, который может содержать токен jwt и, возможно, представлять успешную аутентификацию, когда Spring Security завершит процесс проверки.Создать
JwtAuthenticationFilter
который читает токен из запроса и заполняетJwtAuthenticationToken
, отправив его наAuthenticationManager
,Создать
JwtAuthenticationProvider
это читаетJwtAuthenticationToken
и отправляет его в Nimbus (или в Auth0, или в другую библиотеку jwt) для проверки. Вам нужно будет решить, как вы доверяете этому токену - Nimbus способен выполнять удаленную проверку через Uri JWK Set или локально через предварительно настроенный набор открытых или симметричных ключей. (Здесь тоже много думать!)Использовать
LdapUserDetailsService
, передав ему имя разбираемого предмета.UserDetails
что возвращается может быть поставлено в качестве основного дляAuthentication
объект, который возвращает ваш провайдер.
альтернативы
Итак, допустим, что вы не хотите / не должны следовать модели разработки Spring Security, а просто хотите получить что-то работающее как можно скорее.
Две вещи, которые вам в конечном итоге нужно выполнить, это
- Решите, является ли токен действительным. Spring Security пока не поддерживает OAuth2-free, поэтому вам нужно будет выполнить свою собственную проверку с помощью Nimbus или чего-либо подобного.
- Настроить и вызвать
LdapUserDetailsService
, ОтUserDetails
это дает вам, вы можете построитьAuthentication
объект, который вы можете установить наSecurityContextHolder
,
Это было бы не так гибко с течением времени, но могло бы заставить вас начать работать немного быстрее.
Другие вещи, чтобы думать о
Вы не спрашивали об этом, но мне интересно, что вы планируете делать, если токен как-то недействителен. В этих случаях вы можете посмотреть на AuthenticationEntryPoint
с и AccessDeniedHandler
s.