Как использовать поле маски в таблице acl_entry в Spring Security 3.1?

Я использую реализацию ACL Spring Security 3.1. Итак, на основе учебника я создал базу данных acl со следующими таблицами:

CREATE TABLE IF NOT EXISTS `acl_class` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `class` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_uk_2` (`class`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `acl_entry` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `acl_object_identity` bigint(20) NOT NULL,
  `ace_order` int(11) NOT NULL,
  `sid` bigint(20) NOT NULL,
  `mask` int(11) NOT NULL,
  `granting` tinyint(1) NOT NULL,
  `audit_success` tinyint(1) NOT NULL,
  `audit_failure` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_uk_4` (`acl_object_identity`,`ace_order`),
  KEY `foreign_fk_5` (`sid`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `acl_object_identity` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `object_id_class` bigint(20) NOT NULL,
  `object_id_identity` bigint(20) NOT NULL,
  `parent_object` bigint(20) DEFAULT NULL,
  `owner_sid` bigint(20) DEFAULT NULL,
  `entries_inheriting` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_uk_3` (`object_id_class`,`object_id_identity`),
  KEY `foreign_fk_1` (`parent_object`),
  KEY `foreign_fk_3` (`owner_sid`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `acl_sid` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `principal` tinyint(1) NOT NULL,
  `sid` varchar(100) NOT NULL,
  `password` varchar(255) NOT NULL,
  `salt` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

Это отлично работает с такими аннотациями:

@PreAuthorize("hasPermission(#element, 'WRITE')")
@PostAuthorize("hasPermission(returnObject, 'READ')")

Права «Чтение» и «Запись» установлены в таблице acl_entry для маски поля. Понятно 1 означает «ЧИТАТЬ», 2 означает «Запись», 4 означает «Создать», 8 означает «Удалить», а 16 означает «Администрирование», потому что это похоже на побитовый метод аутентификации.

  1. Вопрос: Правильно ли я понял предоставление прав?
  2. Вопрос: Как мне указать комбинированные права, такие как «Чтение / Запись»? Могу ли я «установить» бит 0 (это int 1) и 1 (который равен int 2), чтобы я получил значение маски 1 + 2 = 3?

Теперь мне нужно создать отдельные записи для разрешений «ЧТЕНИЕ» и «Запись», это не очень удобно.

6
задан Durin 26 January 2012 в 15:17
поделиться