OAuth2 - @EnableResourceServer vs @ EnableOAuth2Sso

OAuth2 - @EnableResourceServer vs @ EnableOAuth2Sso

1. Überblick

In diesem Tutorial werden wir uns mit den Anmerkungen@EnableResourceServer und@EnableOAuth2Ssoin Spring Security befassen.

Wir beginnen mit der Erläuterung derdifferences between an OAuth2 Client and an OAuth2 Resource Server. Anschließend werden wir ein wenig darüber sprechen, was diese Anmerkungen für uns tun können, und ihre Verwendung anhand eines Beispiels unter Verwendung vonZuul und einer einfachen API demonstrieren.

Für den Zweck dieses Artikels gehen wir von bereits vorhandenen Erfahrungen mitZuul undOAuth2 aus.

Wenn Sie keine haben oder der Meinung sind, dass eine Überprüfung einer der beiden hilfreich wäre, lesen Sie bitte unserequick overview on Zuul und unsereguide to OAuth2.

2. OAuth2-Client und -Ressourcenserver

Es gibt vier verschiedeneroles in OAuth2, die wir berücksichtigen müssen:

  • Resource Owner - eine Entität, die Zugriff auf ihre geschützten Ressourcen gewähren kann

  • Authorization Server - GewährtClients Zugriffstoken, nachdemResourceOwners erfolgreich authentifiziert und ihre Autorisierung erhalten wurden

  • Resource Server - eine Komponente, für die ein Zugriffstoken erforderlich ist, um den Zugriff auf ihre Ressourcen zu ermöglichen oder zumindest zu berücksichtigen

  • Client - eine Entität, die Zugriffstoken von Autorisierungsservern erhalten kann

Durch Annotieren unserer Konfigurationsklasse mit@EnableResourceServer oder@EnableOAuth2Sso wird Spring angewiesen, Komponenten zu konfigurieren, die unsere Anwendung in eine der beiden oben genannten Rollen umwandeln.

The @EnableResourceServer annotation enables our application to behave as a Resource Server durch Konfigurieren vonOAuth2AuthenticationProcessingFilter und anderen gleich wichtigen Komponenten.

Schauen Sie sich die KlasseResourceServerSecurityConfigureran, um eine bessere Vorstellung davon zu bekommen, was hinter den Kulissen konfiguriert wird.

Umgekehrt istthe @EnableOAuth2Sso annotation transforms our application into an OAuth2 client. Es weist Spring an, einOAuth2ClientAuthenticationProcessingFilter zusammen mit anderen Komponenten zu konfigurieren, damit unsere Anwendung Zugriffstoken von einem Autorisierungsserver erhalten kann.

Schauen Sie sich die KlasseSsoSecurityConfigureran, um weitere Informationen darüber zu erhalten, was Spring für uns konfiguriert.

Durch die Kombination dieser Anmerkungen mit einigen Eigenschaften können wir die Dinge schnell zum Laufen bringen. Erstellen wir zwei verschiedene Anwendungen, um sie in Aktion zu sehen und wie sie sich ergänzen können:

  • Unsere erste Anwendung wird unser Randknoten sein, eine einfacheZuul-Anwendung, die die@EnableOAuth2Sso-Anmerkung verwendet. Es ist verantwortlich für die Authentifizierung von Benutzern (mithilfe vonAuthorizationServer) und die Delegierung eingehender Anforderungen an andere Anwendungen

  • Die zweite Anwendung verwendet die Annotation@EnableResourceServerund ermöglicht den Zugriff auf geschützte Ressourcen, wenn die eingehenden Anforderungen ein gültiges OAuth2-Zugriffstoken enthalten

3. Zuul -@EnableOAuth2Sso

Beginnen wir mit der Erstellung einerZuul-Anwendung, die als unser Randknoten fungiert und für die Authentifizierung von Benutzern mithilfe eines OAuth2AuthorizationServer verantwortlich ist:

