2013-03-04 3 views
5

Я использую встроенную Glassfish (org.glassfish.main.extras: glassfish-embedded-all: 3.1.2.2) и попытался добавить область JDBC. Приложение развертывается нормально, но при попытке входа в систему (. Основные AUTH показывает правильное имя области) сообщение об ошибке следующее происходит:Как использовать область JDBC во встроенной стеклянной платке

com.sun.web.security.RealmAdapter аутентификация ПРЕДУПРЕЖДЕНИЯ: WEB9102: Web Войти Ошибка: com.sun.enterprise.security.auth.login.common.LoginException: Логин не удался: нет сконфигурированный для jdbcRealm LoginModules

Моего кода выглядит следующим образом:

встроенного 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

Опыт, который я сделал, заключается в том, что вы не можете создать зону безопасности со встроенной стеклянной крышкой. Причина в том, что вам нужен защищенный админ. Конечно, вы можете включить secure-admin во встроенную стеклянную панель, но для этого требуется перезагрузка. И в этом, как правило, вы не можете перезапустить встроенную стеклянную фару, потому что вы потеряете состояние, чтобы вы потеряли настроенную область безопасности.

Странная вещь, я бы ожидал только неудачный логин, а не отсутствующие логин-модули - исключение Oo.

Хорошие новости, theres другой способ вы могли попробовать который возможно помогает. Если вы используете 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 для ускорения тестов.

Теперь вы можете указать безопасности-сферу в domain.xml под вставной то тег <security-service>, как это:

<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

Примечание: вы можете указать LoginModules в login.conf, если хотите.

Note2: Я предполагаю, что myRealm (без кавычек) является опечаткой в ​​этой команде? -> 'glassfish.getCommandRunner(). run ("create-auth-realm", "--classname", "com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm", "--property", realmProperties , myRealm);

Смежные вопросы