2012-05-07 9 views
6

Es mi primer mensaje aquí. Tendría dos preguntas con respecto a la seguridad declarativa de Java EE: (1) autenticación basada en archivos y (2) autenticación basada en DB. Adjunté las partes relevantes de la configuración para ambas preguntas. Ejecuto el código en Glassfish 3.1.1. Gracias por su asistencia también por adelantado.Seguridad declarativa Java EE, No se puede cargar el grupo para el usuario del dominio JDBC

También estaba buscando respuestas a mis preguntas y encontré algunos ejemplos útiles que coloqué también en la parte inferior del mensaje. Traté de seguirlos para que el estado actual de la configuración pueda contener detalles de estas muestras, pero no resolvieron el problema.

-La autenticación basada en archivos funciona bien si el "principal predeterminado para el mapeo de roles" está marcado, de lo contrario no funcionó, incluso si se agregó un principal a la asignación. Pude haber configurado algo no de la manera correcta.

-Autenticación basada en DB. No funcionó en lo que respecta a la autorización porque los nombres de los grupos no se podían leer. Vea los detalles abajo. La autenticación funciona bien, es decir, el usuario es reconocido. Incluso he intentado con el cambio de nombre de las tablas para evitar una posible colisión de nombre con un poco de materia interna de Glassfish ...

(1) la autenticación basada en archivos: ámbito Archivo, 2 useres: usuario, administrador y añadió asignado a la grupos: user y admin (configuraciones/server-config/security/reinos/archivo -> Administrar usuarios)

configuraciones/server-config/seguridad defecto Principal Para orientación de puesto "marcado" -> funciona Principal por defecto Para asignar roles "no marcado" -> no funciona, incluso si se agrega a la asignación de seguridad.

web.xml 

