2012-02-15 27 views
7

Ya tengo el inicio de sesión de formulario y la autenticación básica trabajando codo a codo con la ayuda de DelegatingAuthenticationEntryPoint.Manejo de formularios y autenticación básica HTTP con diferentes fuentes

Lo que trato de hacer es hacer que los usuarios ingresen a través del formulario de inicio de sesión para ser autenticados contra el criterio "A", y hacer que los usuarios accedan a las solicitudes de autenticación básica contra el criterio "B".

Algunos de los recursos de la aplicación se exponen a través de un servicio RESTful (accesible a través de la autenticación básica). En lugar de hacer que los usuarios ingresen sus propias credenciales para realizar una llamada de servicio REST, pueden ingresar pares de clave/valor generados para su uso exclusivo con el servicio REST que luego puede ser revocado por el usuario o por el administrador de la aplicación.

Preferiría compartir la mayor cantidad posible de mis beans de seguridad entre los dos métodos de autenticación. Sé que necesitaré UserDetailsService s por separado ya que el formulario de inicio de sesión consulta mi tabla users, y la autenticación básica consultará mi tabla service_credentials.

¿Cuál es la forma correcta de lograr este tipo de configuración en Spring Security?

Respuesta

13

Dependiendo de su aplicación y si usted está usando Spring Security 3.1, es posible que la mejor manera de separar la configuración en múltiples cadenas de filtros, cada uno con un gestor de autenticación separados definidos:

<http pattern="/rest_api/**" create-session="stateless" 
    authentication-manager-ref="serviceCredsAuthMgr"> 
    <http-basic /> 
</http> 

<http authentication-manager-ref="mainAuthMgr"> 
    <form-login /> 
</http> 

<authentication-manager id="serviceCredsAuthMgr"> 
    <authentication-provider user-service-ref="serviceCredsUserDetailsSvc" /> 
</authentication-manager> 

<authentication-manager id="mainAuthMgr"> 
    <!-- whatever --> 
</authentication-manager> 

En lugar de la pattern atributo también puede usar el atributo request-matcher-ref para especificar una instancia RequestMatcher que se utilizará para asignar las solicitudes entrantes a una cadena de filtro particular. Tiene una interfaz muy simple, pero puede permitir que coincida basándose en algo que no sea la ruta de URL, como el encabezado Accept.

+0

Excelente! Mi DelegatingAuthenticationEntryPoint usa algunos RequestMatchers. –

1

Con SpringSecurity (3.2.3.RELEASE) funcionan forma fina, así como autenticación básica:

<http pattern="/resources/**" security="none"/> 
<http pattern="/webjars/**" security="none"/> 

<http pattern="/rest/**" create-session="stateless" use-expressions="true"> 
    <intercept-url pattern="/**" access="isFullyAuthenticated()"/> 
    <http-basic /> 
</http> 

<http auto-config="true" use-expressions="true"> 
    <http-basic/> 
    <intercept-url pattern="/login" access="permitAll"/> 
    <intercept-url pattern="/loginfailed" access="permitAll"/> 
    <intercept-url pattern="/logout" access="permitAll"/> 

    <intercept-url pattern="/admin**" access="hasRole('ROLE_ADMIN')"/> 
    <intercept-url pattern="/**" access="isAuthenticated()"/> 
    <form-login login-page="/login" default-target-url="/" authentication-failure-url="/loginfailed"/> 
    <logout logout-success-url="/logout"/> 
    <remember-me user-service-ref="userService"/> 
</http> 

<authentication-manager> 
    <authentication-provider user-service-ref="userService"> 
<!-- 
     <jdbc-user-service data-source-ref="dataSource" 
          users-by-username-query="SELECT email, password, enabled FROM users WHERE email = ?" 
          authorities-by-username-query=" 
             SELECT u.email, r.name FROM users u, roles r WHERE u.id = r.user_id and u.email = ?"/> 
--> 
<!-- 
     <user-service> 
      <user name="[email protected]" password="password" authorities="ROLE_USER"/> 
      <user name="[email protected]" password="admin" authorities="ROLE_ADMIN"/> 
     </user-service> 
--> 
    </authentication-provider> 
</authentication-manager> 
+1

Realmente aprecio que se tome el tiempo de agregar esta información para las personas que volvieron a visitar esta publicación en la versión más reciente de la primavera sec. –

Cuestiones relacionadas