Domanda

ho lottato con questo problema per un po 'ora. Trovato diversi posti su di esso, ma nessuno ha risolto il mio problema. Sarà probabilmente hanno qualcosa a che fare con il fatto che un SecurityContext è boud a un thread specifico, ma anche allora non so come risolverlo:

Si consideri seguente codice per richiamare l'utente che è stato registrato in:

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

L'esecuzione di questo codice in un controller sarebbe tornato (correttamente) l'utente loggato. L'esecuzione di questo codice da una taglib o jsp getta NPE (autenticazione = null). Anche il tag molla non funziona (presumibilmente per la stessa ragione).

Estratto 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>

Estratto dal file di configurazione di sicurezza a molla:

    <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>
È stato utile?

Soluzione

RISOLTO

il problema nasce dalla sequenza di filtro. Il PageFilter (SiteMesh) è stato invocato prima del filtro di sicurezza a molla e per questo il contesto di protezione non era ancora disponibile nel jsp. Cambiare l'ordine dei filtri in web.xml (filtro di sicurezza prima) risolto il problema.

Altri suggerimenti

Questo può sembrare una domanda ovvia, ma avete costretti all'utente di login (cioè autenticare) in qualsiasi momento prima di loro l'accesso alla pagina /myaccount.htm? Non ho visto alcun mapping a una pagina di login che richiede l'accesso anonimo nell'origine definizione di un oggetto ed è per questo che chiedo. Se l'utente può accedere /myaccount.htm senza autenticazione, allora nessun principale sarebbe stato creato nel contesto di protezione dal momento in cui hanno accesso alla pagina, quindi il vostro NullPointerException. Inoltre, si sta utilizzando l'autenticazione basata su form? HTTP l'autenticazione di base? Qualche altro tipo supportato dal Acegi?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top