[...] 
    <security-constraint> 
     <display-name>Admin Pages</display-name> 
     <web-resource-collection> 
      <web-resource-name>Protected Admin Area</web-resource-name> 
      <description/> 
      <url-pattern>/faces/admin/*</url-pattern> 
      <http-method>GET</http-method> 
      <http-method>POST</http-method> 
      <http-method>HEAD</http-method> 
      <http-method>PUT</http-method> 
      <http-method>OPTIONS</http-method> 
      <http-method>TRACE</http-method> 
      <http-method>DELETE</http-method> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>admin</role-name> 
     </auth-constraint> 
    </security-constraint> 
    <security-constraint> 
     <display-name>User Pages</display-name> 
     <web-resource-collection> 
      <web-resource-name>Protected Users Area</web-resource-name> 
      <description/> 
      <url-pattern>/faces/users/*</url-pattern> 
      <http-method>GET</http-method> 
      <http-method>POST</http-method> 
      <http-method>HEAD</http-method> 
      <http-method>PUT</http-method> 
      <http-method>OPTIONS</http-method> 
      <http-method>TRACE</http-method> 
      <http-method>DELETE</http-method> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>user</role-name> 
     </auth-constraint> 
    </security-constraint> 
    <login-config> 
     <auth-method>FORM</auth-method> 
     <realm-name>file</realm-name> 
     <form-login-config> 
      <form-login-page>/faces/loginForm.xhtml</form-login-page> 
      <form-error-page>/faces/loginError.xhtml</form-error-page> 
     </form-login-config> 
    </login-config> 

[...] 

glassfish-web.xml: 

<glassfish-web-app> 
    <security-role-mapping> 
     <role-name>admin</role-name> 
     <group-name>admin</group-name> 
    </security-role-mapping> 
    <security-role-mapping> 
     <role-name>user</role-name> 
     <group-name>user</group-name> 
    </security-role-mapping> 
</glassfish-web-app> 

errores registrados sin el mapeo director defecto:

  1. No directores mapeadas a Role [usuario].
  2. No Principales asignados a Rol [admin].

Log without the default principal mapping: 
    <security-role-mapping> 
     <role-name>admin</role-name> 
     <group-name>admin</group-name> 
     <principal-name>admin</principal-name> 
    </security-role-mapping> 
    <security-role-mapping> 
     <role-name>user</role-name> 
     <group-name>user</group-name> 
     <principal-name>user</principal-name> 
    </security-role-mapping> 

errores registrados sin la asignación de capital por defecto: 1. No directores asignados a clases, [usuario]. 2. No Principals asignados a Rol [admin].


(2) la autenticación basada en DB:

Realm cambió el reino de arriba para jdbcRealm en el web.xml

  • 1) Mn (relación de muchos a muchos entre la tabla de usuarios y grupos)

    SEC1111, No se puede cargar el grupo para el usuario del dominio JDBC [tamas].

  • 2) mismo para 1-n (uno-a-muchos relación entre la tabla de usuarios y grupos)

    SEC1111, no se puede cargar el grupo para JDBC usuario reino [tamas].

  • 3) nombre de grupo en la misma mesa como nombre de usuario y contraseña

    SEC1111, no se puede cargar grupo para JDBC usuario reino [tamas].

configuración Realm: (. También probé a dejar "Grupos Assign" en blanco o rellenar "por defecto", pero el resultado fue el mismo) Diagrama ER

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 para la relación mn:

La imagen tuvo que ser omitida, pero como compensación :-) se encuentra la secuencia de comandos SQL a continuación.

SQL Script: 
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@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 [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

Copio aquí algunos enlaces interesantes, en Google sobre el tema que fueron útiles para mí. Originalmente, seguí el segundo. Quizás otras personas también los encuentren útiles.

Gracias por leer hasta ahora. Los mejores deseos,

Tamas



Parte 2 Gracias por las respuestas. Creé 2 nuevas tablas de usuario y grupo con una relación uno a muchos. En la página de configuración del reino, establecí los nombres de las tablas y las columnas para el nombre de usuario, pwd y grupos. El comentario de Matt también está en línea con el enlace (véase más adelante no puedo publicar aquí)

[...] parte interesante aquí es que para la tabla de usuario y la tabla de grupos utilicé v_user_role como el valor de la propiedad. v_user_role es una vista de base de datos que contiene información de usuario y de grupo. La razón por la que i no usó la tabla de usuarios directamente es porque glassfish asume que tanto la tabla de usuarios como la tabla de grupos contienen una columna que contiene el nombre de usuario y que daría como resultado datos duplicados. [...]

-- ----------------------------------------------------- 
-- 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; 

alza el mismo error. Intenté también de una manera en que puse una clave principal en la columna groupid en la tabla de grupo, pero no experimenté ningún cambio desde el punto de vista de la pregunta.También es interesante que intenté hacer lo mismo con 1 tabla en la que se encuentran los nombres de usuario, pwds, grupos y el mismo error.



Hacia la solución y la solución

Los comentarios de Matt ayudó mucho, gracias por este gran mensajes. En resumen, al comienzo cuando escribí la pregunta relacionada con la autenticación basada en DB, estaba claro que los grupos de usuarios no pueden cargarse. Esto fue indicado por el mensaje de error en server.log.

Sin embargo, mi sospecha se dirigió hacia los enlaces entre las tablas y sus nombres de columna. Sin embargo, después de simplificar el modelo de datos para entidades de grupos de usuarios, no pude explicar por qué no funcionó, incluso con una tabla simple que contiene usuario, pwd y grupo. Continué la investigación en esta dirección. Supuse que también los nombres de las columnas pueden influir en esto. Cuando apliqué la configuración de Matt, el mensaje "no puedo cargar grupos" desapareció del server.log, pero el fenómeno siguió siendo el mismo. Por lo tanto, asumí que los grupos ya podrían estar cargados, pero también había un problema diferente. Tomé entonces la configuración de Matt y comencé a cambiar los nombres de las columnas paso a paso para acercarme a la configuración original, pero el mensaje "no puedo cargar grupos" no apareció en el registro. Cuando reproduje el caso con mi configuración original y el mensaje de registro no estaba allí, sabía que algo estaba mal con el registro que de alguna manera se había apagado. Entonces comencé a investigar toda la configuración.

Cuando eché un vistazo a la aplicación implementada, seleccioné los descriptores de implementación y los cargué sobre la consola glassfish. web.xml estaba bien, tenía el mismo contenido que escribí pero glassfish-web.xml tenía un contenido completamente diferente! Fue generado como si no hubiera tenido glassfish-web.xml. Entonces noté que mi glassfish-web.xml no se colocó en el directorio WEB-INF. Lo moví allí e hice un "clean all, build" y desplegué la aplicación. Después volví a la vista db que representa los datos entre TBLUSERS y TBLGROUPS en una relación muchos a muchos. Me gusta más esta solución ya que muestra la imagen más clara desde el punto de vista de los datos. Establecí las columnas apropiadas en la página de configuración del reino. Lo probé con dos usuarios "tamas" y "arpi". "Tamas" se agregó al usuario y grupos de administradores mientras tanto "arpi" se agregó al grupo de usuarios. El mapeo entre los roles y los grupos de usuarios se encuentra en glassfish-web.xml. Se otorgó acceso a "tamas" a los recursos de usuario y administrador, mientras que "arpi" recibió acceso solo a los recursos del usuario.

Gracias por la ayuda. Tamas

Respuesta

7

Desde el primer vistazo, me percataría de los nombres de las columnas de la tabla.

Según mi propia experiencia, memoricé que la columna del usuario en la tabla del usuario debe tener exactamente el mismo nombre que la columna del usuario en la tabla USER_GROUPS. La coincidencia se realiza por nombres de columna.

Por lo tanto, su tabla USER_GROUPS necesita una columna USERNAME que coincida con los nombres de usuario de la tabla TBLUSERS.

Tenga en cuenta que debe cambiar las relaciones de la tabla para esto.

Puede haber una docena de otras razones, pero puede intentarlo.

Esta es mi configuración local:

CREATE TABLE `user` (
    `LOGIN` varchar(32) NOT NULL, 
    `password` varchar(256) DEFAULT NULL, 
    PRIMARY KEY (`LOGIN`) 
) 

CREATE TABLE `group` (
    `IDGROUP` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`IDGROUP`) 
) 

CREATE TABLE `group_has_user` (
    `IDGROUP` int(11) NOT NULL, 
    `LOGIN` varchar(32) NOT NULL, 
    PRIMARY KEY (`IDGROUP`,`LOGIN`), 
    KEY `fk_group_has_user_user1` (`LOGIN`), 
    CONSTRAINT `fk_group_has_user_user1` FOREIGN KEY (`LOGIN`) 
    REFERENCES `user` (`LOGIN`) 
    ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `fk_group_has_user_group1` FOREIGN KEY (`IDGROUP`) 
    REFERENCES `group` (`IDGROUP`) 
    ON DELETE NO ACTION ON UPDATE NO ACTION 
) 

con la siguiente configuración en la consola de administración de GF:

enter image description here

Aquí es mi asignación de seguridad en funciones desde sun-web.xml (ahora glassfish-web.xml):

<security-role-mapping> 
    <role-name>user</role-name> 
    <group-name>1</group-name> 
    </security-role-mapping> 
    <security-role-mapping> 
    <role-name>sponsor</role-name> 
    <group-name>2</group-name> 
    </security-role-mapping> 
    <security-role-mapping> 
    <role-name>admin</role-name> 
    <group-name>3</group-name> 
</security-role-mapping> 

Y he definido las siguientes funciones de seguridad-en web.xml directamente debajo de login-config:

<security-role> 
    <description/> 
    <role-name>user</role-name> 
</security-role> 
<security-role> 
    <description/> 
    <role-name>sponsor</role-name> 
</security-role> 
<security-role> 
    <description/> 
    <role-name>admin</role-name> 
</security-role> 
+0

Hola Matt, gracias por su respuesta. Cambié las relaciones de la tabla a uno-a-muchos y agregué la misma columna de nombre de usuario a ambas tablas. Desafortunadamente, produce el mismo error. En realidad, también lo intenté con una sola tabla ... – Tamas

+0

Hola Matt, gracias por tu respuesta. Cambié las relaciones de la tabla a uno-a-muchos y agregué la misma columna de nombre de usuario a ambas tablas. Desafortunadamente, produce el mismo error. En realidad, también lo intenté con una sola tabla ... Encontré un enlace muy bueno: http://jugojava.blogspot.com/2011/02/jdbc-security-realm-with-glassfish-and.html which Apoya tu idea, también. También seguí la descripción en este enlace y creé una vista en las tablas originales pero me quedé atrapado en el mismo lugar: no puedo cargar el grupo ... Muchas gracias de nuevo por su respuesta, Tamas – Tamas

+0

¿Podría actualizar la configuración de la tabla? en tu pregunta? Entonces puedo compararlo con mi propia solución (de trabajo). –

Cuestiones relacionadas