2011-11-14 10 views
7

Tengo el siguiente código (intentar iniciar sesión en un usuario mediante programación):primavera Authentication.setAuthenticated (booleano) java.lang.IllegalArgumentException: No se puede establecer este token de confianza

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

Cuando trato de ejecutar ese me sale el siguiente:

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

Tenga en cuenta que estoy usando la lista de GrantedAuthority s authorities tanto en los User y Authentication objetos. No estoy seguro de dónde debería estar usando esos. Estoy tratando de replicar la respuesta para another SO question, pero me encuentro con la excepción publicada anteriormente. Otras preguntas similares que no acababa de responder a mi pregunta:

después de buscar el más cercano que he encontrado para una respuesta estaba en the forum at springsource.org, y esa persona de usar una deprecated method, pero es un enfoque similar. ¿Cómo puedo registrar un usuario en programación?

+1

¿Qué línea está causando el problema? –

+0

el último; con el comentario anterior que dice 'esta es la línea que causa el error ('authentication.setAuthenticated (true);') – Josh

Respuesta

11

No tiene que llamar explícitamente al authentication.setAuthenticated(true) (de hecho, no está permitido). El constructor hace eso por ti.

Usted está, sin embargo, invocando el constructor equivocado. Debería llamar al:

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

Compruebe javadoc para UsernamePasswordAuthenticationToken.

+0

Awesome! muchas gracias. ¿Podría preguntar por qué los constructores 'User' y' UsernamePasswordAuthenticationToken' necesitan una lista de grantedauthorities? De todos modos funciona, así que lo aceptaré cuando pueda. – Josh

+1

Aquí chocan dos niveles de abstracción. UsernamePasswordAuthenticationToken es una versión concreta de una entidad que puede o no estar autenticada (Autenticación). Un usuario es una implementación de un principal (detalles de un usuario) que existe independientemente de cualquier estado de autenticación. – pap

+0

Me encontré con el mismo problema, asumí que necesitaba llamar explícitamente al método 'setAuthenticated()'. –

Cuestiones relacionadas