2011-11-03 88 views
2

我正在努力在glassfish V3中創建我的第一個安全領域。無法爲JDBC領域加載組

我的問題是,它看起來像是出於某種原因,應用程序沒有看到數據庫中的一個coulmns,並且我的控制檯一直告訴我存在語法錯誤。我認爲讓我煩惱的表是連接列(下面你會看到我的數據庫實現)。

在這裏,我將複製保持堆棧跟蹤,所以你會看到什麼是要去:

FINE:[網絡安全]設置策略上下文ID:舊=無效ctxID = CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE :[網絡安全] hasUserDataPermission燙髮: (javax.security.jacc.WebUserDataPermission GET)FINE:[網絡安全] hasUserDataPermission isGranted:真正的FINE:SecurityContext的: setCurrentSecurityContext方法稱爲

FINE:[網絡安全]策略上下文ID是: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE:[網絡安全] hasUserDataPermission燙髮: (javax.security.jacc.WebUserDataPermission/j_security_check POST) FINE:[網絡安全] hasUserDataPermission isGranted:真FINE: 記錄在用戶[[email protected]]到境界:使用 JAAS模塊DBRealm:jdbcRealm FINE:登錄模塊初始化:類 com.sun.enterprise.security.auth.login.JDBCLoginModule

SEVERE:SEC1111:無法爲JDBC實際加載組m用戶 [[email protected]]。 FINE:無法加載組 java.sql.SQLSyntaxErrorException:列'USER_GROUP'或者不在 FROM列表中的任何表中或出現在聯接規範中,並且 在聯接規範的範圍之外或出現在HAVING 子句中並不在GROUP BY列表中。如果這是CREATE或ALTER TABLE語句,則'USER_GROUP'不是目標 表中的列。在在 org.apache.derby.client org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(未知 源)在 org.apache.derby.client.am.SqlException.getSQLException(未知 源)。 am.Connection.prepareStatement在 com.sun.gjc.spi.base.ConnectionHolder.prepareStatement(ConnectionHolder.java:535)(未知源) 在 com.sun.gjc.spi.jdbc40.ConnectionWrapper40.prepareCachedStatement(ConnectionWrapper40 .java:251) at com.sun.gjc.spi.jdbc40.ConnectionWrapper40.prepareCachedStatement(ConnectionWrapper40.java:48) at com.sun.gjc.spi.ManagedConnection.prepareCachedStatement(Manag edConnection.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。驗證(JDBCLoginModule.java:72) at com.sun.enterprise.security.auth.login。PasswordLoginModule.authenticateUser(PasswordLoginModule.java:90) 處 sun.reflect com.sun.appserv.security.AppservPasswordLoginModule.login(AppservPasswordLoginModule.java:141) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)。 NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.lang.reflect.Method.invoke(Method.java:597)在 javax.security (LoginContext.java:769) at javax.security.auth.login.LoginContext.access $ 000 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.authent icate(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) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESess ionLockingStandardPipeline.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) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process( ProcessorTask.jav一: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) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly。SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69)at com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:662)引起: org.apache.derby.client .am.SqlException:'USER_GROUP'列或者是 不在FROM表中的任何表中,或者在連接 規範中出現,並且超出了連接規範的範圍,或者 出現在HAVING子句中,但不在GROUP BY中名單。如果這是 CREATE或ALTER TABLE語句,則'USER_GROUP'不是目標表中的列 。 at org.apache.derby.client.am.Statement.completeSqlca(Unknown Source)at org.apache.derby.client.net.NetStatementReply.parsePrepareError(Unknown Source)at 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身份驗證。 FINE: 密碼登錄成功爲:[email protected] FINE: 權限檢查設置SecurityContext FINE:設置安全性 上下文爲用戶:[email protected] FINE:[網絡安全]策略 上下文ID是: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE:[網絡安全] hasUserDataPermission燙髮: (javax.security.jacc.WebUserDataPermission GET)FINE:[網絡安全] hasUserDataPermission isGranted:真正的FINE:權限檢查做 集SecurityContext的FINE:SecurityContext的: setCurrentSecurityContext 方法稱爲

只需再次檢查一次,在這裏我將粘貼我的域配置以及數據庫和用於創建它的實體。

境界 enter image description here

