2013-10-19 23 views
0

在Glassfish中使用JDBCRealm作爲身份驗證方式時,由於沒有爲用戶加載組/角色,因此無法登錄用戶。這通常只會在您的應用程序中出現403 Not Authorized消息。
JDBC領域不爲用戶加載任何組[403 Forbidden]

啓用對core.security FINEST記錄顯示以下內容:


FINE: Login module initialized: class com.sun.enterprise.security.auth.login.JDBCLoginModule FINEST: JDBC login succeeded for: [email protected] groups:[] FINE: JAAS login complete.
正如你所看到的,組是空的。

表:

CREATE TABLE users (
    ID int(11) NOT NULL, 
    EMAIL varchar(255) NOT NULL, 
    PASSWORD longtext NOT NULL, 
    SALT longtext NOT NULL, 
    ... 
    PRIMARY KEY (ID), 
    UNIQUE KEY EMAIL (EMAIL), 
    ... 
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ 


CREATE TABLE `users_groups` (
    `ID` int(11) NOT NULL, 
    `groupname` varchar(255) NOT NULL, 
    KEY `FK_USERS_GROUPS_ID` (`ID`), 
    CONSTRAINT `FK_USERS_GROUPS_ID` FOREIGN KEY (`ID`) REFERENCES `users` (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ 


Glassfish的境界:
Glassfish realm


回答

0

這是由於JDBCRealm在users_groups表中尋找與id ='[email protected]'匹配的組時造成的,實際上它應該在users_groups表中尋找與id = 1相匹配的組(主鍵用戶)。

要修復,改變users_groups表的外鍵引用EMAIL:

CREATE TABLE `users_groups` (
    `ID` int(11) NOT NULL, 
    `groupname` varchar(255) NOT NULL, 
    KEY `FK_USERS_GROUPS_ID` (`ID`), 
    CONSTRAINT `FK_USERS_GROUPS_ID` FOREIGN KEY (`ID`) REFERENCES `users` (`EMAIL`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ 


或者在JPA,

@JoinColumn(name = "id", referencedColumnName = "email")) 

這似乎在JDBCRealm一個缺陷,但它已知是不靈活的。
爲了進一步調試(以及我如何處理它),通過打開MySQL('您的數據庫在這裏')日誌來查看原始SQL命令。