Java EE的声明式安全性,无法加载组JDBC领域用户(Java EE declarative s

2019-06-24 05:40发布

这是我在这里的第一篇文章。 我会就两个问题于声明的Java EE安全性:(1)基于文件的验证和(2)基于数据库的认证。 我封闭这两个问题的配置的相关部分。 我运行在Glassfish 3.1.1的代码。 感谢您assitance也提前。

我也一直在寻找答案,我的问题,发现我也把在邮件底部一些有用的例子。 我试图按照他们如此配置的当前状态可以包含来自这些样品的细节,但他们并没有解决问题。

- 文件为基础的认证工作的很好,如果“默认主体到角色的映射”被勾选,否则即使校长被添加到映射没有奏效。 我可能已经配置了正确的方式没有的东西。

-DB的身份验证。 它没有就工作的授权是担心,因为该组的名称不能被读取。 详情请见下文。 认证工作的很好的,即用户的认可。 我甚至试图与重命名表,以避免潜在的名称冲突与Glassfish的内部的一些东西...

(1)基于文件的验证:文件领域,2个useres:用户,管理员添加且指派给所述组:用户和管理员(配置/服务器配置/安全/领域/文件- >管理用户)

配置/服务器配置/安全性的缺省主体到角色的映射“打勾” - >它的工作原理默认主体到角色的映射“未选中” - >即使被添加到安全映射这是行不通的。

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>

错误记录没有缺省主映射:

  1. 否映射到角色[用户]主体。
  2. 没有校长映射到角色[管理员]。

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> 

记录的错误没有缺省主映射:1映射到角色[用户]没有主体。 2.无校长映射到角色[管理员]。


(2)基于DB-认证:

境界改变上述境界jdbcRealm在web.xml

  • 1)MN(多到许多的用户和组表之间的关系)

    SEC1111,无法为JDBC领域用户[塔玛斯]负载组。

  • 2)相同的1-N(一个对多的用户和组表之间的关系)

    SEC1111,无法为JDBC领域用户[塔玛斯]负载组。

  • 3)在同一个表作为用户名和密码的组名

    SEC1111,无法为JDBC领域用户[塔玛斯]负载组。

域配置:(我也想离开“分配组”空白或“默认”来填补,但结果是一样的。)

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图的MN关系:

图像必须被省略,但作为补偿:-)你会发现下面的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;

我在这里复制,在其上帮助我的话题了一些有趣的,用Google搜索链接。 本来,我跟着第二个。 也许其他人也会发现它们非常有用。

  • http://docs.oracle.com/javaee/6/tutorial/doc/bnbxj.html
  • http://blog.eisele.net/2011/01/jdbc-security-realm-and-form-b​​ased.html
  • ...和一些我不得不省略,因为可能只包含在第一后两个环节。

谢谢您的阅读。 最好的祝愿,

塔马斯



第2部分感谢您的答复。 我创建了2代新表用户和组与一个一对多的关系。 在境界配置页面中我设置的用户名,PWD,和组的表名和列。 马特的评论也和链接线(见下文我不能在这里发布)

[...]这里有趣的是,对于用户表和组表我用v_user_role作为属性的值。 v_user_role是同时包含用户和组信息的数据库视图。 我没有使用的用户表中的直接原因是因为GlassFish的假设,无论是用户表和组表包含包含用户名的列这将导致重复数据。 [...]

-- -----------------------------------------------------
-- 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个表,其中用户名,残疾人士,集团位于和相同的错误出现。



向解决方案和解决方案

马特的意见帮助了很多,感谢这个伟大的职位。 总之,在我写的有关基于数据库的身份验证问题的开始,很明显,用户组无法加载。 这是通过在server.log错误消息中指明。

然而,我怀疑对表及其列名之间的联系转身。 然而,简化用户组的实体数据模型后,我无法解释为什么它不包含用户,PWD和组一个简单的表,甚至工作。 我继续在这个方向调查。 我认为也列名可以影响这一点。 当我申请马特配置中的“无法加载组”的消息从server.log中消失,但这种现象仍然是相同的。 因此,我假定组可能已经被加载,但也有不同的问题。 然后我把马特的配置,并开始改变的列名后面一步一步接近原来的配置,但“无法加载组”的消息没有出现在日志中。 当我和我的原始设置再现的情况下和日志信息是不存在的,我知道什么是错了,不知何故被关闭的日志记录。 于是我开始调查整个配置。

当我看看到部署的应用程序,我选择了部署描述符,并加载它们在GlassFish的控制台。 web.xml中没事儿它有我写的,但与GlassFish web.xml中有一个完全不同的内容相同的内容! 我好像没有GlassFish的-web.xml中有人产生。 然后我发现我的GlassFish-web.xml中没有放置在WEB-INF目录下 。 我有感动,并提出了“清除所有,打造”和部署应用程序。 后来我回到这代表了一个多一对多的关系向tblUsers和TBLGROUPS之间的数据的数据库视图。 我喜欢这个解决方案的最因为它显示了从视图中的数据点的清晰的图像。 我设置的境界配置页面上相应列。 我有两个用户“愚昧”和“ARPI”进行了测试。 “翳质”被添加到用户和管理员组同时“ARPI”被添加到用户组。 的角色和用户组之间的映射是在GlassFish-web.xml中。 访问给予了“愚昧”,以用户和管理资源,同时“ARPI”只获得了用户资源的访问。

感谢您的帮助。 塔马斯

Answer 1:

从第一眼我就发现你的表的列名。

从我自己的经验,我记忆,在用户表中的用户列需要具有完全相同的名称作为用户列USER_GROUPS表。 匹配通过列名来完成。

所以,你的USER_GROUPS表需要一列USERNAME从匹配用户名TBLUSERS表。

请注意,你必须改变这个表格的关系。

可能有其它原因一打,但你可以试试看。

这是我的本地配置:

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
)

在GF管理控制台进行如下设置:

这是我从sun-web.xml中(现在的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>

而且我已经定义在web.xml正下方的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>


文章来源: Java EE declarative security, Cannot load group for JDBC realm user