Frage

Ich habe schon seit einiger Zeit mit diesem Problem zu kämpfen. Ich habe mehrere Beiträge darüber gefunden, aber keiner hat mein Problem gelöst. Es wird wahrscheinlich etwas mit der Tatsache zu tun haben, dass ein SecurityContext in einen bestimmten Thread bestraft ist, aber selbst dann weiß ich nicht, wie ich ihn lösen soll:

Erwägen Sie, den Code zu befolgen, um den Benutzer abzurufen, der angemeldet wurde:

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

Das Ausführen dieses Code in einem Controller würde den angemeldeten Benutzer (korrekt) zurückgeben. Ausführen dieses Codes von einem Taglib oder JSP löscht NPE (Authentifizierung = null) aus. Auch das Frühlingsetikett Funktioniert nicht (vermutlich aus dem gleichen Grund).

Auszug aus 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>

Aus der Spring Security Config -Datei extrahieren:

    <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>
War es hilfreich?

Lösung

AUFGELÖST

Das Problem ergab sich aus der Filtersequenz. Der PageFilter (Sitemesh) wurde vor dem Frühlingssicherheitsfilter aufgerufen, und aus diesem Grund war der Sicherheitskontext im JSP noch nicht verfügbar. Das Ändern der Reihenfolge der Filter in Web.xml (Sicherheitsfilter zuerst) hat das Problem behoben.

Andere Tipps

Dies mag eine offensichtliche Frage erscheint, aber haben Sie den Benutzer gezwungen, sich zu einem bestimmten Zeitpunkt vor dem Zugriff auf die Seite /myAccount.htm zu einem bestimmten Zeitpunkt gezwungen zu haben? Ich habe keine Zuordnungen zu einer Anmeldeseite gesehen, die in Ihrer Objektdefinitionsquelle einen anonymen Zugriff erfordert, weshalb ich frage. Wenn der Benutzer ohne Authentifizierung auf /myaccount.htm zugreifen kann, wäre im Sicherheitskontext kein Auftraggeber erstellt worden, als er auf die Seite zugegriffen hat, daher Ihre NullPointerexception. Verwenden Sie auch eine formbasierte Authentifizierung? Http grundlegende Authentifizierung? Ein anderer Typ, der von Acegi unterstützt wird?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top