Jakarta ee Java EE声明性安全性,无法为JDBC领域用户加载组

Jakarta ee Java EE声明性安全性,无法为JDBC领域用户加载组,jakarta-ee,jdbcrealm,declarative-security,Jakarta Ee,Jdbcrealm,Declarative Security,这是我在这里的第一篇文章。关于声明式JavaEE安全性,我有两个问题:(1)基于文件的身份验证和(2)基于数据库的身份验证。我附上了这两个问题的配置的相关部分。我在Glassfish 3.1.1上运行代码。也提前感谢您的协助 我也在寻找我的问题的答案,并找到了一些有用的例子,我也把它们放在了信息的底部。我试图遵循它们,以便配置的当前状态可以包含来自这些示例的详细信息,但它们没有解决问题 -如果勾选了“默认主体到角色映射”,则基于文件的身份验证可以正常工作,否则即使将主体添加到映射中,它也无法工作

这是我在这里的第一篇文章。关于声明式JavaEE安全性,我有两个问题:(1)基于文件的身份验证和(2)基于数据库的身份验证。我附上了这两个问题的配置的相关部分。我在Glassfish 3.1.1上运行代码。也提前感谢您的协助

我也在寻找我的问题的答案,并找到了一些有用的例子,我也把它们放在了信息的底部。我试图遵循它们,以便配置的当前状态可以包含来自这些示例的详细信息,但它们没有解决问题

-如果勾选了“默认主体到角色映射”,则基于文件的身份验证可以正常工作,否则即使将主体添加到映射中,它也无法工作。我可能以不正确的方式配置了某些内容

-基于数据库的身份验证。就授权而言,它不起作用,因为无法读取组名。详情见下文。身份验证工作正常,即用户被识别。我甚至尝试过重命名表,以避免与Glassfish的一些内部内容发生潜在的名称冲突

(1)基于文件的身份验证: 文件领域,2个用户:用户,管理员添加并分配给组:用户和管理员 (配置/服务器配置/安全性/领域/文件->管理用户)

配置/服务器配置/安全性 默认主体到角色的映射“勾选”->有效 默认主体到角色的映射“未勾选”->即使将添加到安全映射中,它也不起作用

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>

[...]
m-n关系的DB ER图:

必须省略图像,但作为补偿:-)您可以在下面找到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个新的表user和group。在realmconfig页面上,我设置了用户名、pwd和组的表名和列。马特的评论也与链接一致(见下文,我无法在此发布)

[……] 这里有趣的部分是我使用的用户表和组表 v_user_角色作为属性的值。用户角色是一个数据库 同时包含用户和组信息的视图。我 没有直接使用users表是因为glassfish假设 用户表和组表都包含一列,其中包含 用户名和密码将导致重复数据。 [……]

同样的错误也出现了。我还尝试在group表中的groupid列上放置一个主键,但从问题的角度来看,我没有遇到任何变化。同样有趣的是,我尝试对1个表执行相同的操作,其中包含用户名、PWD和组,并且出现了相同的错误



解决方案和解决方案

马特的评论帮了大忙,谢谢你的精彩帖子。总之,在我开始写关于基于DB的身份验证的问题时,很明显无法加载用户组。这由server.log中的错误消息指示

然而,我的怀疑转向了表和它们的列名之间的链接。然而,在简化了用户组实体的数据模型之后,我无法解释为什么它即使在包含user、pwd和group的简单表中也不起作用。我继续朝这个方向进行调查。我认为列名也会影响这一点。当我应用Matt的配置时,server.log中的“cannotloadgroups”消息消失了,但现象仍然是一样的。因此,我假设组已经可以加载,但也存在另一个问题。然后我使用Matt的配置,开始一步一步地更改列名,以接近原始配置,但“无法加载组”消息没有出现在日志中。当我用我的原始设置复制了这个案例,但日志消息不在那里时,我知道日志记录有问题,它不知何故被关闭了。所以我开始调查整个配置

当我查看部署的应用程序时,我选择了部署描述符并通过glassfish控制台加载它们。web.xml没问题,它的内容与我写的相同,但glassfish-web.xml的内容完全不同!它的生成就像我没有glassfish-web.xml一样。然后我注意到我的glassfish-web.xml没有放在web-INF目录中。我把它移到了那里,做了一个“全部清理,构建”并部署了应用程序。之后,我回到db视图,它以多对多关系表示TBluser和TBLGROUPS之间的数据。我最喜欢这个解决方案,因为它从数据的角度显示了最清晰的画面。我在领域配置页面上设置了相应的列。我用两个用户“tamas”和“arpi”测试了它。“tamas”被添加到用户组和管理员组,同时“arpi”被添加到用户组。角色和用户组之间的映射在glassfish-web.xml中。“tamas”既可以访问用户资源,也可以访问管理员资源,而“arpi”只能访问用户资源


谢谢你的帮助。塔马斯

我第一眼看到你的表列名

根据我自己的经验,我记得user表中的user列需要与
user\u GROUPS
表中的user列具有完全相同的名称。通过列名进行匹配。
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> 
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 
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;
-- -----------------------------------------------------
-- 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;
<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>
<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>