2013-04-02 14 views
6

Ho seguito lo instructions per creare un ambito di sicurezza personalizzato per il mio glassfish. Funziona tutto bene, gli utenti sono autenticati correttamente. Il problema però è la seguente:Come utilizzare un principal personalizzato in un ambito di sicurezza personalizzato (Glassfish)?

  • Le credenziali dell'utente sono criptati in una stringa
  • Il regno decifra questa stringa ed esegue l'autenticazione su un database (opere)
  • Invece di usare i valori decifrati come principale in securityContext viene passata la stringa codificata .

Ho già provato a eseguire l'override del metodo commit() per sostituire il _userPrincipal o allegare la mia implementazione utilizzando getSubject().getPrincipals().add(new PrincipalImpl("user")). Nessuno dei due stava funzionando come previsto. Fondamentalmente la domanda è semplice come questa: come posso impostare il mio principale in un regno di sicurezza personalizzato in glassfish in un modo che permetta di usarlo insieme a un securityContext iniettato?

Il mio ambiente:

  • Glassfish 3.1.2.2 (Build 5) Profilo completa
  • l'applicazione in esecuzione dietro l'autenticazione è un JAX-RS 1.1 applicazione basata
  • Il SecurityContext si ottiene utilizzando l'iniezione

risposta

2

già cercato di sostituire il metodo commit() per sostituire il _userPrin cipale o allega la mia implementazione usando getSubject(). getPrincipals(). add (new PrincipalImpl ("user")). Né funzionava come previsto.

Che tipo di errore si ottiene?

Indipendentemente da ciò, ritengo che il problema si ponga sul terzo passaggio di questo processo. SecurityContext definisce BASIC_AUTH, FORM_AUTH, CLIENT_CERT_AUTH, DIGEST_AUTH come AuthenticationScheme, quindi forse SecurityContext non può vedere l'implementazione del tuo schema o tipo di sicurezza. Ma puoi provare questi passaggi e spero che funzionino per te.

A- Implementare un LoginModule Java Authentication and Authorization servizi (JAAS) o estendere com.sun.appserv.security.AppservPasswordLoginModule

public class MyLoginModule extends AppservPasswordLoginModule { 

@Override 
protected void authenticateUser() throws LoginException { 
    if (!authenticate(_username, _password)) { 
//Login fails 
     throw new LoginException("LoginFailed"); 
    } 
    String[] myGroups = getGroupNames(_username); 
    commitUserAuthentication(myGroups); 
} 

private boolean authenticate(String username, String password) { 
    /* 
    Check the credentials against the authentication source, return true if   authenticated, return false otherwise 
    */ 
    return true; 
} 

private String[] getGroupNames(String username) { 
// Return the list of groups this user belongs to. 
} 

B- Implementare la classe regno.

public class MyRealm extends AppservRealm { 

@Override 
public void init(Properties props) 
throws BadRealmException, NoSuchRealmException { 
//here you initialize the realm 
} 
@Override 
public String getAuthType() { 
return "Custom Realm"; 
} 
} 

C- Installazione e configurazione del dominio e LoginModule nel server.

per questo è necessario guardare JSR 196 e scrivere il proprio SAM impiantando javax.security.auth.message.module.ServerAuthModule. Dai un'occhiata al link qui sotto. https://blogs.oracle.com/enterprisetechtips/entry/adding_authentication_mechanisms_to_the

+0

Poiché la domanda è stata posta 10 mesi fa, non posso nemmeno dirvi più quali errori abbiamo avuto. Sfortunatamente non sarò in grado di testare i tuoi approcci perché abbiamo usato una soluzione diversa. Ma dal momento che hai fatto lo sforzo di cercare di rispondere a una domanda così antica, inviterò comunque la tua risposta :) – Kai

Problemi correlati