2013-10-09 8 views
8

Wir haben eine Java EE 7-Anwendung und verwenden Arquillian, um Zeug zu testen. Jetzt wollen wir nach einigen Berechtigungen des aktuell angemeldeten Benutzers suchen. Meine Frage ist ziemlich einfach. Wie kann ich einen Benutzer anmelden, wenn er sich in einem Testfall befindet? Ich habe ProgrammaticLogin doesnt work in arquillian tests und Embedded Glassfish, security and Arquillian questions gelesen, aber sie sind nicht klar beantwortet. Mein aktueller Ansatz ist so etwas wie diese:So testen Sie Login/Authentifizierung mit Arquillian - Java EE 7

// Inject services etc. 

@Test 
public void testLogin(){ 

    UserAccount user = new UserAccount(); 
    user.setUsername("bob"); 
    user.setPassword("bob"); 
    userAccountService.save(user); 

    ProgrammaticLogin pl = new ProgrammaticLogin(); 
    String realmName = "secureJDBCRealm"; 
    try { 
     pl.login("bob", "bob".toCharArray(), realmName, true); 
    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

Jetzt, wenn ich versuche, dies zu laufen, eine bekommt ein Loginexception behauptet, dass ich keine Loginmodule konfiguriert für „fileRealm“ habe. Aber "fileRealm" ist nicht der Bereich, nach dem ich suche (ich habe ihn dort zum ersten Mal getestet, aber dann habe ich ihn in "secureJDBCRealm" geändert, das ist unser benutzerdefiniertes Sicherheits-Realm für GlassFish). Wir verwenden arquillian-glassfish-embedded-3.1 zum Testen.

  • Weiß jemand, wo das Reich für Arquillian zu definieren?
  • Warum sucht meine Anwendung weiter nach fileRealm? Ist dies der Standardwert? (konnte hier keine Spezifikationen finden)

Antwort

3

Arquillian bietet keine Unterstützung für die Definition von Realms. Stattdessen müssen Sie den Realm im Container selbst konfigurieren. Dies ist etwas schwierig, wenn Sie einen eingebetteten Glassfish-Container verwenden, aber es ist machbar.

Ich gehe davon aus, dass secureJDBCRealm eine benutzerdefinierte Realm und nicht eine der Standard/eingebauten Glassfish Realms ist. Um einen benutzerdefinierten Bereich in einem eingebetteten Glassfish Containern zu konfigurieren, müssen Sie:

  1. Platz eine login.conf Datei auf dem Testklasse Pfad, der den Bereich verweist. Fügen Sie dazu ein Konfigurationsverzeichnis zu Ihrem Ressourcenverzeichnis hinzu und platzieren Sie login.conf in diesem Verzeichnis. Ihre login.conf wird so etwas wie dieses

    secureJDBCRealm { 
        com.blah.blah.LoginModule required; 
    }; 
    
  2. Ihr individuelles Reich aussehen zusammen mit irgendwelchen Abhängigkeiten müssen auf der Testklassenpfad sein.

  3. Sie müssen das Realm in Glassfish programmatisch erstellen. Dies kann über org.glassfish.embeddable.CommandRunner erfolgen. Zum Glück ist der Arquillian Embedded Container macht diese über JNDI zur Verfügung, was bedeutet, können Sie wie folgt vorgehen:

    @Resource(mappedName = "org.glassfish.embeddable.CommandRunner") CommandRunner commandRunner; 
    
    public void configureLoginRealm() { 
        CommandResult commandResult = commandRunner.run("create-auth-realm", "--classname=com.blah.blah.SecureJDBCRealm", "--property=jaas-context= secureJDBCRealm", "secure-JDBC-realm"); 
        log.debug(commandResult.getExitStatus().toString() + " " + commandResult.getOutput()); 
        Throwable throwable = commandResult.getFailureCause(); 
        if (throwable != null) { 
         log.error(throwable.getMessage(), throwable); 
        } 
    } 
    

    }

  4. Sie können dann programmatisch anmelden mit

    ProgrammaticLogin pl = new ProgrammaticLogin(); 
    String realmName = "secureJDBCRealm"; 
    try { 
        pl.login("bob", "bob".toCharArray(), realmName, true); 
    } catch (Exception e){ 
        e.printStackTrace(); 
    } finally { 
        pl.logout(); 
    } 
    
+0

Dank! Am Ende haben wir jedoch einen Remote-GlassFish mit dem richtigen Realm verwendet, der bereits vorkonfiguriert war. Die Remote-Unterstützung ist noch nicht so lange her, also haben wir diese Möglichkeit zunächst nicht gesehen. – bmurauer

+1

CommanderRunner-Schnittstelle geändert und dies funktioniert nicht mehr: -/Glassfish 3.1.2.2 –