【问题标题】:Cannot load group for JDBC realm无法为 JDBC 领域加载组
【发布时间】:2011-11-03 11:25:27
【问题描述】:

我花了几天时间在 glassfish V3 中创建我的第一个安全领域。

我的问题是,由于某种原因,应用程序没有看到数据库中的其中一个列,并且我的控制台一直告诉我存在语法错误。我认为给我带来麻烦的表是连接列(下面你会看到我的数据库实现)。

在这里我将复制保持堆栈跟踪,以便您了解发生了什么:

FINE:[Web-Security] 设置策略上下文 ID:old = null ctxID = CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE:[Web-Security] hasUserDataPermission 权限: (javax.security.jacc.WebUserDataPermission GET) 很好:[网络安全] hasUserDataPermission isGranted: true FINE: SecurityContext: 调用 setCurrentSecurityContext 方法

FINE:[Web-Security] 策略上下文 ID 为: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE:[Web-Security] hasUserDataPermission 权限: (javax.security.jacc.WebUserDataPermission /j_security_check POST) FINE: [Web-Security] hasUserDataPermission isGranted: true FINE: 将用户 [administrator@gmail.com] 登录到领域:DBRealm 使用 JAAS 模块:jdbcRealm FINE:登录模块已初始化:类 com.sun.enterprise.security.auth.login.JDBCLoginModule

严重:SEC1111:无法为 JDBC 领域用户加载组 [管理员@gmail.com]。 FINE:无法加载组 java.sql.SQLSyntaxErrorException:列 'USER_GROUP' 要么不在 FROM 列表中的任何表或出现在连接规范中,并且 超出连接规范的范围或出现在 HAVING 中 子句并且不在 GROUP BY 列表中。如果这是 CREATE 或 ALTER TABLE 语句则 'USER_GROUP' 不是目标中的列 桌子。在 org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(未知 来源)在 org.apache.derby.client.am.SqlException.getSQLException(未知 来源)在 org.apache.derby.client.am.Connection.prepareStatement(未知来源) 在 com.sun.gjc.spi.base.ConnectionHolder.prepareStatement(ConnectionHolder.java:535) 在 com.sun.gjc.spi.jdbc40.ConnectionWrapper40.prepareCachedStatement(ConnectionWrapper40.java:251) 在 com.sun.gjc.spi.jdbc40.ConnectionWrapper40.prepareCachedStatement(ConnectionWrapper40.java:48) 在 com.sun.gjc.spi.ManagedConnection.prepareCachedStatement(ManagedConnection.java:880) 在 com.sun.gjc.spi.jdbc40.ConnectionWrapper40.prepareStatement(ConnectionWrapper40.java:169) 在 com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm.findGroups(JDBCRealm.java:478) 在 com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm.authenticate(JDBCRealm.java:312) 在 com.sun.enterprise.security.auth.login.JDBCLoginModule.authenticate(JDBCLoginModule.java:72) 在 com.sun.enterprise.security.auth.login.PasswordLoginModule.authenticateUser(PasswordLoginModule.java:90) 在 com.sun.appserv.security.AppservPasswordLoginModule.login(AppservPasswordLoginModule.java:141) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 javax.security.auth.login.LoginContext.invoke(LoginContext.java:769) 在 javax.security.auth.login.LoginContext.access$000(LoginContext.java:186) 在 javax.security.auth.login.LoginContext$4.run(LoginContext.java:683) 在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680) 在 javax.security.auth.login.LoginContext.login(LoginContext.java:579) 在 com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:341) 在 com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:199) 在 com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:152) 在 com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:479) 在 com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:418) 在 org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:264) 在 org.apache.catalina.authenticator.AuthenticatorBase.processSecurityCheck(AuthenticatorBase.java:1015) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:615) 在 com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) 在 com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 在 com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 在 com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 在 com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) 在 com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 在 com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 在 com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) 在 com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) 在 com.sun.grizzly.ContextTask.run(ContextTask.java:69) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) 在 java.lang.Thread.run(Thread.java:662) 引起: org.apache.derby.client.am.SqlException:列 'USER_GROUP' 是 不在 FROM 列表中的任何表中或出现在连接中 规范并且超出了连接规范的范围,或者 出现在 HAVING 子句中并且不在 GROUP BY 列表中。如果这是 CREATE 或 ALTER TABLE 语句,则 'USER_GROUP' 不是列 在目标表中。在 org.apache.derby.client.am.Statement.completeSqlca(Unknown Source) at org.apache.derby.client.net.NetStatementReply.parsePrepareError(未知 来源)在 org.apache.derby.client.net.NetStatementReply.parsePRPSQLSTTreply(未知 来源)在 org.apache.derby.client.net.NetStatementReply.readPrepareDescribeOutput(未知 来源)在 org.apache.derby.client.net.StatementReply.readPrepareDescribeOutput(未知 来源)在 org.apache.derby.client.net.NetStatement.readPrepareDescribeOutput_(未知 来源)在 org.apache.derby.client.am.Statement.readPrepareDescribeOutput(未知 来源)在 org.apache.derby.client.am.PreparedStatement.readPrepareDescribeInputOutput(未知 来源)在 org.apache.derby.client.am.PreparedStatement.flowPrepareDescribeInputOutput(未知 来源)在 org.apache.derby.client.am.PreparedStatement.prepare(未知来源) 在 org.apache.derby.client.am.Connection.prepareStatementX(未知 来源)... 50 更多

