ใน Spring Cloud OAUTH2 จำเป็นต้องใช้การรับรองความถูกต้องแบบรวมและการอนุญาตสำหรับไมโครไซต์หลายแห่ง โดยการส่ง grant type บางประเภทไปยัง OAUTH服务สำหรับการตรวจสอบส่วนกลางและการอนุญาตจะได้รับ access_token โทเค็นนี้ได้รับความไว้วางใจจากไมโครเซิร์ตอื่น ๆ เราสามารถใช้ access_token สำหรับการเข้าถึงที่ตามมาดังนั้นจึงตระหนักถึงการรับรองความถูกต้องแบบครบวงจรและการอนุญาตสำหรับ microservices
ตัวอย่างนี้มีสี่ส่วนหลัก:
discovery-service : โมดูลพื้นฐานสำหรับการลงทะเบียนบริการและการค้นพบauth-server : ศูนย์รับรอง OAUTH2 และการอนุมัติorder-service : Microservice ธรรมดาใช้เพื่อตรวจสอบการรับรองความถูกต้องและการอนุญาตapi-gateway : Border Gateway (Microservices ทั้งหมดอยู่ด้านหลัง)บทบาทใน OAUTH2:
Resource Server : ทรัพยากรที่ได้รับอนุญาตให้เข้าถึงAuthotization Server : ศูนย์อนุมัติการรับรอง OAUTH2Resource Owner : ผู้ใช้Client : ลูกค้าที่ใช้ APIs (เช่น Android, iOS, Web Apps)ประเภทเงินทุน:
Authorization Code : ใช้ระหว่างแอปพลิเคชันเซิร์ฟเวอร์Implicit : ใช้ในแอพมือถือหรือเว็บแอพ (แอพเหล่านี้อยู่ในอุปกรณ์ของผู้ใช้เช่นการควบคุม WeChat บนโทรศัพท์มือถือเพื่อตรวจสอบสิทธิ์และอนุญาต)Resource Owner Password Credentials(password) : แอปพลิเคชันได้รับความเชื่อถือโดยตรง (ทั้งหมดพัฒนาโดย บริษัท และตัวอย่างนี้ใช้Client Credentials : ใช้ในการเข้าถึงแอปพลิเคชัน API1. สภาพแวดล้อมพื้นฐาน
ใช้ Postgres เป็นที่เก็บบัญชี Redis เป็นที่เก็บ Token และเริ่ม Postgres และ Redis บนเซิร์ฟเวอร์โดยใช้ docker-compose
Redis: รูปภาพ: Sameersbn/Redis: พอร์ตล่าสุด: - "6379: 6379" เล่ม: -/srv/docker/redis:/var/lib/redis: z รีสตาร์ท: Alwayspostgresql: รีสตาร์ท: ภาพเสมอ: Sameersbn/postgresql: 9.6-2 พอร์ต: - 5432 db_user = wang - db_pass = yunfei - db_name = เล่มคำสั่งซื้อ: -/srv/docker/postgresql:/var/lib/postgreSql: z
2.Auth-Server
2.1 การกำหนดค่าบริการ OAuth2
Redis ใช้เพื่อเก็บ token หลังจากบริการรีสตาร์ทไม่จำเป็นต้องรับ token อีกครั้ง
@configuration @enableauthorizationserverpublic การอนุมัติชั้นเรียนการพิจารณาขยายการอนุมัติการอนุญาตให้ใช้งาน {@autoWired AuthenticationManager AuthenticationManager; @autowired ส่วนตัว redisconnectionFactory ConnectionFactory; @bean สาธารณะ redistokenstore tokenstore () {ส่งคืนใหม่ redistokenstore (ConnectionFactory); } @Override โมฆะสาธารณะการกำหนดค่า (การอนุญาตให้ใช้งานจุดสิ้นสุดจุดสิ้นสุด) พ่นข้อยกเว้น {ปลายทาง. AuthenticationManager (AuthenticationManager) .Tokenstore (Tokenstore ()); } @Override โมฆะสาธารณะการกำหนดค่า (AuthorizationServersecurityCurityCurityCurityCurityCurityCurityCurityCurityCurityCurityCurityCurityCurityCurityCurityCurityCurityCurity } @Override โมฆะสาธารณะการกำหนดค่า (ไคลเอนต์ไดเทอร์สเซอร์ซิคคอนเนอร์ผู้คัดเลือก) พ่นข้อยกเว้น {client.inmemory (). withClient ("Android") .Scopes ("xx") // ขอบเขตที่นี่ .and () .withClient ("WebApp") .Scopes ("XX"). AuthorizedGrantTypes ("โดยปริยาย"); -2.2 การกำหนดค่าบริการทรัพยากร
auth-server ให้ข้อมูลผู้ใช้ดังนั้น auth-server จึงเป็น Resource Server
@Configuration @enableResourceserverpublic คลาสทรัพยากร ResourceserverConfig ขยาย ResourceserverConfigurerAdapter {@Override โมฆะสาธารณะกำหนดค่า (httpsecurity http) โยนข้อยกเว้น {http .csrf (). disable (). Response.SENDERROR (httpservletResponse.sc_unauthorized)). และ () .AuthorizeRequests () .anyRequest (). การรับรองความถูกต้อง (). และ () .httpbasic (); - @RestControllerPublic คลาส userController {@getMapping ("/ผู้ใช้") ผู้ใช้หลักสาธารณะ (ผู้ใช้หลัก) {return user; -2.3 การกำหนดค่าความปลอดภัย
@ConfigurationPublic คลาส SecurityConfig ขยาย WebSecurityConfigurerAdapter {@Bean Public UserDetailsService UserDetailsService () {ส่งคืน DomainUserDetailsService ใหม่ (); } @Bean รหัสผ่านสาธารณะรหัสผ่านรหัสผ่าน () {ส่งคืน bcryptPasswordEncoder ใหม่ (); } @Override Void Protected Configure (AuthenticationManagerBuilder Auth) พ่นข้อยกเว้น {auth .userDetailsService (userDetailsService ()) .passwordEncoder (PasswordEncoder ()); } @Bean SecurityEvaluationContexTension SecurityEvaluationContexTextension () {ส่งคืนความปลอดภัยใหม่ใหม่ CONTEXTEXTENSION (); } // ไม่มีรหัสผ่าน grant_type @Override @Bean AuthenticationManager AuthenticationManagerBean () โยนข้อยกเว้น {return super.authenticationManagerBean (); -2.4 การออกแบบการอนุญาต
การตั้งค่าการอนุญาตบทบาท用户(SysUser)角色(SysRole) Sysrole)权限(SysAuthotity) มี多对多โหลดผู้ใช้และสิทธิ์ผ่าน DomainUserDetailsService
2.5 การกำหนดค่า
สปริง: โปรไฟล์: ใช้งาน: $ {spring_profiles_active: dev} แอปพลิเคชัน: ชื่อ: Auth-Server JPA: Open-in-View: ฐานข้อมูลจริง: PostgreSQL show-sql: true hibernate: ddl-auto: อัปเดต dataSource: แพลตฟอร์ม: postgres url: jdbc: postgresql: //192.1 ชื่อผู้ใช้: รหัสผ่านวัง: Yunfei driver-class-name: org.postgresql.driver redis: โฮสต์: 192.168.1.140server: พอร์ต: 9999eureka: ไคลเอนต์: ServiceUrl: defaultZone: http: // $ {eureka.host:localhost}: $ {eeureka.port: 8761} /eureka/logging.level.org.springframework.security: debuglogging.lev.org.springframework2.6 ข้อมูลทดสอบ
ผู้ใช้สองคนจะเริ่มต้นใน data.sql admin -> ROLE_ADMIN -> query_demo , wyf -> ROLE_USER
3. การให้บริการตามลำดับ
3.1 การกำหนดค่าบริการทรัพยากร
@Configuration @enableResourceserverpublic คลาสทรัพยากร ResourceserverConfig ขยาย ResourceserverConfigurerAdapter {@Override โมฆะสาธารณะกำหนดค่า (httpsecurity http) โยนข้อยกเว้น {http .csrf (). disable (). Response.SENDERROR (httpservletResponse.sc_unauthorized)). และ () .AuthorizeRequests () .anyRequest (). การรับรองความถูกต้อง (). และ () .httpbasic (); -3.2 การกำหนดค่าข้อมูลผู้ใช้
order-service เป็น microservice อย่างง่ายที่ใช้ auth-server สำหรับการตรวจสอบสิทธิ์และการอนุญาต ในไฟล์การกำหนดค่าคุณสามารถระบุข้อมูลผู้ใช้ได้ที่ที่อยู่ auth-server :
ความปลอดภัย: OAUTH2: ทรัพยากร: ID: Order-Service USER-INFO-URI: http: // localhost: 8080/uaa/ผู้ใช้ต้องการ token-info: false
3.3 คอนโทรลเลอร์ทดสอบการอนุญาต
การเข้าถึงสามารถเข้าถึงได้ด้วย authority โดยไม่ต้อง query-demo นั่นคือผู้ใช้งาน admin
@RestControllerPublic คลาส DeMocontroller {@getMapping ("/demo") @preauthorize ("hasauthority ('query-demo')") สตริงสาธารณะ getDemo () {กลับ "ดี"; -4 Api-Gateway
api-gateway มี 2 ฟังก์ชั่นในตัวอย่างนี้:
implicit4.1 ปิด CSRF และเปิดใช้งานการสนับสนุนไคลเอนต์ OAuth2
@configuration @enableoauth2ssopublic คลาส SecurityConfig ขยาย websecurityConfigurerAdapter {@Override void profigure (httpsecurity http) โยนข้อยกเว้น {http.csrf (). disable (); -4.2 การกำหนดค่า
Zuul: เส้นทาง: UAA: Path:/UAA/** SensitiveHeaders: ServiceId: Auth-Server Order: Path:/Order/** SensitiveHeaders: ServiceId: Order-Service Add-Proxy-Headers: Truesecurity: OAuth2: ไคลเอนต์: Access-Token-Uri: HTTP: // localhost: http: // localhost: 8080/uaa/oauth/อนุมัติไคลเอน
5 สาธิต
5.1 การโทรของลูกค้า
ใช้ Postman เพื่อส่งคำขอไปที่ http://localhost:8080/uaa/oauth/token เพื่อรับ access_token (สำหรับผู้ใช้งานเช่น 7f9b54d4-fd25-4a2c-a848-ddf8f119230b )
ผู้ดูแลระบบ
ผู้ใช้ WYF
5.2 การโทร WebApp ใน Api-Gateway
ยังไม่มีการทดสอบและฉันจะเพิ่มพวกเขาในครั้งต่อไป
6 ที่อยู่ซอร์สโค้ด
https://github.com/wiselyman/uaa-zuul
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น