需要数据库中的数据以用于SpEL方法级安全性

时间:2019-07-09 15:30:25

标签: spring-security spring-el

我想使用SpEL处理方法级别的安全性。我遇到了一个问题,即传递给该方法的数据不足以确定用户是否具有访问权限。这是一个例子

@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.NO_CONTENT)
@PreAuthorize("@securityService.isAllowedAccessByCurrentUser(#.id)")
public void delete(@PathVariable("id") final Long id) {
    service.delete(id);
}

在这里,id变量是某个对象的ID。要获取对象的所有者ID(这是我要在spel表达式中传递的内容),我需要执行以下操作:

service.findOne(id).getUser().getId();

如何获取该ID并将其用于SpEL表达式中?

1 个答案:

答案 0 :(得分:1)

为什么需要这么复杂?您可以简单地创建另一个方法来专门检查当前用户是否可以删除给定对象ID的对象,并使VpnService引用此方法:

@PreAuthorize

然后您可以在SpEL中引用此方法:

@Service
public class SecurityService{

    @Autowired
    private Service service

    boolean isAllowToDeleteSomeObject(Long objectId){

       SomeObject anObject = service.findOne(objectId);

      //You should able to get the current user Id by SecurityContextHolder.getContext().getAuthentication(). 
      //getCurrentUserId() simply encapsulate such codes for convenient.
       Long currentUserId = getCurrentUserId();

       if(anObject.getUser().getId().equals(currentUserId)){
         return true;
       }else{
         return false;
       }
   }
}