5

Ho un ResourceServer separato creato utilizzando Spring-Security-oauth2. Ecco il codice RemoteTokenService.Come utilizzare RemoteTokenService?

@Bean 
public ResourceServerTokenServices tokenService() { 
    RemoteTokenServices tokenServices = new RemoteTokenServices(); 
    tokenServices.setClientId("sample_test_client_app"); 
    tokenServices.setClientSecret("secret"); 
    tokenServices.setCheckTokenEndpointUrl("http://localhost:8080/oauth/check_token"); 
    return tokenServices; 
} 

Quando sto accede al server di risorse con access token ottengo il seguente:

FilterSecurityInterceptor - Secure object: FilterInvocation: URL: /oauth/check_token; Attributes: [denyAll()] 
FilterSecurityInterceptor - Previously Authenticated: org.springframew[email protected]c3f3b25: Principal: [email protected]: Username: sample_test_client_app; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Not granted any authorities; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]957e: RemoteIpAddress: 127.0.0.1; SessionId: null; Not granted any authorities 
AffirmativeBased - Voter: org.sp[email protected]6172e10, returned: -1 
ExceptionTranslationFilter - Access is denied (user is not anonymous); delegating to AccessDeniedHandler 

Uno può dirmi che cosa è sbagliato con la mia configurazione?

Aggiornamento: Configurazione di sicurezza My Spring.

@Configuration 
@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 

     auth.inMemoryAuthentication().withUser("developer").password("developer").roles("USER"); 

    } 

    @Override 
    public void configure(WebSecurity web) throws Exception { 
     web.ignoring().antMatchers("/webjars/**", "/images/**", "/oauth/uncache_approvals", "/oauth/cache_approvals"); 
    } 

    @Override 
    @Bean 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
     return super.authenticationManagerBean(); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     // @formatter:off 
       http 
      .authorizeRequests().antMatchers("/login.jsp").permitAll().and() 
      .authorizeRequests().antMatchers("/oauth/check_token").permitAll().and() 
      .authorizeRequests() 
       .anyRequest().hasRole("USER") 
       .and() 
      .exceptionHandling() 
       .accessDeniedPage("/login.jsp?authorization_error=true") 
       .and() 
      .logout() 
       .logoutSuccessUrl("/index.jsp") 
       .logoutUrl("/logout.do") 
       .and() 
      .formLogin(); 
     // @formatter:on 
    } 
} 

Configurazione server My Auth.

@Configuration 
    @EnableAuthorizationServer 
    protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter { 

     @Autowired 
     private TokenStore tokenStore; 

     @Autowired 
     private UserApprovalHandler userApprovalHandler; 

     @Autowired 
     @Qualifier("authenticationManagerBean") 
     private AuthenticationManager authenticationManager; 

     @Override 
     public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
      // @formatter:off 
      clients 
       .inMemory() 
       .withClient("sample_test_client_app") 
       .secret("secret") 
       .authorizedGrantTypes("client_credentials","authorization_code") 
       .authorities("ROLE_CLIENT") 
       .resourceIds(CHANAKYA_RESOURCE_ID) 
       .scopes("read","write"); 

      // @formatter:on 
     } 

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

     @Override 
     public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
      endpoints.tokenStore(tokenStore).userApprovalHandler(userApprovalHandler) 
        .authenticationManager(authenticationManager); 
     } 

     @Override 
     public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { 
      oauthServer.realm("resource_server/client"); 
     } 

    } 
+0

Sembra che tu abbia/check_token protetto con 'denyAll()'. Probabilmente è un errore, ma per poterlo correggere dovresti mostrare il codice che lo ha rotto. –

+0

Grazie mille per questa domanda, ho impiegato ore per trovare una soluzione adeguata :) –

risposta

8

Ho la seguente configurazione:

@Configuration 
@EnableWebSecurity 
@EnableAuthorizationServer 
public class OAuthSecurityConfig extends AuthorizationServerConfigurerAdapter { 
// ... 
    @Override 
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { 
     // (!) 
     oauthServer.allowFormAuthenticationForClients(); 
    } 
// ... 

ho aggiunto la seguente linea:

oauthServer.checkTokenAccess("permitAll()"); 

in linea con "(!)" Per risolvere lo stesso problema.

+0

Questa sarebbe la chiave (è disattivata per impostazione predefinita, credo). Vorrei suggerire che "allowAll()" potrebbe essere un po 'troppo permissivo. Ma è una tua scelta davvero. –

+0

@DaveSyer d'accordo. Ma questo è solo per esempio;) – Alex

+0

@DaveSyer si è disattivato per impostazione predefinita. –

0

Al server di risorse ho un URL protetto ad es. "dati/utenti" a cui si accede solo se l'applicazione "client" ha il ruolo "ROLE_CLIENT". Qui sto usando RemoteTokenService e ho un client configurato su server oauth con ruolo "ROLE_CLIENT" con client_credential grant. Come può il mio cliente accedere a questo URL ???

Tutte le richieste devono includere l'autorizzazione di tipo 'portatore' e token:

> curl "https://localhost:8080/users/me" -H "Pragma: no-cache" -H "Origin: 
> http://localhost:8080" -H "Accept-Encoding: gzip,deflate" -H 
> "Accept-Language: en-US,en;q=0.8,es;q=0.6" -H "Authorization: Bearer 
> f07abd25-af1f-44e2-XXXX-ba5071168XXX" -H "Accept: */*" -H 
> "Cache-Control: no-cache" -H "User-Agent: Mozilla/5.0 (Windows NT 6.1; 
> WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 
> Safari/537.36" -H "Connection: keep-alive" -H "Referer: 
> http://localhost:8080/test.html" --compressed 

come io sto usando RemoteTokenService mio gettone sarà verificata tramite "/ OAuth/check_token" (CheckTokenEndpoint). che non fornisce alcuna informazione sul ruolo del cliente. Quindi, come posso confrontare il ruolo dei clienti.

La sicurezza di primavera ha tutte le informazioni richieste. Tutto quello che devi fare è proteggere il tuo endpoint. Nel mio caso:

@PreAuthorize("hasAnyAuthority('USER_READ')") 

In questo caso solo utente con ruolo 'USER_READ' in grado di ottenere l'accesso al mio punto finale.


Sentitevi liberi di fare altre domande.

+0

grazie per la tua risposta. Come dici tu "In questo caso, solo l'utente con ruolo 'USER_ROLE' può accedere al mio endpoint". in Client_credential l'utente non è presente. è relativo al solo cliente. In tal caso, quando il server delle risorse richiede al server di autorizzazione per l'autenticazione del token, il server outh restituisce solo client_id, il token ha scadenza e gli ambiti di tale client. quindi in tal caso come posso verificare hasAuthority ??? –

+0

@prtk_shah Corretto, le informazioni sui client contengono solo tali informazioni http://pastie.org/9634116 ma le informazioni sui token contengono ulteriori informazioni http://pastie.org/9634123. – Alex

+0

grazie per questo. ma sono un po 'confuso con la tua risposta. puoi spiegarmi questo in modo più dettagliato come posso ottenere ClientAuthority mentre utilizzo la concessione di RemoteTokenService e ClientCredential. e dove prendi il JSON sopra? –