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

Need data from database for use in SpEL method level security

我想使用 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 表达式中使用它?

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

@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;
       }
   }
}

那你可以参考SpEL中的这个方法:

@PreAuthorize("@securityService.isAllowToDeleteSomeObject(#.id)")
public void delete(@PathVariable("id") final Long id) {   
}