Возвращает ли hasPermission false, если объект аутентификации имеет значение null

У меня есть изменение кода ниже.

-    @PreAuthorize("isAuthenticated()")
+    @PreAuthorize("hasPermission(#dto.perusteId, 'peruste', 'LUKU')")
     public void setStarted(DokumenttiDto dto);

Согласно документации Spring, объект аутентификации не должен быть нулевым. Здесь разработчик убирает проверку аутентификации и ставит проверку hasPermission. Так будет ли метод hasPermission возвращать false, если объект аутентификации имеет значение null? Объект аутентификации будет предоставлен фреймворком безопасности spring автоматически. Можно ли это считать изменением рефакторинга? две проверки (аутентификация + проверка разрешений) объединены в одну (проверка разрешений)! Я не думаю, что реализация метода hasPermission выполняет какие-либо проверки объекта аутентификации. /vm/sade/eperusteet/service/security/PermissionEvaluator.java" rel="nofollow">https://github.com/Opetushallitus/eperusteet/blob/cd9eff86bdda5dd91072354392dedbe0783c9ddf/eperusteet/eperusteet-service/src/main/java/fi /vm/sade/eperusteet/service/security/PermissionEvaluator.java)

Вот ссылка на изменение кода: https://github.com/Opetushallitus/eperusteet/commit/e8459

Method Detail

hasPermission
public boolean hasPermission(Authentication authentication,
                    Object domainObject,
                    Object permission)
Determines whether the user has the given permission(s) on the domain object using the ACL configuration. If the domain object is null, returns false (this can always be overridden using a null check in the expression itself).
Specified by:
hasPermission in interface PermissionEvaluator
Parameters:
authentication - represents the user in question. Should not be null.
domainObject - the domain object for which permissions should be checked. May be null in which case implementations should return false, as the null condition can be checked explicitly in the expression.
permission - a representation of the permission object as supplied by the expression system. Not null.

person Zack    schedule 11.07.2015    source источник


Ответы (2)


Я надеюсь, что это делает

Он возвращает объект разрешений, который на самом деле является массивом/списком всех разрешений, которые есть у пользователя.

Если у вашего пользователя нет ролей, возвращается пустой список, который добавляется к объекту аутентификации.

e.g

Authentication object when 

User with roles
permissions = ['admin, 'user', 'moderator'];
User with no roles
permissions = []
person Ekansh Rastogi    schedule 11.07.2015
comment
что происходит, когда объект аутентификации имеет значение null? - person Zack; 12.07.2015
comment
у вас есть фильтр делегата в весенней безопасности, который создает объект аутентификации и отправляет его в AuthenticationManger, а затем в AuthenticationProvider для аутентификации пользователя, обращающегося к ресурсу. Если пользователь не аутентифицирован, он выполняет действие по умолчанию (или то, что вы объявляете), иначе он просто выбирает пользователя из контекста SpringSecutity и позволяет пользователю получить доступ к ресурсу. - person Ekansh Rastogi; 12.07.2015

Функция hasPermission (если она правильно подключена к оценщику выражений безопасности) на самом деле просто передает токен authentication в PermissionManager.hasPermission. Если вы посмотрите на код, то увидите, что большинство запутанных операторов if в конечном итоге вызывают hasAnyRole, который возвращает false, когда объект authentication имеет значение null.

Однако весь этот класс настолько запутан, что я не могу сказать, что в реальности он работает лучше, чем генератор случайных чисел.

person billc.cn    schedule 11.07.2015