5

埋め込みGlassfish(org.glassfish.main.extras:glassfish-embedded-all:3.1.2.2)を使用していて、JDBCレルムを追加しようとしました。アプリケーションは正常にデプロイされますが、ログインしようとすると(基本認証で正しいレルム名が表示されます)、次のエラーメッセージが表示されます。

com.sun.web.security.RealmAdapter authenticate警告:WEB9102:Webログインに失敗しました: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の場合はdomain / conf / login.confで指定されます)が適用されると思いましたか?

4

1 に答える 1

0

私が経験したことは、この方法ではグラスフィッシュが埋め込まれたセキュリティレルムを作成できないということです。その理由は、secure-admin を有効にする必要があるためです。もちろん、組み込みのグラスフィッシュで secure-admin を有効にすることはできますが、それには再起動が必要です。それがポイントです。通常、埋め込まれたグラスフィッシュを再起動することはできません。これは、状態が失われ、構成されたセキュリティ レルムも失われるためです。

奇妙なことに、loginmodules-exception Oo の欠落ではなく、ログインの失敗だけが予想されます。

良いニュースです。おそらく役立つ別の方法があります。EJBContainer.createEJBContainer(props);EJBContainer を作成するために使用する場合、いくつかのプロパティを渡すことができ、使用できるプロパティが 1 つあります。次のようになります。

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

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());

サーバーのポートを変更するように注意してください。別のグラスフィッシュ インスタンスが実行されている場合にエラーが発生することはありません。また、テストを少し高速化するために 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);'

于 2014-02-24T02:15:17.417 に答える