Я хочу иметь возможность предоставлять различные полномочия пользователям в зависимости от того, к какому ресурсу они пытаются получить доступ. Конечно, я мог бы сделать это, внедрив 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());
}