Grails ACL с пользовательскими разрешениями - PullRequest
4 голосов
/ 14 февраля 2012

Плагин Spring Security ACL для Grails по умолчанию использует класс BasePermission с 4 основными разрешениями. И использует DefaultFactory для назначения этих разрешений. И AclPermissionEvaluator, где назначен этот DefaultFactory.

При использовании этого подхода все в порядке. Я могу использовать

    @PreAuthorize("hasPermission(#report, read)")

Здесь я предоставил одно из основных разрешений, называемое READ, которое определено в классе BasePermission.

Мне нужны мои собственные права доступа. Я сделал:

     public class MyPermission extends AbstractPermission{

        public static final Permission APPROVE= new MyPermission(1 << 0, 'a');

        //constructors here..  
     }

1) Как правильно назначить мое пользовательское разрешение на его использование, как я использовал разрешения от BasePermission? 2) Должен ли я определить свой CustomFactory или можно ли использовать DefaultFactory? 3) Если да, как установить его для существующего оценщика разрешений?

Также еще один открытый вопрос. Я играл с подклассом BasePermission, но в этом случае я должен использовать

    @PreAuthorize("hasPermission(#report, 'approve')")

вместо

    @PreAuthorize("hasPermission(#report, approve)")

4) Почему в случае отсутствия одинарных кавычек я получил ошибку?

     Class:org.springframework.expression.spel.SpelEvaluationException
     Message:EL1008E:(pos 28): Field or property 'approve' cannot be found on object of type 'org.springframework.security.access.expression.method.MethodSecurityExpressionRoot'

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

1 Ответ

3 голосов
/ 15 февраля 2012

Вам лучше расширять org.springframework.security.acls.domain.BasePermission, так как таким образом у вас есть все стандартные разрешения плюс ваши:

package com.mycompany.myapp.MyPermission;

public class MyPermission extends BasePermission {

   public static final Permission APPROVE = new MyPermission(1 << 5, 'V'); // 32

   protected MyPermission(int mask) {
      super(mask);
   }

   protected MyPermission(int mask, char code) {
      super(mask, code);
   }
}

Вам необходимо зарегистрировать его на фабрике разрешений, чтобы сделать его доступным в выражениях; переопределить bean-компонент aclPermissionFactory в grails-app/conf/spring/resources.groovy, передавая ваш класс в качестве аргумента конструктора:

import org.springframework.security.acls.domain.DefaultPermissionFactory
import com.mycompany.myapp.MyPermission

beans = {
   aclPermissionFactory(DefaultPermissionFactory, MyPermission)
}

Причина, по которой он работает без кавычек со стандартными разрешениями, заключается в том, что MethodSecurityExpressionRoot имеет константы для стандартных разрешений:

public final String read = "read";
public final String write = "write";
public final String create = "create";
public final String delete = "delete";
public final String admin = "administration";

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

...