Spring Security - как я могу попросить вызвать методы контроля доступа напрямую? - PullRequest
3 голосов
/ 16 ноября 2011

Существует много документации о том, как использовать теги jsp, aop, аннотации, контекст приложения и все подобные вещи ... но как я могу получить прямой доступ к методам контроля доступа? Какой класс мне нужно создать, если есть? Есть ли скрытый боб, о котором мне нужно знать? Не похоже, что SecurityContextHolder - это то, что нужно для поиска.

Я хотел бы сделать что-то вроде этого:

if(springSecurityObject.isAuthorized("hasAnyRole('DIRECTOR', 'ADMIN')")) {
    // ... do something
}

Или еще лучше:

if(springSecurityObject.hasAnyRole('DIRECTOR', 'ADMIN')) {
    // ... do something
}

Спасибо!

РЕДАКТИРОВАТЬ: Похоже, что сотрудники службы безопасности Spring используют предоставленные полномочия для самого объекта пользователя:

https://fisheye.springsource.org/browse/spring-security/taglibs/src/main/java/org/springframework/security/taglibs/authz/AbstractAuthorizeTag.java?r=fc399af136492c6c37cdddca6d44e5fe57f69680

Думаю, было бы полезно, если бы они абстрагировали тонну этого кода и вместо этого поместили его в хороший набор классов - то, что могли бы использовать как библиотеки тегов, так и реальные пользователи. В конце концов, они являются частными вспомогательными методами ... общий запах, что они, вероятно, должны существовать в некоторых классах.

Так как они выполняют сантехнику вручную, я должен предположить, что того, чего я хочу, не существует.

1 Ответ

2 голосов
/ 16 ноября 2011

Единственное, о чем я могу думать, это вызвать ваш UserDetailsService вручную, вызвать getAuthorities() для возвращенного Authentication и затем вызвать contains() или containsAll() для возвращенного набора.

Так что у вас будет что-то вроде:

final UserDetails jimmyDetails = myDetailsService.loadUserByUsername("Jimmy");
final Collection<GrantedAuthority> jimmyAuthorities = jimmyDetails.getAuthorities();

// make it a Collection<String> by iterating and calling .getAuthority()

plainAuthorities.contains("ROLE_YOU_NEED_TO_CHECK_FOR");

Написание собственных вспомогательных методов, которые делают это, не будет слишком сложным, хотя я согласен, что иметь их в API было бы неплохо.

...