Декларативная безопасность Java EE, Невозможно загрузить группу для пользователя области JDBC

Это мой первый пост здесь. У меня было бы два вопроса относительно декларативной безопасности Java EE:(1 )аутентификации на основе файлов -и аутентификации на основе (2 )DB -. Я приложил соответствующие части конфигурации для обоих вопросов. Я запускаю код на Glassfish 3.1.1. Спасибо за вашу помощь также заранее.

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

-Аутентификация на основе файла -работает правильно, если установлен флажок «сопоставление принципала по умолчанию с ролью», в противном случае она не работала, даже если в сопоставление был добавлен субъект. Возможно, я что-то не так настроил.

-Аутентификация на основе DB -. Это не сработало в отношении авторизации, потому что имена групп не могли быть прочитаны. Подробнее см. ниже.Аутентификация работает нормально, т.е. пользователь распознается. Я даже пытался переименовать таблицы, чтобы избежать потенциального конфликта имен с некоторыми внутренними вещами Glassfish...

(1 )Аутентификация на основе файлов: Область файлов, 2 пользователя :пользователь, администратор добавлен и назначен группы :пользователь и администратор (конфигурации/сервер -конфигурация/безопасность/сферы/файл -> Управление пользователями)

конфигурации/сервер -конфигурация/безопасность Сопоставление принципала по умолчанию с галочкой -> это работает Сопоставление принципала с ролью по умолчанию «не отмечено» -> оно не работает, даже если добавлено в сопоставление безопасности.

web.xml

