Я разрабатываю приложение, которое интегрируется с Keycloak в качестве единого входа. У нас есть две роли:
- Администратор
- Пользователь
Мы используем Spring Security для интеграции с Keycloak и аутентификации.
Keycloak является частью микросервисной экосистемы, следовательно, он не может иметь больше роли. Из-за этого мы имеем второй уровень пользовательских данных, хранящихся в нашей базе данных.
Общий элемент этих двух наборов - subjectId
, на основе которого мы проверяем вход в систему или изменение данных в keycloak (т. Е. По электронной почте, имя, пароль). Все пользователи приложения c имеют роль Keycloak User
.
Однако проблема возникает, когда пользователь пытается использовать любую конечную точку. Чтобы проверить, разрешено ли ему это, я создал простой метод авторизации 'isAllowed' - метод получает два аргумента: роль зарегистрированного пользователя и список разрешенных ролей.
@GetMapping
public String hello(Principal principal) {
if (isAllowed(loggedUserService.getLoggedUserRole(principal).getRoleId(), Set.of(Role.MODERATOR))) {
//endpoint actions
} else throw new NotAllowedException();
}
И вот определение метода isAllowed
:
public static boolean isAllowed(Long loggedUserRoleId, Set<Role> allowedRoles) {
return allowedRoles.stream()
.anyMatch(role -> role.getId().equals(loggedUserRoleId));
}
Я думаю, что это не оптимальное решение и его можно каким-то образом интегрировать с Spring Security.
Я обнаружил, что Spring Security позволяет добавлять пользовательских фильтров , это частично решает мою проблему.
Чего не хватает, так это как определить, какие роли могут иметь доступ для определенных c конечных точек, а какие нет?