Question

J'ai été aux prises avec ce problème un peu de temps maintenant. Trouvé plusieurs messages à ce sujet, mais pas résolu mon problème. Il faudra sans doute quelque chose à voir avec le fait qu'un SecurityContext est boud à un fil spécifique, mais même alors, je ne sais pas comment le résoudre:

Considérez le code suivant pour récupérer l'utilisateur qui a été connecté:

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

L'exécution de ce code dans un contrôleur retournerait (correctement) l'utilisateur connecté. L'exécution de ce code d'un taglib ou jsp lance NPE (authentification = null). Aussi la balise printemps ne fonctionne pas (sans doute pour la même raison).

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

Extrait du fichier de configuration de sécurité du printemps:

    <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>
Était-ce utile?

La solution

RÉSOLU

le problème se pose de la séquence du filtre. Le PageFilter (SiteMesh) a été invoqué avant que le filtre de sécurité du printemps et de ce contexte de sécurité était pas encore disponible dans le jsp. Modification de l'ordre des filtres dans web.xml (premier filtre de sécurité) fixe la question.

Autres conseils

Cela peut sembler une question évidente, mais avez-vous contraint l'utilisateur à se connecter (c.-à-authentifiez) à tout moment avant leur accès au /myaccount.htm page? Je ne vois pas de correspondances à une page de connexion nécessitant un accès anonyme dans votre source de définition d'objet qui est la raison pour laquelle je demande. Si l'utilisateur peut accéder /myaccount.htm sans authentification, aucune principale aurait été créé dans le contexte de la sécurité au moment où ils ont accédé à la page, d'où votre NullPointerException. En outre, vous utilisez l'authentification par formulaire? l'authentification HTTP de base? Un autre type pris en charge par Acegi?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top