2011-08-11 12 views
5

Soy nuevo en Spring y mi requisito es que no quiero autenticar al usuario con nombre de usuario y contraseña. El usuario es autenticar alguna otra aplicación y mi aplicación llegar la solicitud con detalles folloing:Spring 3.0 Security - Autorización con autenticación

  1. nombre de usuario
  2. Roles

Sólo quiero usar Spring Security para asegurar las páginas de acuerdo con el roles en la solicitud. He pensado en escribir UserDetailService, pero eso solo agrega datos de solicitud, Spring aún solicita información de autenticación. luego pensé en escribir algo como lo siguiente:

public class UserLogin { 

/* 
@Resource(name = "userDetailsService") 
private UserDetailsService userDetailsService; 
*/ 

@Resource(name = "authenticationManager") 
private AuthenticationManager authenticationManager; 

public boolean login(UserEntity user) { 

    //UserDetails ud = userDetailsService.loadUserByUsername(username); 

    Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
    for (String role : user.getAuthorities()) { 
     authorities.add(new GrantedAuthorityImpl(role)); 
    } 

    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword(), authorities); 

    try { 
     Authentication auth = authenticationManager.authenticate(token); 

     SecurityContext securityContext = new SecurityContextImpl(); 

     // Places in ThredLocal for future retrieval 
     SecurityContextHolder.setContext(securityContext); 
     SecurityContextHolder.getContext().setAuthentication(auth); 

    } catch (AuthenticationException e) { 
     return false; 
    } 

    return true; 
} 
} 

Am I que va en la dirección correcta. Si es así, cómo configurar todo ... en spring-xml.

Respuesta

8

Se encuentra en lo que se denomina un escenario de autenticación previa, donde configura Spring Security para que autorice el acceso, no autentique el acceso. Ver http://static.springsource.org/spring-security/site/docs/3.0.x/reference/preauth.html. Aquí hay una configuración completa, donde debe implementar AbstractPreAuthenticatedProcessingFilter para grep el UserPrincipal de su esquema de autenticación, y el UserDetailsService personalizado que mencionó anteriormente.

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans 
xmlns:security="http://www.springframework.org/schema/security" 
xmlns:beans="http://www.springframework.org/schema/beans" 
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.0.xsd"> 

<security:global-method-security secured-annotations="enabled" /> 

<beans:bean id="preAuthenticatedProcessingFilterEntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" /> 

<security:http auto-config="false" entry-point-ref="preAuthenticatedProcessingFilterEntryPoint"> 
    <security:custom-filter position="PRE_AUTH_FILTER" ref="myCustomPreAuthFilter" /> 
</security:http> 

<beans:bean id="myCustomPreAuthFilter" class="com.mypackage.MyCustomPreAuthFilter"> 
    <beans:property name="authenticationManager" ref="authenticationManager" /> 
</beans:bean> 

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider ref="preauthAuthProvider" /> 
</security:authentication-manager> 

<beans:bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider"> 
    <beans:property name="preAuthenticatedUserDetailsService"> 
     <beans:bean id="userDetailsServiceWrapper" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> 
      <beans:property name="userDetailsService" ref="myCustomUserDetailsService"/> 
     </beans:bean> 
    </beans:property> 
</beans:bean> 

Cuestiones relacionadas