數據庫和實體 enter image description here

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"), [email protected](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]:持久類[類 entities.Group]的訪問類型設置爲[FIELD]。 [EL配置]:一對多映射元素[字段用戶]的目標實體 (引用)類爲 默認爲:類entities.User。 [EL配置]:持久類[class entities.User]的訪問類型 設置爲[FIELD]。 [EL 配置]:多對一 映射元素[字段組]的目標實體(引用)類默認爲:類 entities.Group。 [EL Config]:實體類 [class entities.Group]的別名默認爲:Group。 [EL配置]:元素[字段組ID]的 列名默認爲: GROUPID。 [EL配置]:實體類[類 entities.User]的別名默認爲:用戶。 [EL Config]:元素[field userid]的名稱 默認爲:USERID。 [EL 配置]:元素[字段密碼]的列名稱爲 默認爲:PASSWORD。 [EL警告]:PersistenceUnitInfo容器管理的身份驗證和授權具有transactionType RESOURCE_LOCAL,因此jtaDataSource將被忽略[EL Info]: EclipseLink,版本:Eclipse持久性服務 - 2.0.1.v20100213-r6600 [EL Fine ]:檢測到的供應商平臺:org.eclipse.persistence.platform.database.JavaDBPlatform [EL配置]: 連接(25292190) - 連接(DatabaseLogin( platform => JavaDBPlatform user name =>「user」datasource URL => jdbc:derby:// localhost:1527/studydb; create = true「))[EL Config]: Connection :用戶數據庫: Apache Derby版本:10.5.3.0 - (802917)驅動程序:Apache Derby Network Client JDBC Driver版本:10.5.3.0 - (802917)[EL Config]: 連接(9740137) - 連接(DatabaseLogin( platform => JavaDBPlatform user name =>「user」datasource URL:> 「jdbc:derby:// localhost:1527/studydb; create = true」))[EL Config]: Connection(23965177) - Connected: jdbc:derby:// localhost:1527/studydb;創建= true用戶:用戶數據庫: Apache Derby版本:10.5.3.0 - (802917)驅動程序:Apache Derby 網絡客戶端JDBC驅動程序版本:10.5.3.0 - (802917)[EL信息]: file:/ C:/ learningJSF/CHAPTER x 12 Container Managed Authentication and Authorization/build/classes/_CHAPTER x 12 Container Managed Authentica Authorization_url = jdbc:derby:// localhost:1527/studydb; create = true_user = user 登錄成功[EL Fine]:連接(18306082) - 修改表 ADMIN.USER_GROUP DROP CONSTRAINT USER_GROUP_groupid [EL Fine]: 連接(18306082) - ALTER TABLE ADMIN。USER_GROUP DROP CONSTRAINT USER_GROUP_userid [EL Fine]:連接(18306082) - DROP TABLE ADMIN.USER_GROUP [EL Fine]:連接(18306082) - CREATE TABLE ADMIN.USER_GROUP(userid VARCHAR(255)NOT NULL,groupid VARCHAR (EL): 連接(18306082) - DROP TABLE ADMIN.USERS [EL Fine]: 連接(18306082) - CREATE TABLE ADMIN.USERS(())(255) NOT NULL,PRIMARY KEY(userid,groupid) USERID VARCHAR(255) 連接(EL): 連接(18306082) - 連接(18306082) - 連接(18306082) --CREATE TABLE ADMIN.GROUPS(GROUPID VARCHAR(255) NOT NULL,PRIMARY KEY(GROUPID))[EL Fine]: Conne ction(18306082) - ALTER TABLE ADMIN.USER_GROUP ADD CONSTRAINT USER_GROUP_groupid FOREIGN KEY(groupid)REFERENCES ADMIN.GROUPS (groupid)[EL Fine]:連接(18306082) - 修改表 ADMIN.USER_GROUP ADD CONSTRAINT USER_GROUP_userid FOREIGN KEY (用戶標識) 參考ADMIN.USERS(用戶標識符)[EL配置]: 連接(18306082) - 斷開連接[EL信息]: 文件:/ C:/ learningJSF/CHAPTER x 12 Container Managed Authentication and Authorization/build/class/_CHAPTER x 12 Container Managed Authentication and Authorization_url = jdbc:derby:// localhost:1527/studydb; create = true_user = user 註銷成功[EL Config]:連接(25292190) - 斷開連接[EL Config] :康涅狄格州撓度(23965177) - 斷開

這是我配置的休息,也許它也有幫助:

enter image description hereenter image description here 生病真的很感謝你的幫助。

+0

哪個版本的Glassfish是這個?從堆棧跟蹤中,我可以看到這不是v3.1.1。要查找版本 - 使用'asadmin start-domain domain1'啓動Glassfish(如果domain1是您的域),然後運行'asadmin version'。 –

+0

@Vineet Reynolds版本是3.0.1 – sfrj

+1

這看起來很好乍一看。你有沒有機會捕獲使用的實際SQL查詢?這個例外基本上是建議'SELECT USER_GROUP FROM ...'被使用,而它應該是'SELECT ... FROM USER_GROUP'。 – BalusC

回答

3

嘗試在領域設置中鍵入ADMIN.USERS和ADMIN.USER_GROUP。它會告訴GlasshFish模式,表格的存儲位置。

+0

我遇到從4.0遷移到4.1.1的問題http://stackoverflow.com/questions/40686737/migration-from-glassfish-4-0-to-glassfish-4-1-1-jdbc-realm-issue – Bikram