Убедитесь, что конкретный пользователь может видеть только свои собственные данные пользователя - Использование Spring - PullRequest
0 голосов
/ 28 апреля 2019

Работа с Spring / Spring Security на небольшом проекте в данный момент и трудности с реализацией этой функции.В идеале я хочу, чтобы user1 просматривал подробности user1, а не, например, 2,3 или 4.

Я реализовал Spring Security с ролями и понимаю, что могу получить объект или принцип UserDetails,Я точно не уверен, но я знаю, что могу получить информацию о текущем вошедшем в систему пользователе, используя один из, как представляется, многих методов.

Это то, что я сейчас использую в качестве доказательства концепциикогда мы переходим на страницу администратора / домашней страницы:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    Gamer gamer = gamerService.findGamerByEmail(auth.getName());

    System.out.println("Auth: " + auth.getName());
    System.out.println("Gamer: " + gamer.getName() + gamer.getId() + gamer.getEmail());

Конфигурация безопасности заботится о том, может ли текущий пользователь получить доступ из-за назначенных ему ролей.

Я полагаю, что смогу перейти по URL-адресу /mysite/viewUserDetails и на этой странице отобразить информацию о текущем пользователе, но я не могу найти никаких примеров этого, я нашел множество примеров, которые доказываютвошедший в систему пользователь может просматривать страницу, но ни одна из них, где указаны проверки, чтобы гарантировать, что user1 может просматривать только данные пользователя 1.

На старой странице я делаю это для отображения информации для конкретного пользователя, но я понимаю, что это плохопрактика-

<a th:href="@{/gamer/{gamerid}/games/excited (gamerid=${gamer.id}) }">

* Стоит отметить, что здесь не используется какая-либо форма входа / регистрации для извлечения этой информации, я просто использую идентификатор, который передаю в качестве части запроса БД.

Он отображается на:

   @RequestMapping("/gamer/{gamerid}/games/excited")
public String getExcited(@PathVariable final Long gamerid, Model model){

    addGamerListAttributes(model, gamerid, "EXC");
    return "games";
}

Таким образом, у меня возникает вопрос, и я надеюсь, что вы можете указать верное направление. Как я могу реализовать решение, в котором пользователь может просматривать только свои данные?и как это должно быть представлено через форму и соединяющие контроллеры, так как передача идентификаторов в URL довольно уродлива (я мог бы использовать guid, но ...)

Заранее большое спасибо.

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Это на самом деле довольно легкий выбор. Либо у вас есть точка входа, например:

@RequestMapping("/gamer/{gamerid}/games/excited")

и вы вручную проверяете, что пользователь в сеансе может получить доступ к запрошенному ресурсу, или у вас есть что-то вроде

@RequestMapping("/my-games")

, который автоматически считывает идентификатор пользователя из контекста безопасности.

Больше, чем выбор безопасности, я бы выбрал один в зависимости от повторного использования кода и будущих сценариев использования (например, одну и ту же страницу / набор страниц может просматривать более чем один пользователь).

1 голос
/ 28 апреля 2019

Посмотрите на @PreAuthorize аннотацию. Возможно аннотировать заданную конечную точку и создавать собственную логику в бине. Затем вы можете использовать пользовательский метод, чтобы разрешить или запретить выполнение конечной точки:

@Controller
public class HomeController {

    @Autowired
    private AuthenticationService authenticationService;

    @RequestMapping("/gamer/{gamerid}/games/excited")
    @PreAuthorize("@authenticationService.hasAccess(#gamerid)")
    public String getExcited(@PathVariable final Long gamerid, Model model){

        addGamerListAttributes(model, gamerid, "EXC");
        return "games";
    }
}

Класс обслуживания:

@Service
public class AuthenticationService {
    public boolean hasAccess(String tgamerid) {
        //implement logic here
        return true;
    }
}

Метод hasAccess в AuthenticationService должен возвращать логическое значение. @PreAuthorize будет запущено до вызова метода обработчика контроллера. Вышеуказанный контроллер является лишь примером. Вы можете передать Authentication объект в выражении SPeL в аннотации @PreAuthorize методу сервиса или получить его из контекста безопасности внутри класса сервиса, чтобы реализовать логику, которая соответствует вашим потребностям. Дополнительную информацию можно найти здесь и в Spring Docs .

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