Spring Security - авторизация аккаунта - PullRequest
0 голосов
/ 04 сентября 2018

Я работаю над проектом, в котором пользователь может просматривать только информацию своего аккаунта. Вот примеры API:

http://example.com/clients -> только администратор может звонить

http://example.com/clients/1 -> администратор и клиент с id = 1 могут позвонить

http://example.com/clients/2 -> администратор и клиент с id = 2 могут позвонить

Надеюсь, вы понимаете, о чем я.

Первое решение :

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

Второй раствор :

Я пытаюсь сделать то же самое с Spring Security, но застрял в авторизации шаблонов. У вас есть идеи, как я могу сделать то же самое с Spring Security?

http.authorizeRequests().antMatchers("/clients").hasRole("ADMIN");
//I could not go further with each client

Любая идея будет оценена. Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Я просто хочу указать на не быстро доставляемый, а другой вариант. Это можно сделать с помощью ApiRequestInterceptor и SecurityContextHolder*. В этом перехватчике вы можете предварительно обработать запрос. Вам нужны три таблицы для роли, полномочий и их отношений. Уважать роль владельца запроса, вы можете заполнить SecurityContextHolder.

public class ApiRequestInterceptor extends HandlerInterceptorAdapter {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    //get token
    List<String> grantedAuthorities = new ArrayList<>();
    grantedAuthorities.addAll(token.getRoles());
    //get authorized pages via service
    final List<String> authPages= service.getAuthPages(grantedAuthorities);
    SecurityContextHolder.getContext().setAuthentication(authPages)
    return true;
}

}

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

*: Когда приходит запрос, он обрабатывается в новом потоке, и каждый поток имеет свой SecurityContextHolder. Вот документация: https://docs.spring.io/spring-security/site/docs/4.2.6.RELEASE/apidocs/org/springframework/security/core/context/SecurityContextHolder.html

0 голосов
/ 04 сентября 2018

Вместо применения защиты в конфигурационном файле вы можете применить это к самому методу.

Пожалуйста, удалите antMatchers("/clients").hasRole("ADMIN") из файла конфигурации.

И обновите ваши методы, как это:

@RequestMapping(value = "/clients")
@PreAuthorize("hasRole('ADMIN')")

И еще один метод, как:

@RequestMapping(value = "/clients/{id}")
@PreAuthorize("hasAnyRole('ADMIN','USER')")

Это будет работать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...