FINE:JAAS 登录完成。 FINE:已提交 JAAS 身份验证。美好的: 密码登录成功:administrator@gmail.com FINE: 已完成权限检查以设置 SecurityContext FINE:设置安全性 作为用户的上下文:administrator@gmail.com FINE:[Web-Security] Policy 上下文 ID 为: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE:[Web-Security] hasUserDataPermission 权限: (javax.security.jacc.WebUserDataPermission GET) 很好:[网络安全] hasUserDataPermission isGranted: true FINE: 权限检查完成 设置 SecurityContext 精细:SecurityContext:setCurrentSecurityContext 方法调用

再检查一次,在这里我将粘贴我的领域配置以及用于创建它的数据库和实体。

领域

数据库和实体

package entities;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="USERS", schema="ADMIN")
public class User implements Serializable {

    private static final long serialVersionUID = -1244856316278032177L;
    @Id 
    @Column(nullable = false)
    private String userid;  

    @Column(nullable = false)
    private String password;

    @ManyToOne
    @JoinTable(name="USER_GROUP",schema="ADMIN", joinColumns = @JoinColumn(name="userid", referencedColumnName="userid"), inverseJoinColumns=@JoinColumn(name="groupid", referencedColumnName= "groupid") )
    private Group group;

    public String getUserid() {
        return userid;
    }

