2016-05-31 4 views
0

Я использую Spring Security (версия 4.0.3.RELEASE) с разрешениями уровня ACL. Я пытаюсь применить разрешения ACA на предварительный авторизацию для метода удаления в моем CrudRepository интерфейс с использованием аннотации @PreAuthorize с вызовом метода SPEL «hasPermission» (см. ниже). HasPermission ссылается на входной аргумент, используя хеш-нотацию, которую я видел на нескольких форумах, учебниках и справочных документах, но входной аргумент (объект, который я хочу удалить) не подбирается парсером SPEL или поддерживает фреймворк. Таким образом, другими словами, я хочу удалить объект с именем «apiKey», который является входным аргументом ниже. Я ссылаюсь на него в аннотации SPEL с помощью «#apiKey», но когда я помещаю точку останова в метод org.springframework.security.acls.AclPermissionEvaluator.hasPermission (...), входной аргумент «domainObject» равен NULL.Ссылка на объект SPEL объекта с привязкой к объекту «разыменования» входной аргумент объект

Я довольно новичок в Spring и ACL, поэтому я должен делать что-то принципиально неправильно. Я попытался поставить контрольные точки в Spring SPEL Parser и пройтись во время выполнения, но я не могу найти фрагмент кода, который разрешает рефлексивные аргументы на основе токена SPEL. Я думаю, что это «скрыто» в собственном методе или что-то в этом роде.

Я также пытался возиться с синтаксисом ссылки SPEL. Ничто другое не выглядит правильно, поэтому я думаю, что «#argument_name» является правильным синтаксисом - это просто, что SPEL не может разыменовать объект аргумента.

Мой CrudRepository код ж/ссылки на объект ("#apiKey"), который не работает:

public interface ApiKeyRepository extends CrudRepository<ApiKey, Long> { 
    @Override 
    @PreAuthorize("hasPermission(#apiKey, 'DELETE')") 
    void delete(ApiKey apiKey); 
} 
код

Spring Security, который должен получать мой объект apiKey, но вместо этого получает NULL значение для domainObject:

public class AclPermissionEvaluator implements PermissionEvaluator { 
    ... 
    public boolean hasPermission(Authentication authentication, Object domainObject, Object permission) { 
     if (domainObject == null) { 
      return false; //<== This is where I'm getting access denied from 
     } 
     ... 

Любые идеи, почему SPEL не может правильно ссылаться на входной apiKey аргумент? Заранее спасибо.

ответ

0

я понял мою проблему благодаря THIS POST, который ссылается THIS DOC:
Видимо, вы не можете сделать объектные ссылки на аргументы метода в интерфейсе без использования аннотации @param на арг. Итак, вот мой обновленный код, который устраняет проблему:

public interface ApiKeyRepository extends CrudRepository<ApiKey, Long> { 
    @Override 
    @PreAuthorize("hasPermission(#apiKey, 'DELETE')") 
    void delete(@Param("apiKey") ApiKey apiKey); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^