2013-03-04 65 views
5

我正在使用嵌入式Glassfish(org.glassfish.main.extras:glassfish-embedded-all:3.1.2.2)並嘗試添加JDBC領域。該應用程序部署好的,但嘗試登錄時(基本認證顯示了正確的領域名)以下錯誤信息發生:Howto在嵌入式Glassfish中使用JDBC領域

com.sun.web.security.RealmAdapter認證 警告:WEB9102:網站登錄失敗:com.sun.enterprise.security.auth.login.common.LoginException:登錄失敗:沒有配置jdbcRealm的LoginModule

我的代碼如下所示:

嵌入的Glassfish

// create-jdbc-connection-pool ...  
// create-jdbc-resource ... 

String realmProperties = "jaas-context=jdbcRealm:datasource-jndi=jdbc/myDB:user-table=Users:user-name-column=userid:password-column=password:group-table=Groups:group-name-column=groupid; 

glassfish.getCommandRunner().run("create-auth-realm", "--classname", "com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm", "--property", realmProperties, myRealm); 

web.xml中部署的應用程序的

<login-config> 
    <auth-method>BASIC</auth-method> 
    <realm-name>myRealm</realm-name> 
</login-config> 

我想如果沒有指定缺省的LoginModule(其在非嵌入式Glassfish的情況下在域/ CONF/login.conf中被指定)適用?

回答

0

我的經驗是你不能用這種方式創建一個帶有嵌入式glassfish的安全領域。原因是你需要啓用安全管理。當然,您可以在嵌入式glassfish中啓用secure-admin,但需要重新啓動。這就是要點,通常你不能重新啓動嵌入式glassfish,因爲你將失去狀態,所以你也會失去配置的安全領域。

奇怪的是我期望只是一個失敗的登錄,而不是失蹤的loginmodules-exception Oo。

好消息,這是另一種方式,你可以嘗試哪些可能有所幫助。 如果您使用EJBContainer.createEJBContainer(props);創建EJBContainer,則可以傳遞一些屬性和屬性,我們可以使用它們。這看起來像下面這樣:

Map<String, Object> props = new HashMap<String, Object>(); 
props.put("org.glassfish.ejb.embedded.glassfish.instance.root", "./src/test/resources/testing-domain"); 

現在您可以在測試資源中指定整個測試域。爲此,您需要從獨立的Glassfish 3.1.2.2中複製一些內容。我想通了,你需要以下資源帶來它的工作:

testing-domain 
    config 
     admin-keyfile 
     cacerts.jks 
     domain.xml (there u can define the security-realm) 
     keyfile 
     keystore.jks 
     logging.properties 
     login.conf 
     server.policy 
     wss-server-config-1.0.xml 
     wss-server-config-2.0.xml 

如果您使用的是GlassFishRuntime.bootstrap().newGlassFish(glassfishProperties);你只需要domain.xml中和這個片段:

GlassFishProperties glassfishProperties = new GlassFishProperties(); 
File configFile = new File("src/test/resources/META-INF", "domain.xml"); 
glassfishProperties.setConfigFileURI(configFile.toURI().toString()); 

拿你改變護理服務器的端口,所以如果另一個glassfish實例正在運行,你不會得到一個錯誤。你也應該去掉domain.xml來加速測試。

現在你可以標記<security-service>插入這樣的規定下在domain.xml您的安全領域:

<auth-realm name="JDBC-AccountRealm" classname="com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm"> 
    <property name="jaas-context" value="jdbcRealm"></property> 
    <property name="password-column" value="PASSWORD"></property> 
    <property name="datasource-jndi" value="jdbc/__default"></property> 
    <property name="group-table" value="ACCOUNT_GROUP"></property> 
    <property name="user-table" value="ACCOUNT"></property> 
    <property name="group-name-column" value="GROUPS"></property> 
    <property name="group-table-user-name-column" value="EMAIL"></property> 
    <property name="user-name-column" value="EMAIL"></property> 
    <property name="digest-algorithm" value="SHA-256"></property> 
    <property name="encoding" value="Hex"></property> 
</auth-realm> 

這就是所有,容易做的,是吧? ; D

注意:如果需要,您可以在login.conf中指定LoginModules。注2:我假定myRealm(不含引號)是該命令中的拼寫錯誤嗎? - >'glassfish.getCommandRunner()。run(「create-auth-realm」,「--classname」,「com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm」,「--property」,realmProperties ,myRealm);'