[...]
    
        Admin Pages
        
            Protected Admin Area
            
            /faces/admin/*
            GET
            POST
            HEAD
            PUT
            OPTIONS
            TRACE
            DELETE
        
        
            
            admin
        
    
    
        User Pages
        
            Protected Users Area
            
            /faces/users/*
            GET
            POST
            HEAD
            PUT
            OPTIONS
            TRACE
            DELETE
        
        
            
            user
        
    
      
        FORM
        file
        
            /faces/loginForm.xhtml
            /faces/loginError.xhtml
        
    

[...]

glassfish-web.xml:


    
        admin
        admin
    
    
        user
        user
      

Зарегистрированные ошибки без сопоставления участника по умолчанию:

  1. Нет участников, сопоставленных с ролью [пользователь].
  2. Нет принципалов, сопоставленных с ролью [admin].

Log without the default principal mapping:
    
        admin
        admin
        admin
    
    
        user
        user
        user
     

Зарегистрированные ошибки без основного сопоставления по умолчанию :1. Нет участников, сопоставленных с ролью [пользователь]. 2. Нет принципалов, сопоставленных с ролью [admin].


(2 )Аутентификация на основе БД -:

Область изменила указанную выше область на jdbcRealm в файле web.xml

  • 1 )m -n (многие -на -много взаимосвязей между пользователями и таблицами групп)

    SEC1111, Невозможно загрузить группу для пользователя области JDBC [tamas].

  • 2 )то же самое для 1 -n (один -по -множество взаимосвязей между пользователями и таблицами групп)

    SEC1111, Невозможно загрузить группу для пользователя области JDBC [tamas].

  • 3 )имя группы в той же таблице, что и имя пользователя и пароль

    SEC1111, Не удается загрузить группу для пользователя области JDBC [tamas].

Конфигурация области: (Я также пытался оставить поле «Назначить группы» пустым или указать «по умолчанию», но результат был тот же.)

Image had to be omitted, summary:
JAAS context: jdbcRealm
JNDI: jdbc/securityDataSource
User Table: TBLUSERS
User Name Column: USERNAME
Password Column: PASSWORD
Group Table: TBLGROUPS
Group Name Column: GROUPNAME
Assign Groups: default
Digest Algorithm: none 

DB ER Диаграмма для отношения m -n:

Изображение должно быть опущено, но в качестве компенсации :-)вы найдете SQL-скрипт ниже.

SQL Script:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `jdbcrealm` ;
USE `jdbcrealm` ;

-- -----------------------------------------------------
-- Table `jdbcrealm`.`TBLUSERS`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `jdbcrealm`.`TBLUSERS` ;
CREATE  TABLE IF NOT EXISTS `jdbcrealm`.`TBLUSERS` (
  `USERID` INT NOT NULL AUTO_INCREMENT,
  `USERNAME` VARCHAR(30) NOT NULL,
  `PASSWORD` VARCHAR(45) NOT NULL,
  UNIQUE INDEX `USERNAME_UNIQUE` (`USERNAME` ASC),
  PRIMARY KEY (`USERID`) )

ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `jdbcrealm`.`TBLGROUPS`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `jdbcrealm`.`TBLGROUPS` ;
CREATE  TABLE IF NOT EXISTS `jdbcrealm`.`TBLGROUPS` (
  `GROUPID` INT NOT NULL AUTO_INCREMENT,
  `GROUPNAME` VARCHAR(30) NOT NULL,
  PRIMARY KEY (`GROUPID`) )

ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `jdbcrealm`.`USERS_GROUPS`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `jdbcrealm`.`USERS_GROUPS` ;
CREATE  TABLE IF NOT EXISTS `jdbcrealm`.`USERS_GROUPS` (
  `USER_USERID` INT NOT NULL,
  `GROUP_GROUPID` INT NOT NULL,
  PRIMARY KEY (`USER_USERID`, `GROUP_GROUPID`),

  INDEX `fk_USER_has_GROUP_GROUP1` (`GROUP_GROUPID` ASC),
  INDEX `fk_USER_has_GROUP_USER` (`USER_USERID` ASC),
  CONSTRAINT `fk_USER_has_GROUP_USER`
    FOREIGN KEY (`USER_USERID` )
    REFERENCES `jdbcrealm`.`TBLUSERS` (`USERID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_USER_has_GROUP_GROUP1`
    FOREIGN KEY (`GROUP_GROUPID` )
    REFERENCES `jdbcrealm`.`TBLGROUPS` (`GROUPID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

ENGINE = InnoDB;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Копирую сюда несколько интересных, погуглинных ссылок по теме, которые мне пригодились. Изначально я следовал второму.Возможно, другие люди также найдут их полезными.

Спасибо, что дочитали. С наилучшими пожеланиями,

Тамас



Часть 2 Спасибо за ответы. Я создал 2 новых пользователя и группу таблиц с одним отношением от -до -. На странице конфигурации области я устанавливаю имена таблиц и столбцы для имени пользователя, pwd и групп. Комментарий Мэтта также соответствует ссылке (, см. ниже. Я не могу опубликовать его здесь )

.

[...] Интересная часть здесь заключается в том, что для пользовательской таблицы и групповой таблицы я использовал v _роль пользователя _в качестве значения свойства. v _роль пользователя _— база данных представление, содержащее как информацию о пользователе, так и группу. Причина, по которой я не использовал таблицу пользователей напрямую, потому что стеклянная рыба предполагает, что и пользовательская, и групповая таблица содержат столбец, содержащий имя пользователя, и это приведет к дублированию данных. [...]

-- -----------------------------------------------------
-- Table `jdbcrealm`.`user`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `jdbcrealm`.`user` ;
CREATE  TABLE IF NOT EXISTS `jdbcrealm`.`user` (
  `userid` VARCHAR(30) NOT NULL,
  `password` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`userid`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `jdbcrealm`.`group`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `jdbcrealm`.`group` ;
CREATE  TABLE IF NOT EXISTS `jdbcrealm`.`group` (
  `groupid` VARCHAR(30) NOT NULL,
  `userid` VARCHAR(30) NOT NULL,
  INDEX `fk_group_user1` (`userid` ASC),
  CONSTRAINT `fk_group_user1`
    FOREIGN KEY (`userid` )
    REFERENCES `jdbcrealm`.`user` (`userid` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

Выскакивает та же ошибка. Я также попытался поместить первичный ключ в столбец groupid в таблице групп, но с точки зрения вопроса никаких изменений не произошло. Так же интересно, что я пытался сделать то же самое с 1 таблицей, в которой находятся юзернеймы, pwds, группы и выходит та же ошибка.



К решению и к решению

Комментарии Мэтта очень помогли, спасибо за этот замечательный пост. Таким образом, в начале, когда я писал вопрос, касающийся аутентификации на основе БД -, было ясно, что группы пользователей не могут быть загружены. На это указывало сообщение об ошибке в server.log.

Однако мои подозрения обратились к связям между таблицами и именами их столбцов. Тем не менее, упростив модель данных для групповых сущностей пользователя -, я не смог объяснить, почему она не работала даже с простой таблицей, содержащей пользователя, pwd и группу. Я продолжил расследование в этом направлении.Я предположил, что на это могут влиять и имена столбцов. Когда я применил конфигурацию Мэтта, сообщение «невозможно загрузить группы» исчезло из server.log, но явление осталось прежним. Поэтому я предположил, что группы уже могут быть загружены, но была и другая проблема. Затем я взял конфигурацию Мэтта и начал менять имена столбцов с шага -на шаг -, чтобы приблизиться к исходной конфигурации, но сообщение «невозможно загрузить группы» не появилось в журнале. Когда я воспроизвел случай с моими исходными настройками, а сообщения журнала не было, я знал, что что-то не так с ведением журнала, оно каким-то образом было отключено. Поэтому я начал исследовать всю конфигурацию.

Когда я взглянул на развернутое приложение, я выбрал дескрипторы развертывания и загрузил их через консоль Glassfish. С web.xml все в порядке, он имеет то же содержание, что и я, но Glassfish -web.xml имеет совершенно другое содержимое ! Он был сгенерирован так, как если бы у меня не было стеклянной рыбы -web.xml. Затем я заметил, что моя стеклянная рыба -web.xml не была помещена в каталог WEB -INF . Я переместил его туда и сделал "очистить все, построить" и развернул приложение. После этого я вернулся к представлению db, которое представляет данные между TBLUSERS и TBLGROUPS во многих отношениях -к -многим. Мне это решение нравится больше всего, так как оно показывает наиболее четкую картинку с точки зрения данных. Я установил соответствующие столбцы на странице конфигурации области. Я протестировал его с двумя пользователями «tamas» и «arpi». «tamas» был добавлен в группу пользователей и администраторов, а «arpi» был добавлен в группу пользователей. Сопоставление между ролями и группами пользователей находится в файле glassfish -web.xml. «Тамасу» был предоставлен доступ как к пользовательским, так и к административным ресурсам, в то время как «арпи» получил доступ только к пользовательским ресурсам.

Спасибо за помощь. Тамас

6
задан Arjan Tijms 3 March 2013 в 11:38
поделиться