2017-05-16 1 views
9

Hallo Ich habe eine Web-Anwendung mit Spring-Sicherheit gesichert, mit einer Login-Seite. Dies ist meine SicherheitskonfigurationSpring OAUTH - anderer Login für Web e REST

Dies funktioniert gut, indem Sie alle meine Webanwendung sichern.

In der gleichen Anwendung habe ich auch eine Ressource/Authorization Server zum Schutz einiger REST API.

Einige Ressourcen sind mit einem Berechtigungscode geschützt, daher sollte die nicht vertrauenswürdige Mobile App das Zugriffstoken von meiner Anwendung mit einem Anmeldeformular übernehmen. Ich möchte, dass die Anwendung eine andere Anmeldeseite verwendet, wenn sie versucht, sich von der Mobile App aus anzumelden.

Dies ist meine resourceServer Konfiguration

@EnableResourceServer 
@ComponentScan("it.besmart.easyparking") 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class ResourceServerConfig { 

    private final Logger logger = LoggerFactory.getLogger(ResourceServerConfig.class); 

    @Autowired 
    DataSource dataSource; 

    private static final String RESOURCE_ID = "easyparking_api"; 

    @Configuration 
    // @Order(2) 
    public class grantCredentialsConfiguration extends ResourceServerConfigurerAdapter { 
     @Override 
     public void configure(HttpSecurity http) throws Exception { 
      logger.debug("Api security configured"); 

      http 

        .requestMatchers().antMatchers("/api/oauth/**").and().authorizeRequests() 
        .antMatchers("/api/oauth/**").access("hasRole('USER')").and().formLogin().loginPage("/apilogin") 
        .permitAll(); 
     } 

     @Override 
     public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 

      resources.tokenStore(tokenStore()).resourceId(RESOURCE_ID); 
     } 
    } 

    @Configuration 
    // @Order(4) 
    public class clientCredentialsConfiguration extends ResourceServerConfigurerAdapter { 
     @Override 
     public void configure(HttpSecurity http) throws Exception { 
      logger.debug("Client security configured"); 
      http 
        .requestMatchers().antMatchers("/oauth2/**", "/api/registration", "/api/park/**").and() 
        .authorizeRequests().antMatchers("/oauth2/**", "/api/registration", "/api/park/**").authenticated(); 
     } 

     @Override 
     public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 

      resources.tokenStore(tokenStore()).resourceId(RESOURCE_ID); 
     } 
    } 

    @Bean 
    public TokenStore tokenStore() { 
     return new JdbcTokenStore(dataSource); 
    } 

} 

so, grantCredentialsConfiguration sollten die Anforderungen an/apilogin Form umleiten, aber es funktioniert nicht, bin ich auf die wichtigsten Web-App-Anmeldeseite weitergeleitet ... Wie es sein kann, vollbracht?

EDIT

Bei näherer Betrachtung in die Protokolle, sieht es so aus, dass, wenn ich versuche,/zu treffen oauth/genehmigen/die normale Sicherheitskette stattfindet, und ich bekommt

2017-05-25 12:23:15 DEBUG o.s.security.web.FilterChainProxy[310] - /oauth/authorize?response_type=token&client_id=test&redirect_uri=https://www.getpostman.com/oauth2/callback reached end of additional filter chain; proceeding with original chain 
2017-05-25 12:23:15 DEBUG o.s.s.o.p.e.FrameworkEndpointHandlerMapping[310] - Looking up handler method for path /oauth/authorize 
2017-05-25 12:23:15 DEBUG o.s.s.o.p.e.FrameworkEndpointHandlerMapping[317] - Returning handler method [public org.springframework.web.servlet.ModelAndView org.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint.authorize(java.util.Map<java.lang.String, java.lang.Object>,java.util.Map<java.lang.String, java.lang.String>,org.springframework.web.bind.support.SessionStatus,java.security.Principal)] 
2017-05-25 12:23:15 DEBUG o.s.s.w.a.ExceptionTranslationFilter[163] - Authentication exception occurred; redirecting to authentication entry point 
org.springframework.security.authentication.InsufficientAuthenticationException: User must be authenticated with Spring Security before authorization can be completed. 

So sieht es aus wie nach einem Handler zu suchen, um die Anfrage zu verwalten, anstatt nach/api/apfilogin wie gewünscht umzuleiten, findet er eine Authentication exception und so gehe ich auf die Standard-Login-Seite ... Aber warum bekomme ich diese Ausnahme?

Antwort

0

Haben Sie URL-Pfad /apilogin, zum

.antMatchers("/", "/register", "/registrationConfirm",/resendRegistrationToken", "/park/**") 
.permitAll() 

Ich vermute, die Anwendung Umleitung wird die/apilogin Zugriff auf die gemeinsame Authentifizierung Login-Seite versucht, indem, da es nicht auf die nicht-autorisierte Zugriffsliste hinzugefügt wird.

+0

Dank für die Antwort, ich versuchte, aber ich weiterhin auf die Web-App-Anmeldeseite umgeleitet werden soll, wird apilogin nie – besmart

0

Es passiert, weil Sie die Reihenfolge der Sicherheitskonfigurationsklassen nicht angegeben haben.

Im Frühjahr Sicherheitsschutz Ressourcen sollten von spezifischen für generische erwähnt werden.

Klasse SecurityConfiguration ist generischer als grantCredentialsConfiguration. Da beide folgende Ressourcen schützen.

  • SecurityConfiguration schützt /** (Default URL)
  • grantCredentialsConfiguration /api/oauth/**

Da die Reihenfolge nicht definiert ist, SecurityConfiguration ‚s allgemeine Konfiguration versteckt die spezifische Konfiguration von grantCredentialsConfiguration

Um diese an die Arbeit Wie erwartet, müssen Sie die Reihenfolge wie folgt definieren.

@Configuration 
@Order(2)//Generic config should have larger value (lower priority) 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{ 
} 

@Configuration 
@Order(1)//Specific with lower value (higher priority) 
public class grantCredentialsConfiguration extends ResourceServerConfigurerAdapter { 

} 

Hinweis: Da diese Login-Seiten nicht aus verschiedenen Anwendungen sind, sie teilen sich die SecurityContextHolder oder den Sicherheitskontext. Wenn Sie sich also von einer Anmeldeseite aus anmelden und dann versuchen, die geschützte Ressource der anderen Seite aufzurufen, werden Sie nicht zur nächsten Anmeldeseite weitergeleitet. Stattdessen erhalten Sie den 403 (abhängig von den Rollen, die auf den verschiedenen Anmeldeseiten zugewiesen sind). Zu einem Zeitpunkt kann nur eine Login-Sitzung aufrechterhalten werden.

Hier ist eine Probe auf Github

https://github.com/ConsciousObserver/TestMultipleLoginPages.git

+0

Danke für die Erklärung berücksichtigt , ich setze die Orders meiner Konfigurationen, aber ich werde immer noch auf die Hauptanmeldeseite umgeleitet, wenn ich versuche, auf/api/oauth resources zuzugreifen ... – besmart

+0

Probiere das Beispiel-GitHub-Projekt, das ich verlinkt habe, vergleiche die Unterschiede. – 11thdimension

+0

versucht, das Beispiel funktioniert, mein Nein ... Ich denke, der Unterschied ist, weil das Beispiel zwei 'WebSecurityConfigurerAdapter' verwendet, während ich versuche, einen' WebSecurityConfigurerAdapter' und einen 'ResourceServerConfigurerAdapter' – besmart