5

He estado luchando con este problema por un tiempo. Encontré varios mensajes al respecto, pero ninguno resolvió mi problema. Es probable que tenga algo que ver con el hecho de que un SecurityContext es Boud a un hilo específico, pero incluso entonces no sé cómo resolverlo:Seguridad de primavera - SecurityContext.authentication null en taglib y jsp pero está bien en el controlador

Considere siguiente código para recuperar el usuario que se registra en:

SecurityContextHolder.getContext().getAuthentication().getPrincipal() 

la ejecución de este código en un controlador volvería (correctamente) que el usuario conectado. la ejecución de este código de una taglib JSP o lanza NPE (autenticación = null). También la etiqueta de resorte no funciona (presumiblemente por la misma razón).

Extracto de web.xml:

<filter> 
    <filter-name>AcegiFilter</filter-name> 
    <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class> 
    <init-param> 
     <param-name>targetClass</param-name> 
     <param-value>org.acegisecurity.util.FilterChainProxy</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>AcegiFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Extracto del muelle de archivo de configuración de seguridad:

<bean id="filterChainProxy" class="org.springframework.security.util.FilterChainProxy"> 
    <property name="filterInvocationDefinitionSource"> 
     <value> 
      CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
      PATTERN_TYPE_APACHE_ANT 
      /**=httpSessionIntegrationFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor 
     </value> 
    </property> 
</bean> 
    <bean id="filterSecurityInterceptor" 
    class="org.springframework.security.intercept.web.FilterSecurityInterceptor"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="accessDecisionManager" ref="accessDecisionManager" /> 
    <property name="alwaysReauthenticate" value="true" /> 
    <property name="objectDefinitionSource"> 
     <value> 
      CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
      PATTERN_TYPE_APACHE_ANT 
      /myaccount.htm=ROLE_CUSTOMER 
     </value> 
    </property> 
</bean> 
+0

¿Podemos ver una muestra JSP que produce esta condición? ¿Está importando el taglib de Spring Security en el encabezado de su página? – Gandalf

Respuesta

5

RESUELTOS

surgió el problema de la secuencia de filtro. El PageFilter (sitemesh) se invocó antes del filtro de seguridad de primavera y, debido a esto, el contexto de seguridad aún no estaba disponible en el jsp. Cambiar el orden de los filtros en web.xml (filtro de seguridad primero) solucionó el problema.

0

Esto puede parecer una pregunta obvia, pero tienen que obligaba al usuario a conectarse (es decir, autenticar) en cualquier momento antes de acceder a la página /myaccount.htm? No vi ninguna asignación a una página de inicio de sesión que requiera acceso anónimo en la fuente de definición de objeto, por lo que pregunto. Si el usuario puede acceder /myaccount.htm sin autenticarse, entonces no se habría creado el principal en el contexto de seguridad para cuando haya accedido a la página, de ahí su NullPointerException. Además, ¿estás usando autenticación basada en formularios? ¿Autenticación HTTP BASIC? Algún otro tipo compatible con Acegi?

Cuestiones relacionadas