是否有可能检查一个Spring控制器方法权限不执行呢?(Is it possible to chec

2019-10-21 08:48发布

我的REST API的JS客户想知道,是一个查询,以允许或没有一定的URL。 权限使用标准的注释的控制器方法配置:

@Controller
@RequestMapping("/books")
public class BooksController {

  @RequestMapping("read")
  @Secured("ROLE_READER")
  public ModelAndView read(int id) { ... }

  @RequestMapping("write")
  @Secured("ROLE_WRITER")
  public ModelAndView write(int id, String contents) { ... }
}

@Controller
@RequestMapping("/util")
public class UtilController {

  @RequestMapping("check")
  public String check(String url) {
    //if url is "/books/read" and isUserInRole("ROLE_READER")
    //or url is "/books/write" and isUserInRole("ROLE_WRITER")
    //return "true", otherwise "false"
  }
}

对于只读方法将有可能给JS客户端试图访问一个网址本身,忽略结果,并期待仅在状态(200或403-禁止)进行编程。 这不是最好的性能,明智的,但至少正确功能。 但对于写方法我看不出有什么办法解决。 望有此问题的理智的解决方案。

PS感谢@Bogdan的解决方案。 这是我所需要的方法的全文:

@Autowired
WebInvocationPrivilegeEvaluator evaluator;

@RequestMapping("/check")
public String check(String url, Authentication authentication) {
    return Boolean.toString(evaluator.isAllowed(url, authentication));
}

Answer 1:

对于UtilController你贴,你可以使用像一个走WebInvocationPrivilegeEvaluator ,也许也有看看如何authorize标签的工作原理。

此外,这取决于你在做什么,这样的事情也工作:

@Controller
@RequestMapping("/books")
public class BooksController {

  @RequestMapping("read")
  @Secured("ROLE_READER")
  public ModelAndView read(int id) { ... }

  @RequestMapping("canRead")
  @Secured("ROLE_READER")
  public void canRead() { }

  @RequestMapping("write")
  @Secured("ROLE_WRITER")
  public ModelAndView write(int id, String contents) { ... }

  @RequestMapping("canWrite")
  @Secured("ROLE_WRITER")
  public void canWrite() { }
}

然后,您可以检查状态代码调用的新方法。



文章来源: Is it possible to check permissions on a Spring Controller method without executing it?