Нужны данные из базы данных для использования в безопасности уровня метода SpEL - PullRequest
0 голосов
/ 09 июля 2019

Я хотел бы использовать 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 является идентификатором некоторого объекта.Чтобы получить идентификатор владельца объекта (то, что я хочу передать в выражении spel), мне нужно сделать что-то вроде:

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

Как я могу получить этот идентификатор и использовать его вВыражение SpEL?

1 Ответ

1 голос
/ 10 июля 2019

зачем надо так сложно? Вы можете просто создать другой метод, чтобы специально проверить, может ли текущий пользователь удалить объект с данным идентификатором этого объекта, и заставить @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) {   
}
...