Я использую 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 аргумент? Заранее спасибо.