Di Spring Cloud OAUTH2 diperlukan untuk mengimplementasikan otentikasi dan otorisasi terpadu untuk banyak layanan microser. Dengan mengirimkan jenis grant type tertentu ke OAUTH服务untuk otentikasi dan otorisasi pusat, access_token diperoleh. Token ini dipercaya oleh layanan mikro lainnya. Kita dapat menggunakan access_token untuk akses selanjutnya, sehingga mewujudkan otentikasi dan otorisasi terpadu untuk layanan mikro.
Contoh ini memberikan empat bagian utama:
discovery-service : Modul Dasar untuk Pendaftaran dan Penemuan Layananauth-server : Pusat Sertifikasi dan Otorisasi OAuth2order-service : Layanan Mikro biasa, digunakan untuk memverifikasi otentikasi dan otorisasiapi-gateway : Border Gateway (semua layanan mikro ada di belakangnya)Peran dalam OAuth2:
Resource Server : Sumber Daya Diizinkan untuk MengaksesAuthotization Server : Pusat Otorisasi Sertifikasi OAuth2Resource Owner : PenggunaClient : Klien Menggunakan API (seperti Android, iOS, Aplikasi Web)Jenis hibah:
Authorization Code : Digunakan Antara Aplikasi ServerImplicit : Digunakan dalam aplikasi seluler atau aplikasi web (aplikasi ini ada di perangkat pengguna, seperti mengatur WeChat di ponsel untuk mengotentikasi dan mengotorisasi)Resource Owner Password Credentials(password) : Aplikasi ini secara langsung dipercaya (semua dikembangkan oleh perusahaan, dan contoh ini digunakanClient Credentials : Digunakan dalam Akses API Aplikasi.1. Lingkungan Dasar
Gunakan Postgres sebagai penyimpanan akun, Redis sebagai penyimpanan Token , dan mulai Postgres dan Redis di server menggunakan docker-compose .
Redis: Gambar: Sameersbn/Redis: Port terbaru: - "6379: 6379" Volume: -/srv/docker/redis:/var/lib/redis: z restart: selalu postgresql: restart: selalu gambar: sameersbn/postgresql: 9.6-2 ports: -"5432: -5432: -5432: -543: -542: -543: -543: -543: -543: -543: -543: -543: -543: -543: -543: -543: -543: -543: -543: -543: -543: -543: -543: -543: -543: -543: -543 - db_pass = yunfei - db_name = volume pesanan: -/srv/docker/postgresql:/var/lib/postgresql: z
2.Auth-Server
2.1 Konfigurasi Layanan OAuth2
Redis digunakan untuk menyimpan token . Setelah layanan restart, tidak perlu mendapatkan kembali token .
@Configuration @enableAuthorizationServerPublic kelas otorisasiServerConfig memperluas otorisasiServerConfigurerAdapter {@Autowired Private AuthenticationManager AuthenticationManager; @Autowired Private RedisconnectionFactory ConnectionFactory; @Bean public redistokenstore tokenStore () {return new redistokenstore (connectionFactory); } @Override public void configure (OtorisasiServerEndPointSconfigurer Endpoints) melempar Exception {endpoints .AuthenticationManager (AuthenticationManager) .TokenStore (TokenStore ()); } @Override public void configure (otorizationserverSecurity Configurer Security) melempar Exception {Security .tokenKeKeKeAccess ("leverall ()") .CheckTokenAccess ("isAuthenticated ()"); } @Override public void configure (clientDetailsServiceConfigurer klien) melempar pengecualian {client.inmemory () .withclient ("android") .scopes ("xx") // scopes di sini tidak berguna, Anda dapat menetapkan .secret ("android") .AuthorizedGrantePesePes ("SKORDE" "dan outhrant (" android ") .Authreshrant (" Android ") .Authrant (" Android ") .Authrant (" Android "(" android ") .AuthRANSEZED (" Android "(" android ") .Authrant" .and () .withclient ("webapp") .scopes ("xx") .AuthorizedGrantTypes ("Implicit"); }}2.2 Konfigurasi Layanan Sumber Daya
auth-server Memberikan Informasi Pengguna, jadi auth-server juga merupakan Resource Server
@Configuration @enableReSourCeServerPublic kelas sumber daya serverFig memperluas sumber daya serverconfigurerAdapter {@Override public void configure (httpsecurity http) melempar Exception {http .csrf (). Disable (). ExceptionHandling () .AuthenticationEntRy (). Disable (). ExceptionHandling () .AthentryEntry (). DISABLE (). ExceptionHandling () .AuthentryEntry (). DISABLE (). ExceptionHandling () .Authentrry (). response.senderror (httpservletResponse.sc_unauthorized)) .and () .Authorizerequests () .AnyRequest (). Authenticated () .and () .httpbasic (); }} @RestControllerPublic kelas UserController {@getMapping ("/user") pengguna utama publik (pengguna utama) {return user; }}2.3 Konfigurasi Keamanan
@ConfigurationPublic Class SecurityConfig memperluas WebSecurityConfigurerAdapter {@Bean UserDetailsService UserDetailSService () {return new domainuserDetailsService (); } @Bean Public PasswordEncoder PasswordEncoder () {return bcryptpasswordEncoder baru (); } @Override Protected void configure (authenticationManagerBuilder auth) melempar Exception {auth .userDetailsService (userDetailsService ()) .passwordEncoder (kata sandi ()); } @Bean Public SecurityEvaluationContextension SecurityEvaluationContextExtension () {return New SecurityEvaluationContextExtension (); } // Tidak ada kata sandi hibah_type @Override @Bean AuthenticationManager authenticationManagerBean () melempar Exception {return super.authenticationManagerBean (); }}2.4 Desain Izin
Pengaturan Peran用户(SysUser)角色(SysRole) Sysrole)权限(SysAuthotity) adalah多对多. Muat pengguna dan izin melalui DomainUserDetailsService .
2.5 Konfigurasi
Spring: Profil: Aktif: $ {spring_profiles_active: dev} Aplikasi: Nama: AUTH-Server JPA: Open-in-View: True Database: PostgreSQL Show-SQL: True Hibernate: DDL-Auto: Update DataSource: PATPLATE: POSTGRES URL: JDBC: POSTGRESQL:/AUTION2:/PATPLATEM: POSTGRES: JDBC: POSTGRESQL://POSTREN2.1.14.14.14.12 Kata Sandi Wang: Yunfei-driver-Class-name: org.postgresql.driver redis: host: 192.168.1.140Server: port: 9999eureka: klien: serviceUrl: defaultzone: http: // $ {eureka.host:localhost}: $ {eureka.port: 8761} /eureka/logging.level.org.springframework.2.6 Data uji
Dua pengguna diinisialisasi dalam data.sql admin -> ROLE_ADMIN -> query_demo , wyf -> ROLE_USER
3. Urutan-Layanan
3.1 Konfigurasi Layanan Sumber Daya
@Configuration @enableReSourCeServerPublic kelas sumber daya serverFig memperluas sumber daya serverconfigurerAdapter {@Override public void configure (httpsecurity http) melempar Exception {http .csrf (). Disable (). ExceptionHandling () .AuthenticationEntRy (). Disable (). ExceptionHandling () .AthentryEntry (). DISABLE (). ExceptionHandling () .AuthentryEntry (). DISABLE (). ExceptionHandling () .Authentrry (). response.senderror (httpservletResponse.sc_unauthorized)) .and () .Authorizerequests () .AnyRequest (). Authenticated () .and () .httpbasic (); }}3.2 Konfigurasi Informasi Pengguna
order-service adalah layanan mikro sederhana yang menggunakan auth-server untuk otentikasi dan otorisasi. Dalam file konfigurasinya, Anda dapat menentukan informasi pengguna di alamat auth-server :
Keamanan: OAuth2: Sumber Daya: ID: Usaha pesanan-User-Info-Uuri: http: // localhost: 8080/uaa/pengguna preferensi-ke-info: false
3.3 Pengontrol Tes Izin
Akses dapat diakses dengan authority tanpa query-demo , yaitu, pengguna admin
@RestControllerPublic kelas democontroller {@getMapping ("/demo") @preauthorize ("hasAuthority ('query-demo')") string publik getDemo () {return "good"; }}4 Api-Gateway
api-gateway memiliki 2 fungsi dalam contoh ini:
implicit4.1 Matikan CSRF dan Aktifkan Dukungan Klien OAuth2
@Configuration @enableOouth2ssopublic Class SecurityConfig Extends WebSecurityConfigurerAdapter {@Override void configure (httpsecurity http) melempar Exception {http.csrf (). Disable (); }}4.2 Konfigurasi
zuul: routes: uaa: path: /uaa/** sensitiveHeaders: serviceId: auth-server order: path: /order/** sensitiveHeaders: serviceId: order-service add-proxy-headers: truesecurity: oauth2: client: access-token-uri: http://localhost:8080/uaa/oauth/token user-authorization-uri: http: // localhost: 8080/uaa/oauth/otorisasi klien-id: Webapp Sumber Daya: Pengguna-Info-URI: http: // localhost: 8080/uaa/pengguna preferensi-ke-info: false
5 demo
5.1 Panggilan Klien
Gunakan Postman untuk mengirim permintaan ke http://localhost:8080/uaa/oauth/token untuk mendapatkan access_token (untuk pengguna admin, seperti 7f9b54d4-fd25-4a2c-a848-ddf8f119230b )
Pengguna Admin
Pengguna WYF
5.2 Panggilan Webapp di API-Gateway
Belum ada tes yang dilakukan, dan saya akan menambahkannya lain kali.
6 Alamat Kode Sumber
https://github.com/wiselyman/uaa-zuul
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.