2013-04-24 3 views
0

Я могу использовать ACL Spring Security с разрешениями на сущность, но я хотел бы знать, как проверить, имеет ли пользователь доступ к разрешению «создать» (бит 2) для класса.Spring Security ACL - создать разрешение

Что-то вроде:

aclPermissionEvaluator.hasPermission(auth, clazz, "create") 

Может кто-нибудь мне помочь?

Заранее спасибо

ответ

0

Вы можете использовать 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), поэтому, если вам не нужна определенная потребность в написании метода перегрузки, вы можете просто переопределить.

+0

Привет @cabbagery, спасибо за ответ, но он по-прежнему не ищет разрешения для определенного класса ... – Fiftoine

+0

Вы говорите о доступе на основе аннотаций на уровне классов, или вы говорите об объектах в ACL (таблица 'acl_class')? Кроме того, ознакомьтесь с [Учебник ACL Mark Serrano] (http://krams915.blogspot.com/2011/01/spring-security-3-full-acl-tutorial.html), если вы еще не просмотрели его. Я использовал несколько своих уроков в тандеме с другими ресурсами и некоторыми экспериментами, и нашел, что это очень полезно. – cabbagery

Смежные вопросы