2013-10-09 13 views
8

Abbiamo un'applicazione Java EE 7 e usiamo Arquillian per testare le cose. Ora vogliamo verificare alcune autorizzazioni dell'utente attualmente connesso. La mia domanda è piuttosto elementare, come posso accedere a un utente all'interno di una testcase? Ho letto ProgrammaticLogin doesnt work in arquillian tests e Embedded Glassfish, security and Arquillian questions ma non hanno una risposta chiara. Il mio approccio attuale è qualcosa di simile:Come verificare login/autenticazione con 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(); 
    } 
} 

Ora, quando provo a fare funzionare questo, un ottenere un LoginException affermando che non ho LoginModule configurato per "fileRealm". Ma "fileRealm" non è il regno che sto cercando (l'ho messo lì per testare la prima volta, ma poi l'ho cambiato in "secureJDBCRealm", che è il nostro Custom Security Realm per GlassFish). Per il test usiamo arquillian-glassfish-embedded-3.1.

  • Qualcuno sa dove definire il regno di Arquillian?
  • Perché la mia applicazione continua a cercare fileRealm? È questo il valore predefinito? (non è stato possibile trovare alcuna specifica qui)

risposta

3

Arquillian non fornisce alcun supporto per la definizione di aree. Invece devi configurare tu stesso il regno nel contenitore. Questo è un po 'complicato quando si usa un contenitore Glassfish incorporato, ma è fattibile.

Suppongo che secureJDBCRealm sia un dominio personalizzato e non uno dei Regioni Glassfish standard/incorporati. Per configurare un regno personalizzato in un contenitore Glassfish incorporato è necessario:

  1. inserire un file login.conf sul percorso classe di test che fa riferimento al regno. Per fare ciò aggiungi una directory di configurazione alla tua directory delle risorse e inserisci login.conf all'interno di quella directory. Il tuo login.conf sarà simile a questa

    secureJDBCRealm { 
        com.blah.blah.LoginModule required; 
    }; 
    
  2. tuo regno su misura insieme a tutte le dipendenze devono essere sul percorso classe di test.

  3. È necessario creare a livello di programmazione il regno in glassfish. Questo può essere fatto tramite org.glassfish.embeddable.CommandRunner. Fortunatamente il contenitore incorporato Arquillian rende disponibili via JNDI che significa che è possibile effettuare le seguenti:

    @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. è quindi possibile accedere a livello di codice con

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

Grazie! Tuttavia, abbiamo finito per utilizzare un GlassFish remoto con il Realm corretto già preconfigurato. Il supporto remoto è arrivato non tanto tempo fa, quindi all'inizio non abbiamo visto questa possibilità. – bmurauer

+1

Interfaccia CommanderRunner modificata e questo non funziona più: -/Glassfish 3.1.2.2 –