@Configuration
@EnableZuulProxy
@EnableOAuth2Sso
@Order(value = 0)
public class AppConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private ResourceServerTokenServices
      resourceServerTokenServices;

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/authorization-server-1/**",
              "/login").permitAll()
            .anyRequest().authenticated().and()
            .logout().permitAll().logoutSuccessUrl("/");
    }
}

Durch Annotieren unsererZuul-Anwendung mit@EnableOAuth2Sso wird Spring auch benachrichtigt, einenOAuth2TokenRelayFilter-Filter zu konfigurieren. Dieser Filter ruft zuvor erhaltene Zugriffstoken aus den HTTP-Sitzungen der Benutzer ab und leitet sie weiter.

Beachten Sie, dass wir auch die Annotation@Orderin unserer KonfigurationsklasseAppConfigurationverwenden. Dies soll sicherstellen, dassFilters, die von unserenWebSecurityConfigurerAdaptererstellt wurden, Vorrang vorFiltershaben, die von anderenWebSecurityConfigurerAdapterserstellt wurden.

Beispielsweise könnten wir unsereZuul-Anwendung mit@EnableResourceServer versehen, um sowohl HTTP-Sitzungskennungen als auch OAuth2-Zugriffstoken zu unterstützen. Dadurch werden jedoch neueFilterserstellt, die standardmäßig Vorrang vor denen haben, die von der KlasseAppConfigurationerstellt wurden. Dies liegt daran, dassResouceServerConfiguration, eine durch@EnableResourceServer ausgelöste Konfigurationsklasse, einen Standardwert vonorder von 3 angibt, währendWebSecurityConfigureAdapter einen Standardwert vonorder von 100 hat.

Bevor wir zuResourceServer, übergehen, müssen wir einige Eigenschaften konfigurieren:

zuul:
  routes:
    resource-server-mvc-1: /resource-server-mvc-1/**
    authorization-server-1:
      sensitiveHeaders: Authorization
      path: /authorization-server-1/**
      stripPrefix: false
  add-proxy-headers: true

security:
  basic:
    enabled: false
  oauth2:
    sso:
      loginPath: /login
    client:
      accessTokenUri: http://localhost:8769/authorization-server-1/oauth/token
      userAuthorizationUri: /authorization-server-1/oauth/authorize
      clientId: fooClient
      clientSecret: fooSecret
    resource:
      jwt:
        keyValue: "abc"
      id: fooScope
      serviceId: ${PREFIX:}resource

Ohne zu sehr ins Detail zu gehen, sind wir mit dieser Konfiguration:

  • Konfigurieren Sie die Routen unsererZuulund geben Sie an, welche Header hinzugefügt / entfernt werden sollen, bevor Anforderungen nachgeschaltet werden.

  • Festlegen einiger OAuth2-Eigenschaften für unsere Anwendung, um mitAuthorizationServer kommunizieren zu können, und Konfigurieren vonJWT mitsymmetric-Verschlüsselung.

4. API -@EnableResourceServer

Nachdem wir unsereZuul-Anwendung eingerichtet haben, erstellen wir unsereResourceServer:

@SpringBootApplication
@EnableResourceServer
@Controller
@RequestMapping("/")
class ResourceServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ResourceServerApplication.class, args);
    }

    @RequestMapping(method = RequestMethod.GET)
    @ResponseBody
    public String helloWorld(Principal principal) {
        return "Hello " + principal.getName();
    }
}

Es ist eine einfache Anwendung, die einen einzelnen Endpunkt verfügbar macht, um diename derPrincipal zurückzugeben, die die Anforderung initiiert haben.

Lassen Sie uns zum Abschluss einige Eigenschaften konfigurieren:

security:
  basic:
    enabled: false
  oauth2:
    resource:
      jwt:
        keyValue: "abc"
      id: fooScope
      service-id: ${PREFIX:}resource

Beachten Sie, dasswe need a valid access token (das in der HTTP-Sitzung des Benutzers in unserem Randknoten gespeichert ist)to access the endpoint of our Resource Server.

5. Fazit

In diesem Artikel haben wir die Unterschiede zwischen den Anmerkungen@EnableOAuth2Sso und@EnableResourceServer erläutert. Wir haben auch anhand eines praktischen Beispiels mitZuul und einer einfachen API gezeigt, wie man sie verwendet.

Die vollständige Implementierung dieses Beispiels finden Sie inover on Github.

Bei lokaler Ausführung können wir die Anwendung beihttp://192.168.1.67:8765/resource-server-mvc-1 ausführen und testen