2009-07-01 16 views
9

Tengo una definición de contexto de seguridad que utiliza PreAuthenticatedProcessingFilterEntryPoint para la parte flexible de mi aplicación. ¿Cómo puedo tener otra definición que use el formulario estándar de inicio de sesión con formularios html para otra parte de mi aplicación? Esto es lo que tengo actualmente:¿Puedo tener múltiples contextos de seguridad con seguridad de primavera?

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


    <http auto-config="true" access-denied-page="/admin/access-denied"> 
     <intercept-url pattern="/admin/login*" filters="none"/> 
      <intercept-url pattern="/admin/access-denied" filters="none"/> 
     <intercept-url pattern="/admin/**/*" access="ROLE_ADMIN" /> 
     <form-login login-page="/admin/login" authentication-failure-url="/admin/login?login_error=1" 
      default-target-url="/admin/index" login-processing-url="/admin/login-process"/> 
     <logout logout-success-url="/admin/login"/> 

    </http> 

<global-method-security jsr250-annotations="enabled" /> 

    <beans:bean id="preAuthenticatedEntryPoint" class="org.springframework.security.ui.preauth.PreAuthenticatedProcessingFilterEntryPoint" > 
    </beans:bean> 


    <beans:bean id="userAccountManager" class="com.mycomp.service.managers.jpa.UserAccountJpaManager" /> 
    <beans:bean id="userService" class="com.mycomp.auth.DefaultUserDetailsService" /> 
    <beans:bean id="defaultPasswordEncoder" class="com.mycomp.auth.DefaultPasswordEncoder" /> 

    <authentication-provider user-service-ref="userService"> 
     <password-encoder ref="defaultPasswordEncoder"/> 
    </authentication-provider> 


</beans:beans> 

Lo que me gustaría hacer es utilizar otro proveedor de autenticación para las direcciones URL que se encuentran en el sitio de administración, la que actualmente tengo es para la aplicación Flex. Por lo tanto, quiero que la seguridad de las URL administrativas use otro bean userDetailsService.

+0

Tengo el mismo problema ... ¿cómo terminó esto? – HDave

+0

@HDave No estoy seguro de cómo terminó el problema relacionado con la seguridad primaveral (aunque creo que lo resolví de alguna manera veo las respuestas a continuación), pero al final abandoné la idea de una interfaz de administrador java y la rediseñé por completo en Jython en el La mayor parte del back-end de la aplicación para el proyecto fue de esa manera. – Vasil

Respuesta

0

Todo se trata de qué partes de su aplicación son interceptadas por la cadena de filtros Spring Security. En algún lugar de la configuración de XML (dependiendo de si se hizo la sencilla configuración de la etiqueta o no) no es una expresión regular intercepción así:

<intercept-url pattern="/**" ...> 

Puede tener diferentes patrones de intercepción que utilizan diferentes configuraciones (también conocido como diferentes partes de la cadena de filtro de seguridad). Podría darle una respuesta más concreta si publica su configuración actual xml.

EDITAR: Actualmente está utilizando la etiqueta http para definir su configuración Spring Security. Esta etiqueta se usa como atajo/ayudante y define automáticamente muchas piezas de la cadena del filtro de seguridad que también se pueden configurar manualmente. Creo que su caso de uso no se ajusta al paradigma de configuración automática, por lo que deberá configurar manualmente la cadena de filtros para diferentes patrones de URL (como se ve en la publicación debajo de la mía). Puede crear su propio PreAuthenticationFilter (que tomará un UserDetailsService personalizado) y agregarlo cuando corresponda a la asignación de intersección de su cadena de filtros.

+0

He publicado mi configuración de contexto de seguridad. Apreciaría si me puedes ayudar con esto. – Vasil

2

Mapa cada cadena de filtro para un patrón diferent URL:

<bean id="myfilterChainProxy" 
    class="org.springframework.security.util.FilterChainProxy"> 
    <security:filter-chain-map pathType="ant"> 
    <security:filter-chain pattern="/flex" filters="filterF"/> 
    <security:filter-chain pattern="/**" filters="filter1,filter2,filter3"/> 
    </security:filter-chain-map> 
</bean> 
+0

Supongo que esto es lo que tengo que hacer. Sin embargo, no sé cuál es la forma más fácil de definir un filtro con solo un proveedor de autenticación personalizado. – Vasil

12

Ha sido difícil de hacer, hasta hace poco, pero ahora es fácil!

Spring Security ha agregado soporte para el escenario en la versión 3.1. Actualmente está disponible como Release Candidate, implementado por SEC-1171. Los detalles de la sintaxis se encuentran en el manual incluido con 3.1.

Es bastante fácil de usar. Básicamente, usted simplemente define múltiples elementos http en su configuración de Spring Security, uno para cada contexto. Estamos utilizando de esta manera:

<!-- Configure realm for system administration users --> 
<security:http pattern="/admin/**" create-session="stateless"> 
    <security:intercept-url pattern='/**' access='ROLE_ADMIN' requires-channel="https" /> 
    <security:custom-filter position="PRE_AUTH_FILTER" ref="preAuthFilter" /> 
</security:http> 


<!-- Configure realm for standard users --> 
<security:http auto-config="true" access-denied-page="/error/noaccess" use-expressions="true" create-session="ifRequired"> 
    <security:form-login 
      ... 
      ... 
</security:http> 

Lo clave a destacar es el pattern="/admin/**" en el primer elemento de http. Esto le dice a Spring que todas las URL bajo /admin están sujetas a ese contexto en lugar del contexto predeterminado, por lo que las URL bajo /admin usan su filtro de autorización previa.

+0

Hola, tengo el mismo problema al usar varios elementos 'http'.Lo he mapeado con diferentes patrones y todavía he compartido 'SecurityContext' entre los reinos de seguridad (elementos' http'). –

Cuestiones relacionadas