Spring Security @PreAuthorize用于验证控制器

时间:2019-02-04 18:10:34

标签: java spring-mvc spring-security

我的控制器中有以下方法。

    @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 :(得分:0)

我在想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";
    }

答案 1 :(得分:0)

我使用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";
    }

request uri可能是这样的。

http://localhost:8080/...../update/31?u=83