Получить полномочия пользователя на основе текущего URI запроса - PullRequest
0 голосов
/ 24 марта 2020

Я хочу иметь возможность предоставлять различные полномочия пользователям в зависимости от того, к какому ресурсу они пытаются получить доступ. Конечно, я мог бы сделать это, внедрив logi c на каждом из соответствующих контроллеров, но я бы действительно хотел воспользоваться преимуществами безопасности Thymeleaf в моих шаблонах, а также аннотациями Spring * @PreAuthorize().

На данный момент я использую простую реализацию UserDetails для предоставления списка предоставленных прав доступа для некоторых моделей в базе данных:

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    return this.userAccount.getRoles().stream()
            .map(role -> new SimpleGrantedAuthority(role.getName()))
            .collect(Collectors.toList());
}

Однако мне нужно поведение, которое может выполнять следующие действия :

Пользовательские запросы /courses/1. Они студенты этого курса, поэтому они получают следующие роли: (...)

Пользовательские запросы /courses/2. В этом курсе они администраторы, поэтому они получают следующие роли: (...)

Проблема в том, что интерфейсы Spring UserDetailService и UserDetails не допускают автоматического подключения текущий запрос контекста где угодно, насколько я могу видеть. Есть ли способ, которым это можно сделать? В идеале я бы просто хотел получить доступ к HttpServletRequest. Примерно так:

@Override
public Collection<? extends GrantedAuthority> getAuthorities(HttpServetRequest request) {
    return this.userAccount.getRolesForURI(request.getURI()).stream()
            .map(role -> new SimpleGrantedAuthority(role.getName()))
            .collect(Collectors.toList());
}

1 Ответ

1 голос
/ 24 марта 2020

Вы можете просто @Autowire HttpServletRequest в свой UserDetailsService.

 @Autowired
 private HttpServletRequest request;

Для его работы вам может потребоваться зарегистрировать RequestContextListener.

@Bean 
public RequestContextListener requestContextListener(){
    return new RequestContextListener();
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...