2012-02-29 74 views
10

Estoy usando spring-security con HTTP Basic Auth para asegurar una aplicación web java. En mi aplicación web, necesito obtener el nombre de usuario y la contraseña del usuario actual para autenticarlos aún más en otro servicio. Puedo obtener el nombre de usuario, pero no la contraseña.Recuperar la contraseña del usuario actual de spring-security

He intentado utilizar SecurityContextHolder.getContext().getAuthentication() para acceder a esta información como se sugiere aquí How can I get plaintext password from spring-security? pero la contraseña se devuelve como null.

¿Cómo puedo obtener la contraseña?

Gracias.

Esta es mi applicationContext-security.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:sec="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/security 
     http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

<sec:http authentication-manager-ref='authenticationManager'> 
    <sec:intercept-url pattern="/spring/**" access="ROLE_USER" /> 
    <sec:http-basic /> 
</sec:http> 

<bean id="basicAuthenticationFilter" 
    class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationEntryPoint" ref="authenticationEntryPoint" /> 
</bean> 

<bean id="authenticationEntryPoint" 
    class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint"> 
    <property name="realmName" value="Announcements Rest Realm" /> 
</bean> 

<bean id="authenticationManager" 
    class="org.springframework.security.authentication.ProviderManager"> 
    <property name="providers"> 
     <list> 
      <ref local="authProvider" /> 
     </list> 
    </property> 
</bean> 

<bean id="authProvider" 
    class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
    <property name="userDetailsService" ref="userDetailsService" /> 
</bean> 

<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy"> 
    <constructor-arg> 
     <list> 
      <sec:filter-chain pattern="/spring/**" filters="basicAuthenticationFilter" /> 
     </list> 
    </constructor-arg> 
</bean> 

<sec:user-service id="userDetailsService"> 
    <sec:user name="admin" password="**" authorities="ROLE_USER, ROLE_ADMIN" /> 
    <sec:user name="user" password="**" authorities="ROLE_USER" /> 
</sec:user-service> 

Respuesta

0

¿Utiliza recuérdame/ejecutar como usuario/switch? En tal caso, la contraseña es nula (como se describe en un hilo que ha mencionado). Además, probablemente tenga que usar autenticación de formulario básica, (solicitud posterior a j_spring_security_check)

+0

no estoy usando yo recuerde, ejecutar como usuario o cambiar por lo que yo soy consciente (a menos que estén habilitados por defecto ? No estoy usando autoconfiguración). Tampoco puedo usar la autenticación de formulario ya que mi aplicación web es un servicio web. – ssloan

+0

bien, entonces, ¿cómo informa a SI que el usuario ha sido autenticado con éxito? Si usa SecurityContextHolder.getContext(). SetAuthentication (...), ¿qué tipo de token pasa? –

+0

No estoy llamando a setAuthentication() directamente: debe estar sucediendo en uno de los beans que he configurado. Actualizaré mi publicación con mi applicationContext-security.xml por si acaso. – ssloan

0

Si está configurando todos los detalles del usuario actual, incluida la contraseña en el objeto de sesión, puede obtener la contraseña de ese objeto de sesión.

+0

Lo único que está en la sesión es el mismo objeto que vuelve de getAuthentication, y de nuevo el método getcredentials() devuelve null. – ssloan

+1

Esto no funcionará de forma predeterminada desde Spring 3.1 en adelante; las credenciales se borran con la autenticación exitosa.Ver http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#core-services-erasing-credentials –

22

Lo he descubierto.

he cambiado de autenticación de administrador de configuración para utilizar el elemento de autenticación-gerente y añade el atributo existe:

<sec:authentication-manager alias="authenticationManager" erase-credentials="false"> 
    <sec:authentication-provider ref="authProvider" />  
</sec:authentication-manager> 

A continuación, puedo utilizar SecurityContextHolder.getContext().getAuthentication().getCredentials() en mi clase del controlador para obtener la contraseña.

Gracias por su ayuda, aunque Piotrek De

+0

Buen hallazgo. No sabía sobre 'erase-credentials =" false "' – cowls

+0

Eso es lo que necesitaba, aunque estoy un poco preocupado por los problemas de seguridad; pero no veo otra forma sensata de evitar esos problemas. –

+0

Funciona bien con el inicio de sesión de LDAP también. – romhail

0

Una mejor manera es poner en práctica su 'userDetailsService'. para que pueda controlar cómo se podría utilizar UserDetails al realizar la autenticación. He implementado una autenticación basada en formularios y escribí mi servicio de usuario auto-definido,

@Service("userService") 
public class UserServiceImpl extends GenericService<User> implements UserDetailsService,UserService{ 



    @Override 
     @Transactional 
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { 
       // Declare a null Spring User 
      UserDetails userDetails = null; 



      // Search database for a user that matches the specified username 
      // You can provide a custom DAO to access your persistence layer 
      // Or use JDBC to access your database 
      // DbUser is our custom domain user. This is not the same as Spring's User 
      User dbUser=this.findUserByUserName(username); 

      if (dbUser == null) { 
       throw new UsernameNotFoundException("HiMVC Security:: Error in retrieving user(username=" + username + ")"); 
      } 



      userDetails = new org.springframework.security.core.userdetails.User(
        dbUser.getUserName(), 
        dbUser.getPassword(),//here you can put a clear text password 
        true, 
        true, 
        true, 
        true, 
        loadUserAuthorities(username)); 


      return userDetails; 
     } 
Cuestiones relacionadas