मैं अपने आवेदन के लिए जावा में एक लचीली एसीएल रूपरेखा बनाने की कोशिश कर रहा हूं।
कई एसीएल ढांचे नियमों के एक श्वेतसूची पर बनाए गए हैं, जहां एक नियम मालिक के रूप में है : कार्रवाई: संसाधन । उदाहरण के लिए,
- "जॉन संसाधन FOOBAR-1 देख सकते हैं"
- "MARY संसाधन FOOBAR-1 देख सकते हैं"
- "MARY संसाधन FOOBAR-1 को संपादित कर सकते हैं"
यह आकर्षक है क्योंकि नियमों को आसानी से क्रमबद्ध किया जा सकता है / एक डेटाबेस के लिए जारी रखा जा सकता है। लेकिन मेरे आवेदन में जटिल व्यावसायिक तर्क है। उदाहरण के लिए,
- "वरिष्ठता के 5 वर्षों में विभाग 1 के सभी उपयोगकर्ता संसाधन FOOBAR-1 देख सकते हैं, अधिकृत नहीं"
- "विभाग 2 में सभी उपयोगकर्ता, यदि दिनांक 03/15/2016 के बाद है, तो संसाधन FOOBAR-2 देख सकते हैं, अन्यथा अधिकृत हैं"
पहले सोचा था, यह एक डेटाबेस स्कीमा तैयार करने के लिए एक बुरा सपना होगा जो इन जैसे असीम जटिल नियमों को संभाल सकता है। इसलिए, ऐसा लगता है जैसे मुझे उन्हें संकलित अनुप्रयोग में "सेंकना" करने की आवश्यकता है, प्रत्येक उपयोगकर्ता के लिए उनका मूल्यांकन करें, और फिर मालिक का निर्माण करें : कार्रवाई: मूल्यांकन के परिणामस्वरूप संसाधन नियम। मैं संकलित आवेदन में तर्क को पकाने से बचना चाहता हूं।
इसलिए, मैं एक नियम को विधेय : कार्रवाई: संसाधन के रूप में प्रस्तुत करने के बारे में सोच रहा था , जहां विधेय एक बूलियन अभिव्यक्ति है जो यह निर्धारित करती है कि उपयोगकर्ता अनुमति है या नहीं। विधेय एक जावास्क्रिप्ट अभिव्यक्ति का एक स्ट्रिंग होगा जो जावा के राइनो इंजन द्वारा मूल्यांकन किया जा सकता है। उदाहरण के लिए,
return user.getDept() == 1 && user.seniority > 5;
ऐसा करने में, विधेय आसानी से डेटाबेस में बनाए रखा जा सकता है।
क्या यह चतुर है ? क्या यह मैला है ? क्या यह नौटंकी है ? क्या यह ओवर-इंजीनियर है ? क्या यह सुरक्षित है (जाहिर है, जावा राइनो इंजन को सैंडबॉक्स कर सकता है)।