मुझे पता है कि मुझे 2 साल की देर हो चुकी है, लेकिन मुझे लगता है कि मैं जो जानता हूं उसे साझा करूंगा और उम्मीद है कि भविष्य के पाठकों के लिए कुछ दर्द कम होगा। पूर्ण पारदर्शिता- मैं किसी भी तरह से Keycloak / OAuth / OIDC विशेषज्ञ नहीं हूं और मुझे जो भी पता है वह ज्यादातर डॉक्स, किताबें, अच्छे ol 'YouTube को पढ़ने और टूल के साथ खेलने से है।
इस पोस्ट में दो भाग शामिल होंगे:
- मैं अपनी क्षमता के अनुसार आपके सभी सवालों का जवाब देने का प्रयास करूंगा
- मैं आप सभी को दिखाऊंगा कि कैसे आप इस थ्रेड में कुछ मुख्य अवधारणाओं को बेहतर ढंग से समझने के लिए अलग-अलग ऐप को तैनात करने की आवश्यकता के बिना कीक्लॉक में नीतियों / स्कोप / अनुमतियों के साथ खेल सकते हैं। हालांकि ध्यान दें कि यह ज्यादातर आप सभी को शुरू करने के लिए है। मैं उपयोग कर रहा हूं
Keycloak 8.0.0
।
भाग I
आरंभ करने से पहले कुछ शब्दावली:
- Keycloak में, आप 2 प्रकार की अनुमतियाँ बना सकते हैं: संसाधन-आधारित और स्कोप-आधारित ।
- सीधे शब्दों में कहें,
Resource-Based
अनुमतियों के लिए, आप इसे सीधे अपने संसाधन पर लागू करते हैं
- के लिए
Scoped-Based
अनुमति है, आप इसे अपने दायरे (s) या गुंजाइश (रों) पर लागू होते हैं और संसाधन।
क्या यह केवल एक "दृश्य" गुंजाइश बनाने के लिए सबसे अच्छा अभ्यास है, और इसका उपयोग कई संसाधनों (खाता, लेनदेन, आदि) में किया जाता है? या मुझे एक "व्यूअकाउंट" स्कोप, एक "व्यूट्रांसैक्शन" स्कोप आदि बनाना चाहिए?
स्कोप एक संरक्षित संसाधन पर अधिकारों के एक समूह का प्रतिनिधित्व करते हैं। आपके मामले में, आपके पास 2 संसाधन हैं: account
और transaction
, इसलिए मैं दूसरे दृष्टिकोण की ओर झुकूंगा।
लंबे समय में, एक वैश्विक होने view
अपने सभी संसाधनों के साथ जुड़े गुंजाइश (जैसे account
, transaction
, customer
, settlement
...) दोनों का प्रबंधन और सुरक्षा की आवश्यकता को परिवर्तन करने के लिए अनुकूल करने के लिए बनाता है प्राधिकरण मुश्किल।
यहां कुछ उदाहरण दिए गए हैं, जिन्हें आप डिजाइन के लिए महसूस कर सकते हैं
हालांकि ध्यान दें - मैं यह दावा नहीं कर रहा हूं कि आपको संसाधनों में स्कोप साझा नहीं करना चाहिए। तथ्य की बात, Keycloak
यह उसी के साथ संसाधनों के लिए अनुमति देता है type
। उदाहरण के लिए, आपको किसी दिए गए खाते के तहत लेनदेन को पढ़ने के लिए दोनों viewAccount
और viewTransaction
गुंजाइश की आवश्यकता हो सकती है (आखिरकार आपको लेनदेन देखने के लिए खाते तक पहुंच की आवश्यकता हो सकती है)। आपकी आवश्यकताएं और मानक आपके डिजाइन को बहुत प्रभावित करेंगे।
संसाधन और दायरे के प्रत्येक व्यावहारिक संयोजन के लिए, क्या अनुमति बनाना सामान्य अभ्यास है?
क्षमा याचना, मैं प्रश्न को पूरी तरह से नहीं समझ पा रहा हूं इसलिए मैं थोड़ा व्यापक हो जाऊंगा। किसी को एक्सेस देने / देने से इंकार करने के लिए resource
, आपको निम्न करने की आवश्यकता है:
- अपनी नीतियों को परिभाषित करें
- अपनी अनुमतियों को परिभाषित करें
- अपनी नीतियों को अपनी अनुमतियों पर लागू करें
- अपनी अनुमति को एक
scope
या resource
(या दोनों) से संबद्ध करें
प्रभावी होने के लिए नीति प्रवर्तन के लिए। प्राधिकरण प्रक्रिया देखें ।
आप यह सब कैसे स्थापित करते हैं यह पूरी तरह आप पर निर्भर है। आप उदाहरण के लिए कर सकते हैं:
व्यक्तिगत नीतियों को परिभाषित करें, और उचित अनुमति के तहत प्रत्येक नीति को टाई।
बेहतर अभी तक, व्यक्तिगत नीतियों को परिभाषित करें, फिर अपनी सभी संबंधित नीतियों को एक aggregated
नीति (नीतियों की नीति) के तहत समूहित करें और फिर उस समग्र नीति को scope-based
अनुमति के साथ संबद्ध करें । आपके पास यह scoped-based
अनुमति हो सकती है कि संसाधन और उसके संबद्ध क्षेत्र दोनों पर लागू हो।
या, आप दो अलग-अलग प्रकारों का लाभ उठाकर अपनी अनुमतियों को तोड़ सकते हैं। आप resource-based
अनुमति प्रकार के माध्यम से अपने संसाधनों के लिए पूरी तरह से अनुमतियाँ बना सकते हैं , और अलग-अलग अनुमतियों को पूरी तरह से scope-based
अनुमति प्रकार के साथ एक गुंजाइश के साथ जोड़ सकते हैं ।
आपके पास विकल्प हैं।
यदि किसी दिए गए संसाधन / कार्यक्षेत्र से मेल खाते कई अनुमतियाँ हैं, तो Keyloloak क्या करता है?
यह निर्भर करता है
- संसाधन सर्वर का
Decision Strategy
- प्रत्येक अनुमति
Decision Strategy
- प्रत्येक नीति का
Logic
मूल्य।
Logic
मूल्य जावा के साथ इसी तरह की है !
ऑपरेटर। यह या तो हो सकता है Positive
या Negative
। जब Logic
है Positive
, तो नीति का अंतिम मूल्यांकन अपरिवर्तित रहता है। जब इसका Negative
अंतिम परिणाम नकारा जाता है (जैसे कि यदि कोई नीति गलत का मूल्यांकन करती है और वह Logic
है Negative
, तो यह होगा true
)। चीजों को सरल रखने के लिए, मान लेते हैं कि Logic
हमेशा सेट हैPositive
।
Decision Strategy
क्या हम वास्तव में से निपटने के लिए चाहते हैं। Decision Strategy
या तो किया जा सकता है Unanimous
या Affirmative
। डॉक्स से,
निर्णय की रणनीति
यह कॉन्फ़िगरेशन बदलता है कि नीति मूल्यांकन इंजन यह तय करता है कि सभी मूल्यांकन अनुमतियों के परिणाम के आधार पर संसाधन या गुंजाइश दी जानी चाहिए या नहीं। सकारात्मक का मतलब है कि कम से कम एक अनुमति के लिए एक सकारात्मक निर्णय का मूल्यांकन करना चाहिए ताकि संसाधन और उसके दायरे में पहुंच प्रदान की जा सके। सर्वसम्मति का अर्थ है कि अंतिम निर्णय के भी सकारात्मक होने के लिए सभी अनुमतियों को एक सकारात्मक निर्णय का मूल्यांकन करना चाहिए। एक उदाहरण के रूप में, यदि एक ही संसाधन या दायरे के लिए दो अनुमतियाँ संघर्ष में हैं (उनमें से एक पहुंच का उपयोग कर रहा है और दूसरा पहुंच से इनकार कर रहा है), तो संसाधन या गुंजाइश की अनुमति दी जाएगी यदि चुनी गई रणनीति सकारात्मक है। अन्यथा, किसी भी अनुमति से एक एकल इनकार भी संसाधन या दायरे तक पहुंच से इनकार करेगा।
उपरोक्त को बेहतर ढंग से समझने के लिए एक उदाहरण का उपयोग करते हैं। मान लीजिए आप 2 अनुमतियों के साथ एक संसाधन है और किसी संसाधन (याद रखें, कि उपयोग करने के लिए कोशिश कर रहा है Logic
है Positive
सभी नीतियों के लिए)। अभी:
Permission One
के लिए एक Decision Strategy
सेट है Affirmative
। इसकी 3 नीतियां भी हैं जहां वे प्रत्येक का मूल्यांकन करते हैं:
चूंकि किसी एक पॉलिसी को सेट किया जाता है true
, Permission One
उसे सेट किया जाता है true
(Affirmative - केवल 1 होना चाहिए true
)।
Permission Two
2 नीतियों के साथ एक Decision Strategy
सेट है Unanimous
:
इस मामले Permission Two
में false
चूंकि एक नीति झूठी है (सर्वसम्मति से - उन्हें सभी की आवश्यकता है true
)।
- अब अंतिम मूल्यांकन आता है । यदि संसाधन सर्वर
Decision Strategy
सेट है Affirmative
, तो उस संसाधन तक पहुँच दी जाएगी क्योंकि Permission One
है true
। यदि दूसरी ओर, संसाधन सर्वर Decision Strategy
पर सेट किया गया है Unanimous
, तो प्रवेश निषेध होगा।
देख:
हम इसे फिर से जारी रखेंगे। मैं समझाता हूं कि Decision Strategy
भाग II में संसाधन को कैसे सेट किया जाए ।
इसलिए उदाहरण के लिए मुझे "खातों" का उपयोग करने की अनुमति हो सकती है और "दृश्य" गुंजाइश की अनुमति हो सकती है, इसलिए इसलिए मुझे खातों को देखने की अनुमति होगी?
छोटा जवाब हां है। अब, इस पर थोड़ा विस्तार करें :)
यदि आपके पास निम्न परिदृश्य है:
- संसाधन सर्वर का
Decision Strategy
सेट Unanimous
याAffirmative
account/{id}
संसाधन तक पहुंचने की अनुमति हैtrue
view
दायरे तक पहुंचने की अनुमति हैtrue
खाता देखने के लिए आपको पहुंच प्रदान की जाएगी।
true
+ के नीचे या के true
बराबर है । true
Affirmative
Unanimous
Decision Strategy
अब अगर आपके पास यह है
- संसाधन सर्वर पर
Decision Strategy
सेटAffirmative
account/{id}
संसाधन तक पहुंचने की अनुमति हैtrue
view
दायरे तक पहुंचने की अनुमति हैfalse
खाता देखने के लिए भी आपको पहुंच प्रदान की जाएगी।
true
+ false
है true
के तहत Affirmative
रणनीति।
यहां मुद्दा यह है कि किसी दिए गए संसाधन तक पहुंच भी आपके सेटअप पर निर्भर करती है इसलिए सावधान रहें क्योंकि आप दूसरा परिदृश्य नहीं चाहते हैं।
लेकिन क्या मैं सही हूं कि इसका मतलब यह है कि मुझे प्रत्येक विरासत समूहों के लिए एक नीति की आवश्यकता है जो एक उपयोगकर्ता का हो सकता है?
मुझे यकीन नहीं है कि कीक्लॉक ने 2 साल पहले कैसे व्यवहार किया था, लेकिन आप एक समूह-आधारित नीति को निर्दिष्ट कर सकते हैं और बस उस नीति के तहत अपने सभी समूहों को जोड़ सकते हैं। आपको निश्चित रूप से प्रति समूह एक नीति बनाने की आवश्यकता नहीं है।
उदाहरण के लिए, यदि मेरी "हेल्पडेस्क" भूमिका है, तो मुझे "हेल्पडेस्क सदस्यता" नीति की आवश्यकता है, जिसे मैं फिर "व्यूअकाउंट" अनुमति में जोड़ सकता हूं। क्या ये सही है?
बहुत ज्यादा। ऐसे कई तरीके हैं जिनसे आप इसे सेट कर सकते हैं। उदाहरण के लिए, आप कर सकते हैं:
- अपना संसाधन (जैसे
/account/{id}
) बनाएँ और इसे account:view
कार्यक्षेत्र के साथ जोड़ें ।
- भूमिका-आधारित नीति बनाएं और
helpdesk
उस नीति के तहत भूमिका जोड़ें
Scope-Based
नामक एक अनुमति बनाएँ viewAccount
और इसके साथ टाई करें scope
, resource
औरpolicy
हम भाग II में कुछ इसी तरह की स्थापना करेंगे।
भाग द्वितीय
कीक्लोक में एक छोटा सा उपकरण है जो आपको अपनी सभी नीतियों का परीक्षण करने की अनुमति देता है। बेहतर अभी तक, आपको वास्तव में किसी अन्य एप्लिकेशन सर्वर को स्पिन करने की आवश्यकता नहीं है और काम करने के लिए एक अलग ऐप को तैनात करना होगा।
यहाँ वह परिदृश्य है जिसे हम सेट करेंगे:
- हम एक नया क्षेत्र बनाएँगे जिसे कहा जाता है
stackoverflow-demo
- हम
bank-api
उस दायरे में एक क्लाइंट बनाएंगे
- हम
/account/{id}
उस क्लाइंट के लिए बुलाए गए संसाधन को परिभाषित करेंगे
- की गुंजाइश
account/{id}
होगीaccount:view
- हम
bob
नए दायरे के तहत एक उपयोगकर्ता बनाएंगे
- हम भी तीन भूमिकाओं में पैदा हो जाएगी:
bank_teller
, account_owner
औरuser
- हम
bob
किसी भी भूमिका से नहीं जुड़ेंगे। अभी इसकी जरूरत नहीं है।
- हम निम्नलिखित दो
Role-Based
नीतियां निर्धारित करेंगे :
bank_teller
और संसाधन account_owner
तक पहुंच है/account/{id}
account_owner
account:view
दायरे तक पहुँच है
user
संसाधन या दायरे तक पहुंच नहीं है
- हम इस
Evaluate
टूल के साथ खेलेंगे कि कैसे पहुंच प्रदान की जा सकती है या अस्वीकार की जा सकती है।
मुझे माफ कर दो, यह उदाहरण अवास्तविक है लेकिन मैं बैंकिंग क्षेत्र से परिचित नहीं हूँ :)
कीकलोक सेटअप
डाउनलोड करें और Keycloak चलाएँ
cd tmp
wget https://downloads.jboss.org/keycloak/8.0.0/keycloak-8.0.0.zip
unzip keycloak-8.0.0.zip
cd keycloak-8.0.0/bin
./standalone.sh
प्रारंभिक व्यवस्थापक उपयोगकर्ता बनाएँ
- के लिए जाओ
http://localhost:8080/auth
Administration Console
लिंक पर क्लिक करें
- व्यवस्थापक उपयोगकर्ता बनाएं और लॉगिन करें
यात्रा प्रारंभ करना अधिक जानकारी के लिए। हमारे उद्देश्यों के लिए, उपरोक्त पर्याप्त है।
मंच की स्थापना
एक नया क्षेत्र बनाएँ
- अपने माउस को
master
दायरे में घुमाएं और Add Realm
बटन पर क्लिक करें।
stackoverflow-demo
नाम के रूप में दर्ज करें ।
- पर क्लिक करें
Create
।
- शीर्ष बाएं को अब दायरे के
stackoverflow-demo
बजाय कहना चाहिए master
।
एक नया क्षेत्र बनाना देखें
एक नया उपयोगकर्ता बनाएँ
Users
बाईं ओर दिए गए लिंक पर क्लिक करें
Add User
बटन पर क्लिक करें
- दर्ज करें
username
(जैसे bob
)
- सुनिश्चित करें कि
User Enabled
चालू है
- क्लिक
Save
नया उपयोगकर्ता बनाना देखें
नई भूमिकाएँ बनाएँ
- पर क्लिक करें
Roles
लिंक
- पर क्लिक करें
Add Role
- निम्नलिखित भूमिकाओं जोड़ें:
bank_teller
, account_owner
औरuser
फिर से, नहीं अपने उपयोगकर्ता को भूमिकाओं के साथ । हमारे उद्देश्यों के लिए, इसकी आवश्यकता नहीं है।
रोल्स देखें
एक ग्राहक बनाएँ
- पर क्लिक करें
Clients
लिंक
- पर क्लिक करें
Create
- दर्ज
bank-api
करने के लिएClient ID
- के लिए
Root URL
प्रवेशhttp://127.0.0.1:8080/bank-api
- पर क्लिक करें
Save
- सुनिश्चित करें कि
Client Protocol
हैopenid-connect
- बदले
Access Type
के लिएconfidential
- बदलें
Authorization Enabled
करने के लिएOn
- नीचे स्क्रॉल करें और हिट करें
Save
। एक नयाAuthorization
शीर्ष पर टैब दिखाई देना चाहिए।
Authorization
टैब पर क्लिक करें और फिरSettings
- सुनिश्चित करें कि
Decision Strategy
सेट किया गया हैUnanimous
- यह संसाधन सर्वर है
Decision Strategy
देख:
कस्टम स्कोप बनाएँ
Authorization
टैब पर क्लिक करें
- पृष्ठ को लाने के लिए
Authorization Scopes
> पर क्लिक करेंCreate
Add Scope
- दर्ज
account:view
नाम और enter दबाएं।
"खाता संसाधन देखें" बनाएं
Authorization
ऊपर दिए गए लिंक पर क्लिक करें
- पर क्लिक करें
Resources
- पर क्लिक करें
Create
View Account Resource
दोनों के लिए दर्ज करें Name
औरDisplay name
- दर्ज
account/{id}
करने के लिएURI
- टेक्स्ट बॉक्स
account:view
में दर्ज करेंScopes
- क्लिक
Save
संसाधन बनाना देखें
अपनी नीतियां बनाएं
- फिर से
Authorization
टैब के नीचे , पर क्लिक करेंPolicies
- का चयन करें
Role
सेCreate Policy
ड्रॉपडाउन
- में
Name
अनुभाग, टाइप करेंOnly Bank Teller and Account Owner Policy
- के तहत
Realm Roles
चुनिंदा दोनों bank_teller
और account_owner
भूमिका
- सुनिश्चित करें कि
Logic
सेट किया गया हैPositive
- क्लिक
Save
Policies
लिंक पर क्लिक करें
- ड्रॉपडाउन
Role
से फिर से चुनें Create Policy
।
- इस समय के लिए उपयोग
Only Account Owner Policy
करेंName
Realm Roles
चयन के तहतaccount_owner
- सुनिश्चित करें कि
Logic
सेट किया गया हैPositive
- क्लिक
Save
Policies
शीर्ष पर दिए गए लिंक पर क्लिक करें , आपको अब अपनी नई बनाई गई नीतियों को देखना चाहिए।
भूमिका-आधारित नीति देखें
ध्यान दें कि कीक्लॉक में बहुत अधिक शक्तिशाली नीतियां हैं। प्रबंध नीतियां देखें
संसाधन-आधारित अनुमति बनाएँ
- फिर से
Authorization
टैब के नीचे , पर क्लिक करेंPermissions
- चुनते हैं
Resource-Based
- के लिए टाइप
View Account Resource Permission
करेंName
Resources
प्रकार के तहतView Account Resource Permission
Apply Policy
चयन के तहतOnly Bank Teller and Account Owner Policy
- सुनिश्चित करें कि
Decision Strategy
सेट किया गया हैUnanimous
- क्लिक
Save
संसाधन-आधारित अनुमतियाँ बनाएँ देखें
काहे का ...
संसाधन-आधारित अनुमति का मूल्यांकन
Authorization
टैब के नीचे फिर से चुनेंEvaluate
- के तहत
User
दर्ज करेंbob
Roles
चयन के तहतuser
- यह वह जगह है जहाँ हम अपने उपयोगकर्ता को अपनी बनाई भूमिकाओं के साथ जोड़ेंगे।
Resources
चयन करें View Account Resource
और क्लिक करें के तहतAdd
- मूल्यांकन पर क्लिक करें।
View Account Resource with scopes [account:view]
परिणाम देखने के लिए विस्तृत करें और आपको देखना चाहिए DENY
।