    public void setUserid(String userid) {
        this.userid = userid;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Group getGroup() {
        return group;
    }

    public void setGroup(Group group) {
        this.group = group;
    }   
}

package entities;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {

    private static final long serialVersionUID = -7274308564659753174L;
    @Id
    @Column(nullable = false)
    private String groupid;

    @OneToMany(mappedBy="group")
    private Set<User> users;

    public String getGroupid() {
        return groupid;
    }
    public void setGroupid(String groupid) {
        this.groupid = groupid;
    }
    public Set<User> getUsers() {
        return users;
    }
    public void setUsers(Set<User> users) {
        this.users = users;
    }   
}

这是使用选项从实体生成表格时控制台显示的内容:

[EL Config]:持久类的访问类型[class entity.Group] 设置为 [FIELD]。 [EL Config]:目标实体 一对多映射元素 [field users] 的(参考)类是 默认为:类entities.User。 [EL Config]:访问类型 对于持久类 [class entity.User] 设置为 [FIELD]。 [EL Config]:多对一的目标实体(参考)类 映射元素 [字段组] 默认为:类 实体.组。 [EL Config]:实体类的别名 [class entity.Group] 默认为:Group。 [EL 配置]: 元素 [field groupid] 的列名默认为: 组ID。 [EL Config]:实体类的别名[class entity.User] 默认为:用户。 [EL 配置]:列 元素 [field userid] 的名称默认为:USERID。 [EL Config]:元素 [field password] 的列名正在 默认为:密码。 [EL 警告]:PersistenceUnitInfo 第 12 章 容器管理的身份验证和授权具有 transactionType RESOURCE_LOCAL,因此 jtaDataSource 将被忽略 [EL 信息]: EclipseLink,版本:Eclipse Persistence Services - 2.0.1.v20100213-r6600 [EL Fine]:检测到的供应商平台:org.eclipse.persistence.platform.database.JavaDBPlatform [EL 配置]: 连接(25292190)--连接(数据库登录( 平台=>JavaDBPlatform 用户名=>“用户”数据源 URL=> "jdbc:derby://localhost:1527/studydb;create=true")) [EL 配置]: 连接(18306082)--已连接: jdbc:derby://localhost:1527/studydb;create=true 用户:用户数据库: Apache Derby 版本:10.5.3.0 - (802917) 驱动程序:Apache Derby 网络客户端 JDBC 驱动程序版本:10.5.3.0 - (802917) [EL 配置]: 连接(9740137)--连接(数据库登录( 平台=>JavaDBPlatform 用户名=>“用户”数据源 URL=> "jdbc:derby://localhost:1527/studydb;create=true")) [EL 配置]: 连接(23965177)--已连接: jdbc:derby://localhost:1527/studydb;create=true 用户:用户数据库: Apache Derby 版本:10.5.3.0 - (802917) 驱动程序:Apache Derby 网络客户端 JDBC 驱动程序版本:10.5.3.0 - (802917) [EL 信息]: file:/C:/learningJSF/CHAPTER x 12 容器管理的身份验证和 授权/构建/类/_CHAPTER x 12 容器管理 身份验证和 Authorization_url=jdbc:derby://localhost:1527/studydb;create=true_user=user 登录成功 [EL Fine]: Connection(18306082)--ALTER TABLE ADMIN.USER_GROUP DROP CONSTRAINT USER_GROUP_groupid [EL Fine]: Connection(18306082)--ALTER TABLE ADMIN.USER_GROUP DROP CONSTRAINT USER_GROUP_userid [EL Fine]: Connection(18306082)--DROP TABLE ADMIN.USER_GROUP [EL Fine]: Connection(18306082)--CREATE TABLE ADMIN.USER_GROUP (userid VARCHAR(255) NOT NULL, groupid VARCHAR(255) NOT NULL, PRIMARY KEY (userid, groupid)) [EL Fine]: 连接(18306082)--DROP TABLE ADMIN.USERS [EL Fine]: Connection(18306082)--创建表 ADMIN.USERS (USERID VARCHAR(255) 非空,密码 VARCHAR(255)非空,主键(用户 ID))[EL 精细]:连接(18306082)--DROP TABLE ADMIN.GROUPS [EL 精细]: Connection(18306082)--创建表 ADMIN.GROUPS (GROUPID VARCHAR(255) 非空,主键(GROUPID))[EL 罚款]: 连接(18306082)--ALTER TABLE ADMIN.USER_GROUP 添加约束 USER_GROUP_groupid FOREIGN KEY (groupid) REFERENCES ADMIN.GROUPS (groupid) [EL Fine]: Connection(18306082)--ALTER TABLE ADMIN.USER_GROUP ADD CONSTRAINT USER_GROUP_userid FOREIGN KEY (userid) 参考 ADMIN.USERS(用户 ID)[EL 配置]: 连接(18306082)--断开 [EL 信息]: file:/C:/learningJSF/CHAPTER x 12 容器管理的身份验证和 授权/构建/类/_CHAPTER x 12 容器管理 身份验证和 Authorization_url=jdbc:derby://localhost:1527/studydb;create=true_user=user 注销成功 [EL Config]: Connection(25292190)--disconnect [EL 配置]:连接(23965177)--断开

这是我的其余配置,也许它也有帮助:

非常感谢您的帮助。

【问题讨论】:

  • 这是哪个版本的 Glassfish?从堆栈跟踪中,我可以看到这不是 v3.1.1。要查找版本 - 使用 asadmin start-domain domain1 启动 Glassfish(如果 domain1 是您的域),然后运行 ​​asadmin version
  • @Vineet Reynolds 版本是 3.0.1
  • 这乍一看还不错。您是否有机会捕获实际使用的 SQL 查询?例外情况基本上表明使用了SELECT USER_GROUP FROM ...,而它应该是SELECT ... FROM USER_GROUP
  • @BalusC 我使用 JPA 创建了表,因此要获取控制台消息,我应该删除并再次创建,然后复制粘贴控制台消息。我会这样做,还是有其他方法?
  • @BalusC 我不得不提到,当我使用 JPA 实体时,创建的表会转到 ADMIN 模式,但我注意到如果我尝试在 Scrpabook 上执行 SELECT * from USER_GROUP,则查询会失败。我认为 Eclipse 正在模式 USER 中寻找该表。我也有一个问题,因为同样的原因,我不能使用drop table groups

标签: java security jakarta-ee glassfish


【解决方案1】:

尝试在领域设置中键入 ADMIN.USERS 和 ADMIN.USER_GROUP。它会告诉 GlasshFish 架构,您的表存储在哪里。

【讨论】:

猜你喜欢
  • 2014-03-31
  • 2012-05-16
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 2013-03-21
  • 1970-01-01
相关资源
最近更新 更多