Аутентификация пользователя Spring Security против клиентов и сотрудников

Я новичок в Spring Security. У меня есть приложение Spring Boot с двумя разными типами сущностей. Клиенты и сотрудники. В «Сотрудниках» у меня есть обычные сотрудники, админы и суперпользователи. Поскольку я использую JPA, у каждой сущности есть свой repository. Как смоделировать мой UserDetailsService с loadUserByUsername, поскольку это распространенный метод проверки во многих репозиториях. Есть ли что-то, чего мне не хватает для моделирования моих сущностей?

Дополнительная информация:

В моем дизайне у меня есть две сущности. Customer и Employee. Employee будет иметь такие роли, как NORMAL, ADMIN и SUPER_USER. Клиент — это другая сущность.

Будут ли два UserDetailsService и два AuthenticationProvider, каждый из которых будет указывать на свою таблицу (Customer и Employee)?


person zilcuanu    schedule 14.09.2019    source источник
comment
ваш вопрос очень узкий, но у вас гораздо большее требование, которое отсутствует в вашем вопросе. Прежде чем задать вопрос, я предлагаю вам собрать требования. Позвольте мне помочь вам в задании вопроса. У вас другой набор пользователей? Клиенты как разные сущности и сотрудники как разные сущности. Сотрудники могут иметь роли employee, admin и superuser. Если вы сделаете отдельные таблицы для сотрудников, администраторов и суперпользователей, это будет плохой дизайн. Я предлагаю вам иметь одну сущность/таблицу для сотрудника, администратора и суперпользователя.   -  person PraveenKumar Lalasangi    schedule 14.09.2019
comment
у вас может быть отдельная сущность/таблица для клиента. И есть ли у вас отдельный интерфейс входа для клиента и сотрудника. Я думаю, вам нужны отдельные страницы/формы входа для сотрудников и клиентов. Я прав?   -  person PraveenKumar Lalasangi    schedule 14.09.2019
comment
@PraveenKumarLalasangi Добавил детали в вопрос   -  person zilcuanu    schedule 14.09.2019


Ответы (2)


Поскольку ваше требование состоит в том, чтобы иметь несколько точек входа для аутентификации, это не так просто, как ответ Атула.

Вам нужно

  1. Вам нужно различать клиента и сотрудника при входе в систему. (Предпочтительный переключатель)

  2. Вам необходимо реализовать свой собственный фильтр аутентификации, т. Е. Реализация UsernamePasswordAuthenticationFilter вместо пружинной безопасности по умолчанию .formLogin()

  3. Создайте два UsernamePasswordAuthenticationToken как EmployeeUsernamePasswordAuthenticationToken и CustomerUsernamePasswordAuthenticationToken

  4. В вашем пользовательском фильтре получите userType из запроса и на основе userType установите authToken как empAuthToken или customerAuthToken, чтобы различать требуемого поставщика аутентификации.

  5. Создайте AuthenticationProvider как EmployeeCustomAuthenticationProvider и CustomerCustomAuthenticationProvider, где каждый AuthenticationProvider должен быть переопределен, поддерживает метод, где AuthenticationProvider поддерживает определенный токен либо customerAuthToken, либо employeeAuthToken.

  6. Переопределить метод аутентификации, если метод аутентификации был передан с параметром аутентификации, из которого вы можете получить как имя пользователя, так и пароль, которые вы можете передать любой из ваших пользовательских служб для аутентификации пользователя и предоставления полномочий, необходимых для пользователя.

При реализации вашего CustomAuthenticationFilter также необходимо предоставить ваши пользовательские аутентификацииSuccessHandler и AuthenticationFailureHandlers.

Если вы реализуете все вышеперечисленное без каких-либо ошибок, вы можете избежать резервной аутентификации, которую spring-security предоставляет по умолчанию, если настроены два customAuthenticationProvider.

Для получения более подробной информации о реализации нескольких точек входа для аутентификации с использованием конфигурации java обратитесь к моему ответу, приведенному ниже Multiple AuthenticationProvider с другим UsernamePasswordAuthToken для аутентификации различных форм входа без резервной аутентификации.

а также вы можете загрузить рабочий код из моего репозитория github

person PraveenKumar Lalasangi    schedule 23.09.2019

«Будут ли два UserDetailsService и два AuthenticationProvider, каждый из которых указывает на свою собственную таблицу (Customer и Employee)?» ..... Ответ - да.

Безопасность Spring имеет фильтр UsernamePasswordAuthenticationFilter (проверьте имя фильтра), где вы можете реализовать конкретную реализацию на основе типа ввода.

Я сделал то же самое, но для других механизмов аутентификации. Но согласно вашему требованию, это возможно то, что вы ищете.

person Atul    schedule 14.09.2019