Как проверить полномочия пользователя или разрешение в Java-коде? Например - я хочу показать или скрыть кнопку для пользователя в зависимости от роли. Есть аннотации вроде:
@PreAuthorize("hasRole('ROLE_USER')")
Как сделать это в Java-коде? Что-то вроде :
if(somethingHere.hasRole("ROLE_MANAGER")) {
layout.addComponent(new Button("Edit users"));
}
java
spring-security
user-roles
Петр Гвязда
источник
источник
SecurityContextHolderAwareRequestWrapper
экземпляр. Вы можете улучшить его, объяснив, как его получить, и немного пояснив сам ответ.вы можете использовать метод isUserInRole объекта HttpServletRequest.
что-то вроде:
источник
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest()
получения запроса? :)Вместо использования цикла для поиска полномочий в UserDetails вы можете:
источник
Вы можете получить контекст безопасности, а затем использовать его:
источник
SecurityContextHolder.getContext()
никогда не бываетNULL
, проверьте документацию. Таким образом, вы можете избежать проверки наличия контекстаNULL
.Вы можете реализовать метод hasRole (), как показано ниже - (Он протестирован на Spring Security 3.0.x, не уверен в других версиях.)
источник
SecurityContextHolder.getContext().getAuthentication()
можно получитьnull
. Может чек добавить?Я использую это:
источник
Вам может помочь класс AuthorityUtils . Проверка роли как однострочного:
Предупреждение: это не проверяет иерархию ролей, если таковая существует.
источник
Ответ от JoseK нельзя использовать, когда вы находитесь на уровне обслуживания, когда вы не хотите вводить связь с веб-уровнем из ссылки на HTTP-запрос. Если вы хотите решить роли, находясь на уровне обслуживания, ответ Гопи - правильный выбор.
Однако это немного затянуто. Доступ к властям можно получить прямо из аутентификации. Следовательно, если вы можете предположить, что у вас есть пользователь, вошедший в систему, это сделает следующее:
источник
В большинстве ответов отсутствуют некоторые моменты:
Весной роль и власть - это не одно и то же. Смотрите здесь для более подробной информации.
Имена ролей равны
rolePrefix
+authority
.Однако префикс роли по умолчанию
ROLE_
можно настроить. Смотрите здесь .Следовательно, при правильной проверке роли необходимо учитывать префикс роли, если он настроен.
К сожалению, настройка префикса роли в Spring немного взломана, во многих местах префикс по умолчанию
ROLE_
жестко запрограммирован, но в дополнение к этомуGrantedAuthorityDefaults
в контексте Spring проверяется компонент типа , и, если он существует, настраиваемый префикс роли есть уважаемый.Собрав всю эту информацию вместе, лучшая реализация средства проверки ролей будет примерно такой:
источник
Как ни странно, я не думаю, что существует стандартное решение этой проблемы, поскольку управление доступом Spring-security основано на выражениях , а не на java. вы можете проверить исходный код DefaultMethodSecurityExpressionHandler, чтобы узнать, можете ли вы повторно использовать то, что они там делают
источник
Лучше поздно, чем никогда, позволь мне вложить свои 2 цента.
В мире JSF в моем управляемом компоненте я сделал следующее:
Как упоминалось выше, я понимаю, что это можно сделать долгим путем:
источник
Это своего рода вопрос с другого конца, но я подумал, что добавлю его, поскольку мне действительно пришлось покопаться в Интернете, чтобы узнать это.
Есть много вещей о том, как проверять роли, но не так много говорится о том, что вы на самом деле проверяете, когда вы говорите hasRole ("бла")
HasRole проверяет предоставленные полномочия для аутентифицированного в данный момент принципала
Итак, когда вы видите hasRole («бла»), на самом деле означает hasAuthority («бла») .
В случае, который я видел, вы делаете это с помощью класса, который реализует UserDetails, который определяет метод, называемый getAuthorities. Здесь вы в основном добавляете некоторые из них
new SimpleGrantedAuthority("some name")
в список на основе некоторой логики. Имена в этом списке - это то, что проверяется операторами hasRole.Я предполагаю, что в этом контексте объект UserDetails является в настоящее время аутентифицированным участником. Есть некоторая магия, которая происходит внутри и вокруг провайдеров аутентификации и, в частности, диспетчера аутентификации, который делает это.
источник
hasRole("bla")
теперь равноhasAuthority("ROLE_bla")
.Ответ @gouki лучше всего!
Просто подсказка о том, как весна на самом деле это делает.
Существует класс с именем,
SecurityContextHolderAwareRequestWrapper
который реализует этотServletRequestWrapper
класс.В
SecurityContextHolderAwareRequestWrapper
переопределяет тоisUserInRole
и поиск пользователяAuthentication
(который управляется Spring) , чтобы найти , если пользователь имеет роль или нет.SecurityContextHolderAwareRequestWrapper
код такой:источник
Эти две аннотации ниже равны: hasRole автоматически добавит префикс «ROLE_». Убедитесь, что у вас есть правильная аннотация. Эта роль устанавливается в UserDetailsService # loadUserByUsername.
тогда вы можете получить роль в java-коде.
источник
В нашем проекте мы используем иерархию ролей, в то время как большинство приведенных выше ответов нацелены только на проверку конкретной роли, то есть проверяют только данную роль, но не эту роль и иерархию.
Решение для этого:
RoleHierarchy определяется как bean-компонент в spring -security.xml.
источник
В вашей пользовательской модели просто добавьте метод hasRole, как показано ниже.
Я обычно использую его, чтобы проверить, имеет ли аутентифицированный пользователь роль администратора следующим образом
источник
Роли пользователей можно проверить следующими способами:
Использование статических методов вызова в SecurityContextHolder:
Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.getAuthorities().stream().anyMatch(role -> role.getAuthority().equals("ROLE_NAME"))) { //do something}
Использование HttpServletRequest
источник
Мой подход с помощью Java8, передача разделенных комой ролей даст вам истинное или ложное значение.
источник