Это мой первый пост здесь. У меня было бы два вопроса относительно декларативной безопасности 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
Зарегистрированные ошибки без сопоставления участника по умолчанию:
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. «Тамасу» был предоставлен доступ как к пользовательским, так и к административным ресурсам, в то время как «арпи» получил доступ только к пользовательским ресурсам.
Спасибо за помощь. Тамас