So'z boshi
Mikroservislardan iborat API-ni taqdim qilishda e'tiborga olish kerak bo'lgan eng muhim jihatlardan biri bu xavfsizlikdir. Springni ba'zi qiziqarli xususiyatlari va frameworklari bor, bu bizning mikroservislarimiz xavfsizligini sozlashni osonlashtiradi. Ushbu maqolada sizga API shlyuzini token orqali himoyalash uchun Spring Cloud va OAuth2dan qanday foydalanishni ko'rsataman.
Nazariya
OAuth2 standarti hozirda umumiy API orqali o'z manbalariga kirishga imkon beradigan barcha yirik veb-saytlar tomonidan qo'llaniladi. Bu foydalanuvchilarga bir sahifada saqlangan shaxsiy manbalarini boshqa sahifaga authenticatsiya xizmatiga o'tmasdan ulashishga imkon beruvchi ochiq avtorizatsiya standarti. OAuth 2 bilan bog'liq asosiy atamalar.
- Resource Owner - resursga kirishni taqiqlash
-
Resource Server - maxsus token yordamida taqdim etililishi mumkin bo'lgan
owner
resurslarini saqlaydigan server -
Authorization Server -
key
larni,token
larni va boshqa vaqtinchalik resurslarga kirish kodlarini ajratishni boshqaradi. Shuningdek, u tegishli shaxsga ruxsat berilishini ta'minlashi kerak - Access Token - manbaga kirishga imkon beruvchi kalit
- Authorization Grant - kirish uchun ruxsat beradi. Kirish huquqini tasdiqlashning turli xil usullari mavjud: avtorizatsiya kodi, yopiq, manbalar egasining parol ma'lumotlari va mijoz ma'lumotlari
Siz ushbu standart haqida ko'proq ma'lumotni bu erda va bu digitalocean maqolasida o'qishingiz mumkin. Ushbu protokolning ketma-ketligi uchta asosiy bosqichdan iborat. Dastlab avtorizatsiya so'rovi resource ownerga yuboriladi. Resource ownerning javobidan so'ng biz authorization serverga authorization grant so'rovini yuboramiz va access tokenni olamiz. Nihoyat, biz ushbu access tokenni Resource serverga yuboramiz va agar u yaroqli bo'lsa, API resursga ruxsat beriladi.
Yechim
Quyidagi rasmda tizim arxitekturasi ko'rsatilgan. Bizda API Gateway (Zuul) bor, u bizning so'rovlarimizni avtorizatsiya serveriga va ikkita account mikroservisiga taqsimlaydi. Avtorizatsiya serveri - bu OAuth 2 xavfsizlik mexanizmlarini ta'minlaydigan infratuzilma servisi. Shuningdek, bizda discovery servisi (Eureka) mavjud, u yerda bizning barcha mikroservislarimiz ro'yxatdan o'tgan.
Gateway
Ushbu namuna uchun biz API shlyuzida hech qanday xavfsizlikni ta'minlamaymiz. Bu faqat mijozlardan autherization serverga va account micriservislariga so'rovlarni yuborishi kerak. Quyida ko'rinadigan Zuul shlyuzi konfiguratsiyasida, HTTP sarlavhasini avtorizatsiya qilish uchun sensitiveHeaders xususiyatini bo'sh qoldiramiz. Odatiy holda Zuul bu headerni bizning so'rovimizni kerakli APIga yuborishda kesib tashlaydi, chunki servislarimiz gateway ortida basic authentikatsiya talab qiladi.
zuul:
routes:
uaa:
path: /uaa/**
sensitiveHeaders:
serviceId: auth-server
account:
path: /account/**
sensitiveHeaders:
serviceId: account-service
Gatewayning
source codi ichidagi asosiy class juda oddiy. Bu faqat Eureka
registridan servislarni yig'ish uchun ZuulProxy
va DiscoveryClient
larni faollashtirish kerak.
@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
public class GatewayServer {
public static void main(String[] args) {
SpringApplication.run(GatewayServer.class, args);
}
}
Authorization Server
Authorization server maksimal darajada sodda. U standart SpringSecurity konfiguratsiyasiga asoslangan. Mijozlarni avtorizatsiya qilish tafsilotlari in-memory
da saqlanadi. Albatta, production
rejimida siz JDBC va TokenStore
kabilardan foydalansangiz bo'ladi. Springni avtorizatsiya mexanizmlari haqida qo'shimcha ma'lumotni Spring Security Reference va Spring Boot Security -da o'qishingiz mumkin.
Bu erda application.yml -dan konfiguratsiya namunasi. Namunada user uchun basic authentication ma'lumotlari va /token
endpoint uchun basic security ma'lumotlarini sozlangan: client-id
va client-secret
.
security:
user:
name: root
password: password
oauth2:
client:
client-id: acme
client-secret: secret
Bu erda autentifikatsiya serveri va @EnableAuthorizationServer
annotatsiyasi va account servisi uchun user authentikatsiya tafsilotlari uchun REST endpoint.
Shuningdek Eureka
registratori va Discovery
clienti faollashtirilgan.
@SpringBootApplication
@EnableAuthorizationServer
@EnableDiscoveryClient
@EnableResourceServer
@RestController
public class AuthServer {
public static void main(String[] args) {
SpringApplication.run(AuthServer.class, args);
}
@RequestMapping("/user")
public Principal user(Principal user) {
return user;
}
}
Application – account microservisi
Mikroservisimiz faqat bitta @GET
endpointga ega, u har doim bir xil accountni qaytaradi. Asosiy klassda resurslar serveri va Eureka discovery faollashtirilgan. Xizmat konfiguratsiyasi ahamiyatsiz. Dastur manba kodining namunasi GitHub -da mavjud.
@SpringBootApplication
@EnableDiscoveryClient
@EnableResourceServer
public class AccountService {
public static void main(String[] args) {
SpringApplication.run(AccountService.class, args);
}
}
Bu yerda account servisi uchun xavfsizli sozlamalari.
security:
user:
name: root
password: password
oauth2:
resource:
loadBalanced: true
userInfoUri: http://localhost:9999/user
Testlash
Natijani tkshirish uchun browser
va rest client
kerak bo'ladi.Dastlab resource owner
ga authorizatsiya so'rovini yuborishdan boshlasak, browserda Zull gateway
orqali OAuth2 authorizatsiya endpointiga so'rov yuborish mumkin.
http://localhost:8765/uaa/oauth/authorize?response_type=token&client_id=acme&redirect_uri=http://example.com&scope=openid&state=48532
Bu so'rov yuborilgandan so'ng biz quyidagi sahifani ko'rishimiz kerak. Tasdiqlash -ni tanlang va avtorizatsiya serveridan so'rovlar va kirish tokenlari uchun Avtorizatsiya -ni bosing. Agar dastur identifikatori tasdiqlangan bo'lsa va ruxsatnoma haqiqiy bo'lsa, HTTP javobida dasturga kirish belgisi qaytarilishi kerak.
Oxirgi qadam access token
dan foydalanib, account ning endpointiga murojaat qilish. Biz uni Authorization
headeriga bearer
belgisi bilan o'rnatamiz. Xavfsizlik operatsiyalari uchun dasturlarni logging
darajasi "TRACE" ga o'rnatilgan, shuning uchun biror narsa noto'g'ri ketganda nima bo'lganini osongina bilib olishingiz mumkin.
Xulosa
Rostini aytsam, men ilovalardagi xavfsizlik muammolari bilan unchalik tanish emasman. Men uchun juda muhim bo'lgan narsa - men foydalanishga qaror qilgan xavfsizlik echimining soddaligi. Spring Security -da bizda deyarli barcha kerakli mexanizmlar mavjud. Bundan tashqari, qo'shimcha talablar uchun osongina kengaytirilishi mumkin bo'lgan komponentlar mavjud. Siz ushbu maqolani Spring Cloud va Spring Security loyihalaridan foydalangan holda yanada ilg'or echimlarga qisqacha kirish sifatida qarashingiz kerak.
Top comments (0)