OAuth2 - @EnableResourceServer vs @ EnableOAuth2Sso

1. Übersicht

In diesem Tutorial werden wir uns mit den Annotationen @EnableResourceServer und @ EnableOAuth2Sso in Spring Security befassen .

Zunächst werden die Unterschiede zwischen einem OAuth2- Client und einem OAuth2- Ressourcenserver erläutert . 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 von Zuul und einer einfachen API demonstrieren .

Für den Zweck dieses Artikels gehen wir von bereits vorhandenen Erfahrungen mit Zuul und OAuth2 aus .

Wenn Sie keine haben oder der Meinung sind, dass eine Überprüfung einer der beiden hilfreich wäre , lesen Sie bitte unsere Kurzübersicht über Zuul und unseren Leitfaden zu OAuth2 .

2. OAuth2-Client und Ressourcenserver

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

  • Ressourcenbesitzer - eine Entität, die Zugriff auf ihre geschützten Ressourcen gewähren kann
  • Autorisierungsserver - gewährt Zugriffstoken zu Kunden nacherfolgreichen Authentifizierung Ressource Management undErhalt ihrer Zulassung
  • Ressourcenserver - Eine Komponente, für die ein Zugriffstoken erforderlich ist, um den Zugriff auf ihre Ressourcen zu ermöglichen oder zumindest in Betracht zu ziehen
  • 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.

Die Annotation @EnableResourceServer ermöglicht es unserer Anwendung, sich als Ressourcenserver zu verhalten, indem ein OAuth2AuthenticationProcessingFilter und andere gleich wichtige Komponenten konfiguriert werden .

Schauen Sie sich die ResourceServerSecurityConfigurer- Klasse an, um eine bessere Vorstellung davon zu erhalten, was hinter den Kulissen konfiguriert wird.

Im Gegensatz dazu die @ EnableOAuth2Sso verwandelt Anmerkung unsere Anwendung in eine OAuth2 Client . Es weist Spring an, einen OAuth2ClientAuthenticationProcessingFilter zusammen mit anderen Komponenten zu konfigurieren , damit unsere Anwendung Zugriffstoken von einem Autorisierungsserver erhalten kann.

In der SsoSecurityConfigurer- Klasse finden Sie weitere Informationen zur Konfiguration von Spring für uns.

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

  • Unsere erste Anwendung wird unser Randknoten sein , eine einfache Zuul- Anwendung, die die Annotation @ EnableOAuth2Sso verwendet . Es wird für die Authentifizierung von Benutzern verantwortlich sein (mit Hilfe eines Authorization Server ) und eingehende Anfragen an andere Anwendungen übertragen
  • Die zweite Anwendung verwendet die Annotation @EnableResourceServer und ermöglicht den Zugriff auf geschützte Ressourcen, wenn die eingehenden Anforderungen ein gültiges OAuth2-Zugriffstoken enthalten

3. Zuul - @ EnableOAuth2Sso

Beginnen wir durch die Schaffung eines Zuul Anwendung, die als unsere Randknoten fungieren soll und wird für die Authentifizierung von Benutzern mit Hilfe eines OAuth2 verantwortlich sein Authorization Server :

@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 das Kommentieren unserer Zuul- Anwendung mit @ EnableOAuth2Sso wird Spring auch benachrichtigt, einen OAuth2TokenRelayFilter- Filter zu konfigurieren . Dieser Filter ruft zuvor erhaltene Zugriffstoken aus den HTTP-Sitzungen der Benutzer ab und gibt sie nachgelagert weiter.

Beachten Sie, dass wir auch die Verwendung von @Order Annotation in unserer AppConfiguration Konfigurationsklasse. Dies ist , um sicherzustellen , dass Filter von unserem erstellt WebSecurityConfigurerAdapter hat Vorrang vor Filter von anderen erstellt WebSecurityConfigurerAdapters .

Beispielsweise könnten wir unsere Zuul- Anwendung mit @EnableResourceServer versehen , um sowohl HTTP-Sitzungskennungen als auch OAuth2-Zugriffstoken zu unterstützen. Dadurch werden jedoch neue Filter erstellt , die standardmäßig Vorrang vor den von der AppConfiguration- Klasse erstellten Filtern haben . Dies geschieht , weil ResouceServerConfiguration , eine Klassen - Konfiguration durch ausgelöst @EnableResourceServer , eine Standard spezifiziert Reihenfolge von 3 während WebSecurityConfigureAdapter eine Standard hat , um von 100.

Bevor wir auf unseren Ressourcenserver wechseln , 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: //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 unsere Zuul- Routen und sagen Sie, welche Header hinzugefügt / entfernt werden sollen, bevor Sie Anfragen nachgelagert senden.
  • Einige OAuth2 Eigenschaften für unsere Anwendung Einstellung der Lage sein , mit unserer Kommunikation Authorization Server und Konfigurieren von JWT mit symmetrischer Verschlüsselung.

4. API - @EnableResourceServer

Nun , da wir unsere haben Zuul Anwendung an Ort und Stelle, lassen Sie uns erstellen unsere Ressource - Server :

@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 den Namen des Principals zurückzugeben , der die Anforderung initiiert hat.

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, dass wir einen gültigen Zugang benötigen Token (die in der HTTP - Sitzung des Benutzers in unserem Randknoten gespeichert ist) den Endpunkt unserer für den Zugriff auf Ressourcen - Server .

5. Schlussfolgerung

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

Die vollständige Implementierung dieses Beispiels finden Sie auf Github.

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