2011-11-14 10 views
7

Ho il seguente codice (tentare di accedere un utente in programatically):primavera Authentication.setAuthenticated (booleano) java.lang.IllegalArgumentException: Impossibile impostare questo token di fiducia

List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
authorities.add(new GrantedAuthorityImpl("ROLE_ADMIN")); 
... 
User tempUser = new User(correctUsername, 
    correctPassword, 
    true, true, true, true, // logging them in... 
    authorities // type is List<GrantedAuthority> 
); 
... 
Authentication authentication 
    = new UsernamePasswordAuthenticationToken(tempUser, authorities); 
    // I'm using authorities again (List<GrantedAuthority>) 
    // is this the right spot for it? 
... 
// this is the line causing the error 
authentication.setAuthenticated(true); 

Quando provo ad eseguire tale ottengo il seguente:

java.lang.IllegalArgumentException: Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead 

Nota che sto usando l'elenco dei GrantedAuthority s authorities sia nelle User e Authentication oggetti. Non sono sicuro di dove dovrei usare quelli. Sto cercando di replicare la risposta per another SO question ma sto correndo nell'eccezione pubblicata sopra. Altre domande simili che non riusciva a rispondere alla mia domanda:

Dopo qualche ricerca la più vicina che ho trovato per una risposta era a the forum at springsource.org, e quella persona di utilizzare un deprecated method, ma è un approccio simile. Come posso registrare un utente in modo programmatico?

+1

Quale linea sta causando il problema? –

+0

l'ultimo; con il commento sopra che dice 'questa è la linea che causa l'errore ('authentication.setAuthenticated (true);') – Josh

risposta

11

Non è necessario chiamare esplicitamente authentication.setAuthenticated(true) (in effetti, non è consentito). Il costruttore lo fa per te.

Si sta tuttavia invocando il costruttore errato. Si dovrebbe essere chiamando:

Authentication authentication 
    = new UsernamePasswordAuthenticationToken(tempUser, password, authorities); 

Controllare il Javadoc per UsernamePasswordAuthenticationToken.

+0

Awesome! grazie mille. Potrei chiedere perché entrambi i costruttori 'User' e' UsernamePasswordAuthenticationToken' hanno bisogno di un elenco di autorizzazioni illimitate? Comunque funziona così accetterò quando posso – Josh

+1

Ci sono due livelli di astrazione che si scontrano qui. UsernamePasswordAuthenticationToken è la versione concreta di un'entità che può essere autenticata o meno (autenticazione). Un utente è un'implementazione di un preside (dettagli di un utente) esistente indipendentemente dallo stato di autenticazione. – pap

+0

Si è imbattuto nello stesso problema, presupponendo che dovevo chiamare esplicitamente il metodo 'setAuthenticated()'. –

Problemi correlati