2013-03-04 14 views
5

Używam osadzonego Glassfish (org.glassfish.main.extras: glassfish-embedded-all: 3.1.2.2) i próbowałem dodać dziedzinę JDBC. Aplikacja wykorzystuje w porządku, ale kiedy próbuje się zalogować (. Podstawowe auth pokazuje właściwej nazwy obszaru) komunikat o błędzie po następuje:Jak używać sfery JDBC w osadzonym Glassfish

com.sun.web.security.RealmAdapter uwierzytelniać OSTRZEŻENIE: WEB9102: Web Login nie powiodło się: com.sun.enterprise.security.auth.login.common.LoginException: Logowanie nie powiodło się: brak LoginModules skonfigurowane dla jdbcRealm

Mój kod wygląda następująco:

osadzony 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 od wdrożonej aplikacji

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

Pomyślałem, że jeśli nic nie zostanie określony domyślny LoginModule (który w przypadku braku wbudowanego GlassFish określonego w domenie/conf/login.conf) dotyczy?

Odpowiedz

0

Doświadczenie, którego dokonałem, polega na tym, że nie można w ten sposób stworzyć sfery bezpieczeństwa z osadzoną szklaną rybką. Powodem jest to, że potrzebujesz bezpiecznego administratora. Oczywiście, możesz włączyć bezpieczną admin w osadzonym glassfish, ale to wymaga ponownego uruchomienia. I o to chodzi, zwykle nie można ponownie uruchomić osadzonego glassfish, ponieważ stracisz stan, abyś również stracił skonfigurowaną dziedzinę bezpieczeństwa.

Dziwne jest to, że oczekiwałbym tylko nieudanego logowania, a nie brakującego loginu Oo.

Dobra wiadomość, jest inny sposób, który można wypróbować, co może pomóc. Jeśli użyjesz EJBContainer.createEJBContainer(props); do utworzenia elementu EJBContainer, możesz przekazać kilka właściwości i jedną właściwość, której możemy użyć. To będzie wyglądać następująco:

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

Teraz możesz określić całą swoją domenę testową w swoich zasobach testowych. W tym celu należy skopiować pewne rzeczy z działającego samodzielnego Glassfish 3.1.2.2. I zorientowali się, potrzebne są następujące środki w celu dostosowania go do pracy:

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 

Jeśli pomocą GlassFishRuntime.bootstrap().newGlassFish(glassfishProperties); po prostu trzeba się domain.xml i ten fragment:

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

zadbać, aby zmienić porty serwera, więc nie otrzymasz błędu, jeśli uruchomiona jest kolejna wersja glassfish. Powinieneś również usunąć plik domain.xml, aby przyspieszyć testy.

Teraz można określić security-sferę w domain.xml pod tag <security-service> wkładki coś takiego:

<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> 

to wszystko, łatwa robota, huh? ; D

Uwaga: Jeśli chcesz, możesz określić LoginModules w pliku login.conf.

Uwaga2: Zakładam, że myRealm (bez cudzysłowów) jest literówką w tym poleceniu? -> 'glassfish.getCommandRunner(). run ("create-auth-realm", "--classname", "com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm", "--property", realmProperties , myRealm); "

Powiązane problemy