2016-10-25 5 views
2

Ich verwende Spring Security Oauth1.0a, um Anfragen zu authentifizieren. Es wird erwartet, dass sobald ein Benutzer authentifiziert ist, er/sie die Privilegien erhält, um auf einer Webseite herumzulaufen. Die allererste Zielseite des authentifizierten Benutzers enthält einige js und img's. Seltsam genug, dass beim Laden dieser winzigen Teile einige Dateien erfolgreich mit der richtigen Authentifizierung geladen werden. Aber nach einigen Millisekunden später werden andere winzige Teile aufgrund der Null-Authentifizierung nicht geladen. Beachten Sie, dass meine Servlet-Kontext-/Sitzungs-/Attribut-Listener aktiviert sind. Es wurden keine Änderungen festgestellt.Spring Security: gespeichert SecurityContext hat eine Null-Authentifizierung erhalten

10/24'16 13:44:23> DEBUG [org.springframework.security.web.context.HttpSessionSecurityContextRepository] SecurityContext '[email protected]8eaa51: Authentication: org.springframew[email protected]3f8eaa51: Principal: [email protected]; Credentials: [PROTECTED]; Authenticated: true; Details: null; Granted Authorities: TEACHER' stored to HttpSession: '[email protected] (CLIENT_IP=|USER_ID=|INV_ID=) (http-nio-443-exec-11) [1256269] 

Bis jetzt Sicherheitskontext in der Sitzung wie erwartet gefüllt. Meine angepassten Listener für Kontext/Sitzung/Attributebene haben danach keine Änderungen festgestellt. Alle Debug-Level-Protokolle werden unten ausgedruckt.

10/24'16 13:44:23> DEBUG [org.springframework.security.web.access.ExceptionTranslationFilter] Chain processed normally (CLIENT_IP=|USER_ID=|INV_ID=) (http-nio-443-exec-11) [1256269] 
10/24'16 13:44:23> DEBUG [org.springframework.security.web.context.SecurityContextPersistenceFilter] SecurityContextHolder now cleared, as request processing completed (CLIENT_IP=|USER_ID=|INV_ID=) (http-nio-443-exec-11) [1256269] 
10/24'16 13:44:23> DEBUG [org.springframework.security.web.FilterChainProxy] /home.png at position 1 of 15 in additional filter chain; firing Filter: 'MetadataGeneratorFilter' (CLIENT_IP=|USER_ID=|INV_ID=) (http-nio-443-exec-4) [1256274] 
10/24'16 13:44:23> DEBUG [org.springframework.security.web.FilterChainProxy] /home.png at position 2 of 15 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter' (CLIENT_IP=|USER_ID=|INV_ID=) (http-nio-443-exec-4) [1256274] 
10/24'16 13:44:23> DEBUG [org.springframework.security.web.FilterChainProxy] /home.png at position 3 of 15 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter' (CLIENT_IP=|USER_ID=|INV_ID=) (http-nio-443-exec-4) [1256274] 
10/24'16 13:46:37> DEBUG [org.springframework.security.web.context.HttpSessionSecurityContextRepository] Obtained a valid SecurityContext from SPRING_SECURITY_CONTEXT: '[email protected]ffffff: Null authentication' (CLIENT_IP=|USER_ID=|INV_ID=) (http-nio-443-exec-4) [1391041] 

jedoch debug log zeigen sowohl eine neue Null-Authentifizierung für die Sitzung SPRING_SECURITY_CONTEXT zuzuschreiben. Der Kontext selbst ist nicht null.

Mehr Codierung Details:

//the controller method 
@RequestMapping(value = {"/ssoep.lti.do"}, method = {RequestMethod.GET, RequestMethod.POST}) 
public void ltiEndpoint(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SSOValidationException{ 
    request.getRequestDispatcher("/").forward(request, response); 
} 

//the configuration class 
@EnableWebSecurity 
@Configuration 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

protected void configureOAuth(HttpSecurity http) throws Exception { 
    http 
      .csrf() 
      .disable(); 
    http 
      .addFilterAfter(oauthFilter(), BasicAuthenticationFilter.class) 
      .authorizeRequests() 
      .antMatchers("/ssoep.lti.do*").authenticated(); 
} 

@Bean 
public ProtectedResourceProcessingFilter oauthFilter() { 
    ProtectedResourceProcessingFilter result = new MheOauthProcessingFilter(); 
    result.setAuthHandler(mheUserOauthAuthenticationHandler); 
    result.setConsumerDetailsService(mheOauthConsumerDetailsService); 
    return result; 
} 
} 

ich folgende pom Versionen verwenden.

<spring.version>4.3.2.RELEASE</spring.version> 
<spring.boot.version>1.4.0.RELEASE</spring.boot.version> 
<spring.security.version>4.1.1.RELEASE</spring.security.version> 
<spring.security.oauth.version>2.0.11.RELEASE</spring.security.oauth.version> 
<spring.security.saml2>1.0.2.RELEASE</spring.security.saml2> 

Antwort

0

Wahrscheinlich ist, dass Sie möglicherweise nicht Frühjahr Sicherheitsfilterkette hinzuzufügen haben alle Anfragen

import org.springframework.security.web.context.*; 

public class SecurityWebApplicationInitializer 
    extends AbstractSecurityWebApplicationInitializer { 

    public SecurityWebApplicationInitializer() { 
     super(SecurityConfig.class); 
    } 
} 

http://docs.spring.io/spring-security/site/docs/current/reference/html/jc.html#abstractsecuritywebapplicationinitializer-without-existing-spring

+1

Wie das Protokoll impliziert die Spring Security-Kette war in der ganzen Zeit wirksam. Und die Änderung ausgelöst: java.lang.IllegalStateException: Kontext kann nicht initialisiert werden, da bereits ein Stammanwendungskontext vorhanden ist - prüfen Sie, ob Sie mehrere ContextLoader * -Definitionen in Ihrer web.xml haben! –

0

abfangen Wenn ich in den Code Spring Security Oauth debuggt, OAuthProviderProcessingFilter, fand ich, dass Der Kontext wird immer durch die vorherige Authentifizierung zurückgesetzt. Ich bin nicht sicher, was der Zweck dort ist, und das ist der Hauptgrund meines Verlusts der Authentifizierung.

Der folgende Code zum Überschreiben des Standardverhaltens behebt das Problem.

public class MyOauthProcessingFilter extends ProtectedResourceProcessingFilter { 

    @Override 
    protected void resetPreviousAuthentication(Authentication previousAuthentication) { 
     Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
     if (null != auth && null != auth.getPrincipal()) { 
      return; 
     } 
     super.resetPreviousAuthentication(previousAuthentication); 
    } 

}