- यह समझ में आता है क्योंकि हम केवल दो भूमिकाओं को उस संसाधन तक पहुँच की अनुमति देते हैं
Only Bank Teller and Account Owner Policy
। चलिए यह परीक्षण करते हैं यह सुनिश्चित करने के लिए कि यह सच है!
Back
मूल्यांकन परिणाम के ठीक ऊपर दिए गए लिंक पर क्लिक करें
- बॉब की भूमिका बदलें
account_owner
और उस पर क्लिक करें Evaluate
। अब आपको परिणाम को देखना चाहिए PERMIT
। यदि आप वापस जाते हैं और भूमिका को बदलते हैं तो समान व्यवहार करेंbank_teller
मूल्यांकन और परीक्षण नीतियां देखें
स्कोप-आधारित अनुमति बनाएँ
Permissions
अनुभाग पर वापस जाएं
- ड्रॉपडाउन के
Scope-Based
तहत इस समय का चयन करें Create Permission
।
- के तहत
Name
, दर्ज करेंView Account Scope Permission
- के तहत
Scopes
, दर्ज करेंaccount:view
- के तहत
Apply Policy
, दर्ज करेंOnly Account Owner Policy
- सुनिश्चित करें कि
Decision Strategy
सेट किया गया हैUnanimous
- क्लिक
Save
स्कोप-आधारित अनुमतियां बनाना देखें
दूसरा टेस्ट रन
हमारे नए परिवर्तनों का मूल्यांकन
Authorization
अनुभाग पर वापस जाएं
- पर क्लिक करें
Evaluate
- उपयोगकर्ता होना चाहिए
bob
- भूमिकाएं होनी चाहिए
bank_teller
- संसाधन होना चाहिए
View Account Resource
और क्लिक करना चाहिएAdd
- पर क्लिक करें
Evaluate
और हमें मिलना चाहिए DENY
।
- फिर से इस पर कोई आश्चर्य नहीं होना चाहिए क्योंकि इस
bank_teller
तक पहुंच resource
नहीं है लेकिन नहीं है scope
। यहाँ एक अनुमति सत्य का मूल्यांकन करती है, और दूसरा असत्य का। यह देखते हुए कि संसाधन सर्वर Decision Strategy
पर सेट किया गया है Unanimous
, अंतिम निर्णय है DENY
।
- पर क्लिक करें
Settings
के तहत Authorization
टैब, और बदलने Decision Strategy
के लिए Affirmative
और 1-6 चरणों में वापस जाने के लिए फिर से। इस बार, अंतिम परिणाम होना चाहिए PERMIT
(एक अनुमति सत्य है, इसलिए अंतिम निर्णय सत्य है)।
- पूर्णता की खातिर, संसाधन सर्वर को
Decision Strategy
वापस चालू करें Unanimous
। पुन: 6 के माध्यम से चरण 1 पर वापस जाएं लेकिन इस बार, भूमिका निर्धारित करें account_owner
। इस बार, अंतिम परिणाम फिर से है PERMIT
जो समझ में आता है, यह देखते हुए कि account_owner
दोनों की पहुंच है resource
और scope
।
नीट :) आशा है कि यह मदद करता है।