Spring Security @PreAuthorize для проверки контроллера - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть следующий метод в моем контроллере.

    @GetMapping("/update/{idpost}")
    public String showUpdateForm(
            @PathVariable int idpost, 
            @ModelAttribute("post") Post post,
            @ModelAttribute("user") User user,
            Model model) {

        post = postService.findById(idpost);
        model.addAttribute("post", post);
        return "_updateForm";
    }

Показывается форма для обновления существующего поста.

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

, поэтому я попробовал это .., стремясь сопоставить адрес электронной почты текущего пользователя (authentication.name) с адресом электронной почты владельца сообщения.но не повезло.

    @PreAuthorize("#post.user.email == authentication.name")
    @GetMapping("/update/{idpost}")
    public String showUpdateForm(
            @PathVariable int idpost, 
            @ModelAttribute("post") Post post,
            @ModelAttribute("user") User user,
            Model model) {

        post = postService.findById(idpost);
        model.addAttribute("post", post);
        return "_updateForm";
    }

Оказалось, что post аргумент имеет нулевое значение.что очевидно, как это определено в метод.(или как я использовал это совершенно неправильно.)

Вы бы поняли, что я делаю?Как я могу использовать @PreAuthorize для этой цели?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Я решил эту проблему, используя RequestParam.

    @PreAuthorize("#userid == #user.id")
    @GetMapping("/update/{idpost}")
    public String showUpdateForm(
            @PathVariable int idpost, 
            @ModelAttribute("post") Post post,
            @ModelAttribute("user") User user,
            @RequestParam("u") int userid,
            Model model) {

        post = postService.findById(idpost);
        model.addAttribute("post", post);
        return "_updateForm";
    }

запрос URI может быть таким.

http://localhost:8080/...../update/31?u=83
0 голосов
/ 05 февраля 2019

Я думаю, что PostAuthorize - это то, что вы хотите.Примечание: я сам не использовал эту аннотацию, но на это она намекает.Если вам этого недостаточно, дайте мне знать, и я смогу еще немного изучить и посмотреть, смогу ли я получить вам образец.

PS.Не забудьте включить PostAuthorize @EnableGlobalMethodSecurity(prePostEnabled = true)

    @PostAuthorize("#returnObject.user.email == authentication.name")
    public Post getPost(int idpost) {
        return postService.findById(idpost);
    }

    @GetMapping("/update/{idpost}")
    public String showUpdateForm(
            @PathVariable int idpost, 
            @ModelAttribute("user") User user,
            Model model) {

        post = getPost(idpost);
        model.addAttribute("post", post);
        return "_updateForm";
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...