Пользовательский фильтр Spring Security с дополнительными ролями в ключе памяти и в памяти - PullRequest
0 голосов
/ 12 марта 2020

Я разрабатываю приложение, которое интегрируется с 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 конечных точек, а какие нет?

...