Вы можете использовать SPEL аннотаций Spring, в например, @PreAuthorize
и переопределить метод hasPermission
интерфейса PermissionEvaluator
. Если вы используете побитовые маски разрешений, а разрешения пользователя (как int
) оцениваются в «15» (1111
), а требуемые разрешения для объекта - «6» (0110
), вы можете сделать что-то вроде следующего:
public boolean hasPermission(Authentication auth, Object targetObject, Object requiredPermissions) {
int permissionMask = MyUserClass.getMask();
int permissionsRequired = Integer.valueOf(requiredPermissions.toString());
return ((permissionMask | requiredPermissions) == permissionMask);
}
Это вернет true, если бит, активный в маске разрешений объекта, активен в разрешениях пользователя. Затем, вы должны были бы объявить это пользовательское разрешение оценщик в файле security.xml
:
<security:global-method-security pre-post-annotations="enabled">
<security:expression-handler ref="expressionHandler"/>
</security:global-method-security>
<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
<property name="permissionEvaluator" ref="permissionEvaluator"/>
</bean>
<bean id="permissionEvaluator" class="my.project.package.CustomPermissionEvaluator"/>
Теперь, когда вы звоните hasPermission()
, ваш заказ оценщик обработать запрос. Очевидно, что вы можете использовать любую логику, которая вам нравится оценивать разрешения - просто убедитесь, что тип возвращаемого значения - boolean
, а передаваемые параметры соответствуют тому, что вы отправляете (или оцениваете, будьте осторожны с исключениями формата).
Обратите внимание, что ваш настраиваемый параметр должен быть передан как Object
для переопределения hasPermission()
; вы также можете перегрузить метод, изменив подпись, чтобы обрабатывать любой тип параметра, который вы предпочитаете (например, String или int), а компилятор должен выбрать наиболее определенную подпись. Однако, поскольку вы реализуете интерфейс PermissionEvaluator, вам все равно придется включать данную подпись (Authentication, Object, Object), поэтому, если вам не нужна определенная потребность в написании метода перегрузки, вы можете просто переопределить.
Привет @cabbagery, спасибо за ответ, но он по-прежнему не ищет разрешения для определенного класса ... – Fiftoine
Вы говорите о доступе на основе аннотаций на уровне классов, или вы говорите об объектах в ACL (таблица 'acl_class')? Кроме того, ознакомьтесь с [Учебник ACL Mark Serrano] (http://krams915.blogspot.com/2011/01/spring-security-3-full-acl-tutorial.html), если вы еще не просмотрели его. Я использовал несколько своих уроков в тандеме с другими ресурсами и некоторыми экспериментами, и нашел, что это очень полезно. – cabbagery