2012-08-13 17 views
12

Me he dado cuenta de que hay un par de preguntas sobre este tema. Los revisé y no pude aplicarlos a mi configuración Spring específica. Me gustaría configurar mi redireccionamiento de inicio de sesión para que sea condicional, en función del rol del usuario. Esto es lo que tengo hasta ahora:Spring Security condicional default-target-url

<http auto-config="true" use-expressions="true"> 
     <custom-filter ref="filterSecurityInterceptor" before="FILTER_SECURITY_INTERCEPTOR"/> 
     <access-denied-handler ref="accessDeniedHandler"/> 
     <form-login 
      login-page="/login" 
      default-target-url="/admin/index" 
      authentication-failure-url="/index?error=true" 
      /> 
     <logout logout-success-url="/index" invalidate-session="true"/> 
</http> 

pensé this question podría estar en la misma línea que lo que estoy tratando de hacer. ¿Alguien sabe cómo puedo aplicarlo?

EDITAR 1

<bean id="authenticationProcessingFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationSuccessHandler" ref="authenticationSuccessHandler"/> 
</bean> 
<bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler"> 
    <property name="defaultTargetUrl" value="/login.jsp"/> 
</bean> 

EDIT 2

Actualmente no tengo una clase como public class Test implements AuthenticationSuccessHandler {} como se muestra en this example.

+3

Su pregunta es idéntica a [éste] (http://stackoverflow.com/questions/7470405/authenticationsuccesshandler-example-for-spring-security-3) –

+0

Gracias. ¿Podría verificar ** EDICION 1 **. Me estoy confundiendo porque ya estoy asignando una clase de primavera a ese frijol? – ThreaT

+0

No form-login un authenticationSuccessHandler? http://static.springsource.org/spring-security/site/docs/3.0.x/reference/appendix-namespace.html –

Respuesta

20

He probado el código y funciona, no hay ciencia del cohete en él

public class MySuccessHandler implements AuthenticationSuccessHandler { 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, 
      HttpServletResponse response, Authentication authentication) 
      throws IOException, ServletException { 
     Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities()); 
     if (roles.contains("ROLE_ADMIN")){ 
      response.sendRedirect("/Admin.html"); 
      return; 
     } 
     response.sendRedirect("/User.html"); 
    }  
} 

Los cambios en el contexto de seguridad:

<bean id="mySuccessHandler" class="my.domain.MySuccessHandler"> 
    </bean> 

<security:form-login ... authentication-success-handler-ref="mySuccessHandler"/> 

actualización si desea utilizar default-target-url enfoque, funcionará igual de bien, pero se activará cuando el usuario acceda primero a la página de inicio de sesión:

<security:form-login default-target-url="/welcome.htm" />

@Controller 
public class WelcomeController { 
    @RequestMapping(value = "/welcome.htm") 
    protected View welcome() { 

     Set<String> roles = AuthorityUtils 
       .authorityListToSet(SecurityContextHolder.getContext() 
         .getAuthentication().getAuthorities()); 
     if (roles.contains("ROLE_ADMIN")) { 
      return new RedirectView("Admin.htm"); 
     } 
     return new RedirectView("User.htm"); 
    } 
} 
+0

¿Qué sucede si quiero redireccionar al dominio antera? @Boris Treukhov – Mahdi

+1

En caso de que alguien esté usando el código de Java para el contexto de Sprint: 'formLogin(). SuccessHandler (new MySuccessHandler())' – RAS

Cuestiones relacionadas