Получение всех доступных разрешений spring security acl

Мне нужно внедрить элементы управления доступом в свое приложение, и я использую для него Spring ACL. В моей модели есть Пользователь, группы, разрешения.

Проблема, которую я пытаюсь решить, заключается в том, чтобы получить разрешения на объект домена для пользователя. Я смог получить все записи управления доступом для этого пользователя (основной sid и групповой sid), и с его помощью я смог получить окончательный набор разрешений, объединив все разрешения. Допустим, комбинированная маска равна 111, что означает разрешения на чтение, запись и создание в соответствии с разрешениями, определенными в BasePermissions.
Проблема, с которой я столкнулся сейчас, заключается в том, что я не могу найти способ получить список всех определенных базовых разрешений. чтобы я мог сравнить маску с отдельными разрешениями. Базовый класс разрешений, по-видимому, не предоставляет такого метода. Я не хочу жестко кодировать случаи в предложении if-then, так как количество разрешений может увеличиться в будущем.

Любые указатели будут оценены. Спасибо.


person Nishant Nagwani    schedule 22.10.2012    source источник


Ответы (3)


Вы можете проверить наличие разрешения с помощью AclPermissionEvaluator, передав массив экземпляров разрешений методу hasPermission в качестве параметра. Проверьте источник в данной ссылке для реализации.

@Autowired
private PermissionEvaluator permissionEvaluator ;

........

Object permission = new Permission[]{permissionFactory.buildFromName("READ"),permissionFactory.buildFromName("WRITE"), permissionFactory.buildFromName("CREATE")};

permissionEvaluator.hasPermission(authentication, oid, permission);

И, как упоминалось в этом answer не забудьте зарегистрировать AclPermissionEvaluator в вашем контексте spring.

ОБНОВЛЕНИЕ: чтобы получить все разрешения, которые пользователь имеет для объекта домена, --

private SidRetrievalStrategy sidRetrievalStrategy = new SidRetrievalStrategyImpl();

.......

List<Sid> sids = sidRetrievalStrategy.getSids(authentication);
// Lookup only ACLs for SIDs we're interested in
Acl acl = aclService.readAclById(oid, sids);
List<AccessControlEntry> aces = acl.getEntries();
List<String> permissionsList = new ArrayList<String>();
for (AccessControlEntry ace : aces ) {
    permissionsList.add(ace.getPermission().getPattern());
}
person Ravi Kadaboina    schedule 23.10.2012
comment
Проверка наличия у объекта определенных разрешений — не моя проблема. Я согласен, что эту проблему можно решить с помощью класса PermissionEvaluator. Моя проблема заключается в том, чтобы получить все разрешения на объект домена, которые есть у пользователя (по какой-то причине я хочу вернуть их обратно пользователю). Например, у пользователя могут быть разрешения R, W, C не удалять, поэтому должен быть возвращен список этих разрешений. Спасибо за помощь. - person Nishant Nagwani; 23.10.2012

Как сказал @Ravi: использование метода readAclById из класса JdbcAclService не будет работать, если вы используете BasicLookupStrategy.class. Потому что используйте LookupStrategy.readAclsById (второй параметр sids игнорируется). Я предлагаю вам написать свой собственный lookupstragey.

person wei lei    schedule 25.02.2016

То, что вы пытаетесь сделать, это проверить, имеет ли CumulativePermission определенное разрешение. Вы можете сделать это, используя этот метод:

public static boolean containsPermission(Permission cumulativePermission, Permission singlePermission) {
    return (cumulativePermission.getMask() & singlePermission.getMask()) == singlePermission.getMask();
}
person Community    schedule 03.05.2016