在弹簧控制器上添加基于角色的逻辑

时间:2019-03-01 14:30:52

标签: java spring spring-boot security controller

因此,我一直在寻找解决方案,但找不到任何我想要的东西,我正在根据用户为不同的权限重载一种方法。我正在使用Spring Boot和Spring Security。例如:

@ResponseBody
@GetMapping("/role")
@Secured("ROLE_ADMIN")
public ResponseEntity<String> areYouAdmin() {
    return new ResponseEntity<>("ADMIN YES", HttpStatus.OK);
}

@ResponseBody
@GetMapping("/role")
@Secured("ROLE_USER")
public ResponseEntity<String> areYouUser() {
    return new ResponseEntity<>("USER YES", HttpStatus.OK);
}

因此,在此情况下,如果用户是ROLE_USER,则他们将收到“ USER YES”响应,而ROLE_ADMIN将为“ ADMIN YES”。我知道这可以通过在实际方法中添加检查并使用角色作为条件来实现,但是想知道是否有更清洁的方法。这里可能的用例是,如果他们正在搜索资源,并且如果他们是用户,则只会显示状态为OPEN或类似的内容,而管理员可以根据所有状态进行过滤和搜索。另一个可能是,如果我们要返回其他dto,即admin可以查看有关用户的所有信息。

我还考虑过使用不同的路径并使用我的网络安全配置IE:

        .antMatchers("/api/admin").hasRole(ADMIN)
        .antMatchers("/api/user").hasRole(USER)

但是我真的不希望我的前端是“智能的”,后端应该根据角色显示数据,而无需任何特殊的路径或新的servlet。 预先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

通常,与管理员相关的URL以/ admin / **开头,所以我认为,与在Config文件中一样,为管理员和用户使用不同的URL是个好习惯。

您可以将相同的URL用于以下不同角色

// REST version, Content-type is "application/json"
@RequestMapping(value = "/", consumes = "application/json")
public void myRestService() {
...

// HTML version, Content-type is not "application/json"
@RequestMapping(value = "/", consumes = "!application/json")
public void myHtmlService() {
...

// the url is /?role=guest
@RequestMapping(value = "/", param = "role=guest")
public void guestService() {

// the url is / with header role=admin
@RequestMapping(value = "/", headers = "role=admin")
public void adminService() {

自定义属性@RequestMapping

有关更多详细信息,请参阅Refer 1Refer 2