تعارف
اس جائزے میں میں ویب ایپلیکیشن سیکیورٹی جیسے موضوع پر بات کرنا چاہوں گا۔ جاوا میں کئی ٹیکنالوجیز ہیں جو سیکورٹی فراہم کرتی ہیں:-
" جاوا ایس ای پلیٹ فارم سیکیورٹی آرکیٹیکچر "، جس کے بارے میں مزید تفصیلات اوریکل کی گائیڈ میں پڑھی جا سکتی ہیں: " جاوا ٹی ایم ایس ای پلیٹ فارم سیکیورٹی آرکیٹیکچر "۔ یہ فن تعمیر بیان کرتا ہے کہ ہمیں جاوا SE رن ٹائم ماحول میں اپنی جاوا ایپلیکیشنز کو کیسے محفوظ کرنے کی ضرورت ہے۔ لیکن یہ ہماری آج کی گفتگو کا موضوع نہیں ہے۔
-
" جاوا کرپٹوگرافی آرکیٹیکچر " ایک جاوا ایکسٹینشن ہے جو ڈیٹا انکرپشن کو بیان کرتی ہے۔ آپ جاوا رش پر اس ایکسٹینشن کے بارے میں مزید پڑھ سکتے ہیں " جاوا کرپٹوگرافی آرکیٹیکچر: پہلا تعارف " یا اوریکل کی گائیڈ میں: " جاوا کرپٹوگرافی آرکیٹیکچر (JCA) حوالہ گائیڈ "۔
JAAS
JAAS Java SE کی توسیع ہے اور اسے Java Authentication and Authorization Service (JAAS) حوالہ گائیڈ میں بیان کیا گیا ہے ۔ جیسا کہ ٹیکنالوجی کے نام سے پتہ چلتا ہے، JAAS بیان کرتا ہے کہ کس طرح تصدیق اور اجازت کو انجام دیا جانا چاہئے:-
" توثیق ": یونانی سے ترجمہ شدہ، "authentikos" کا مطلب ہے "حقیقی، حقیقی"۔ یعنی تصدیق صداقت کا امتحان ہے۔ کہ جس کی توثیق ہو رہی ہے وہ واقعی وہی ہے جو وہ کہتے ہیں۔
-
" اختیار ": انگریزی سے ترجمہ کا مطلب ہے "اجازت"۔ یعنی، اجازت ایکسیس کنٹرول ہے جو کامیاب تصدیق کے بعد انجام دیا جاتا ہے۔
- اس کا ڈرائیونگ لائسنس ایک سڑک صارف کے طور پر کسی شخص کی نمائندگی کے طور پر
- اس کا پاسپورٹ، ایک شخص کی نمائندگی کے طور پر اس کے ملک کے شہری کے طور پر
- اس کا غیر ملکی پاسپورٹ، بین الاقوامی تعلقات میں ایک شخص کی نمائندگی کے طور پر
- لائبریری میں اس کا لائبریری کارڈ، لائبریری سے منسلک قاری کے طور پر کسی شخص کی نمائندگی کے طور پر
ویب ایپلیکیشن
لہذا، ہمیں ایک ویب ایپلیکیشن کی ضرورت ہے۔ گریڈل آٹومیٹک پروجیکٹ کی تعمیر کا نظام اسے بنانے میں ہماری مدد کرے گا۔ Gradle کے استعمال کی بدولت، ہم چھوٹی چھوٹی کمانڈز کو عمل میں لا کر، جاوا پروجیکٹ کو اس فارمیٹ میں جمع کر سکتے ہیں جس کی ہمیں ضرورت ہے، خود بخود ضروری ڈائریکٹری ڈھانچہ تشکیل دے سکتے ہیں، اور بہت کچھ۔ آپ گریڈل کے بارے میں مختصر جائزہ میں مزید پڑھ سکتے ہیں: " گریڈل کا مختصر تعارف " یا سرکاری دستاویزات " گریڈل شروع کرنا " میں۔ ہمیں پروجیکٹ کو شروع کرنے کی ضرورت ہے (ابتدائی)، اور اس مقصد کے لیے گریڈل کے پاس ایک خاص پلگ ان ہے: " گریڈل انیٹ پلگ ان " (Init ابتدا کے لیے مختصر ہے، یاد رکھنا آسان ہے)۔ اس پلگ ان کو استعمال کرنے کے لیے، کمانڈ لائن پر کمانڈ چلائیں:gradle init --type java-application
کامیاب تکمیل کے بعد، ہمارے پاس جاوا پروجیکٹ ہوگا۔ آئیے اب ایڈیٹنگ کے لیے اپنے پروجیکٹ کی بلڈ اسکرپٹ کھولتے ہیں۔ ایک بلڈ اسکرپٹ ایک فائل ہے جسے کہتے ہیں build.gradle
، جو ایپلی کیشن کی تعمیر کی باریکیوں کو بیان کرتی ہے۔ اس لیے نام، اسکرپٹ بنائیں۔ ہم کہہ سکتے ہیں کہ یہ ایک پروجیکٹ کی تعمیر کا اسکرپٹ ہے۔ گریڈل ایک ایسا ورسٹائل ٹول ہے، جس کی بنیادی صلاحیتوں کو پلگ ان کے ساتھ بڑھایا جاتا ہے۔ لہذا، سب سے پہلے، آئیے "پلگ ان" بلاک پر توجہ دیں:
plugins {
id 'java'
id 'application'
}
پہلے سے طے شدہ طور پر، گریڈل نے، جو ہم نے بیان کیا ہے اس کے مطابق --type java-application
، کچھ بنیادی پلگ انز کا سیٹ اپ کیا ہے، یعنی وہ پلگ ان جو خود گریڈل کی تقسیم میں شامل ہیں۔ اگر آپ gradle.org ویب سائٹ پر "دستاویزات" (یعنی دستاویزات) سیکشن پر جاتے ہیں، تو "حوالہ" سیکشن میں عنوانات کی فہرست میں بائیں جانب ہمیں " کور پلگ انز " سیکشن نظر آتا ہے، یعنی ان انتہائی بنیادی پلگ انز کی تفصیل کے ساتھ سیکشن۔ آئیے بالکل وہی پلگ ان منتخب کریں جن کی ہمیں ضرورت ہے، نہ کہ وہ جو گریڈل نے ہمارے لیے تیار کیے ہیں۔ دستاویزات کے مطابق، " گریڈل جاوا پلگ ان " جاوا کوڈ کے ساتھ بنیادی آپریشن فراہم کرتا ہے، جیسے کہ سورس کوڈ کو مرتب کرنا۔ نیز، دستاویزات کے مطابق، " گریڈل ایپلیکیشن پلگ ان " ہمیں "قابل عمل JVM ایپلیکیشن" کے ساتھ کام کرنے کے لیے ٹولز فراہم کرتا ہے، یعنی ایک جاوا ایپلیکیشن کے ساتھ جسے اسٹینڈ اپلی کیشن کے طور پر لانچ کیا جا سکتا ہے (مثال کے طور پر، کنسول ایپلی کیشن یا اس کے اپنے UI والی ایپلیکیشن)۔ یہ پتہ چلتا ہے کہ ہمیں "ایپلی کیشن" پلگ ان کی ضرورت نہیں ہے، کیونکہ... ہمیں اسٹینڈ اکیلی ایپ کی ضرورت نہیں ہے، ہمیں ایک ویب ایپ کی ضرورت ہے۔ آئیے اسے ڈیلیٹ کرتے ہیں۔ نیز "mainClassName" کی ترتیب، جو صرف اس پلگ ان کو معلوم ہے۔ مزید، اسی " پیکیجنگ اور تقسیم " سیکشن میں جہاں ایپلیکیشن پلگ ان دستاویزات کا لنک فراہم کیا گیا تھا، وہاں گریڈل وار پلگ ان کا لنک بھی ہے۔ گریڈل وار پلگ ان ، جیسا کہ دستاویزات میں بتایا گیا ہے، جاوا ویب ایپلیکیشنز کو جنگی شکل میں بنانے کے لیے معاونت فراہم کرتا ہے۔ WAR فارمیٹ کا مطلب یہ ہے کہ JAR آرکائیو کے بجائے ایک WAR آرکائیو بنایا جائے گا۔ ایسا لگتا ہے کہ ہمیں یہی ضرورت ہے۔ نیز، جیسا کہ دستاویزات میں کہا گیا ہے، "وار پلگ ان جاوا پلگ ان کو بڑھاتا ہے"۔ یعنی ہم جاوا پلگ ان کو وار پلگ ان سے بدل سکتے ہیں۔ لہذا، ہمارا پلگ ان بلاک بالآخر اس طرح نظر آئے گا:
plugins {
id 'war'
}
نیز "گریڈل وار پلگ ان" کی دستاویزات میں یہ کہا گیا ہے کہ پلگ ان ایک اضافی "پروجیکٹ لے آؤٹ" استعمال کرتا ہے۔ لے آؤٹ کا انگریزی سے لوکیشن کے طور پر ترجمہ کیا گیا ہے۔ یعنی جنگی پلگ ان بذریعہ ڈیفالٹ فائلوں کے ایک مخصوص مقام کے وجود کی توقع کرتا ہے جسے وہ اپنے کاموں کے لیے استعمال کرے گا۔ یہ ویب ایپلیکیشن فائلوں کو ذخیرہ کرنے کے لیے درج ذیل ڈائرکٹری کا استعمال کرے گا: src/main/webapp
پلگ ان کا برتاؤ اس طرح بیان کیا گیا ہے:
web.xml
- یہ ایک "تعیناتی وضاحت کنندہ" یا "تعیناتی بیان کنندہ" ہے۔ یہ ایک فائل ہے جو بتاتی ہے کہ ہماری ویب ایپلیکیشن کو کام کرنے کے لیے کنفیگر کرنے کا طریقہ۔ یہ فائل بتاتی ہے کہ ہماری ایپلیکیشن کن درخواستوں کو سنبھالے گی، سیکیورٹی کی ترتیبات، اور بہت کچھ۔ اس کے بنیادی طور پر، یہ کسی حد تک JAR فائل سے ایک مینی فیسٹ فائل سے ملتا جلتا ہے (دیکھیں " مینی فیسٹ فائلوں کے ساتھ کام کرنا: بنیادی باتیں ")۔ مینی فیسٹ فائل بتاتی ہے کہ جاوا ایپلیکیشن (یعنی ایک JAR آرکائیو) کے ساتھ کیسے کام کرنا ہے، اور web.xml بتاتی ہے کہ جاوا ویب ایپلیکیشن (یعنی ایک WAR آرکائیو) کے ساتھ کیسے کام کرنا ہے۔ "تعیناتی ڈسکرپٹر" کا تصور خود ہی پیدا نہیں ہوا تھا، لیکن دستاویز میں بیان کیا گیا ہے " Servlet API تفصیلات"کوئی بھی جاوا ویب ایپلیکیشن اس "Servlet API" پر منحصر ہے۔ یہ سمجھنا ضروری ہے کہ یہ ایک API ہے - یعنی یہ کچھ تعامل کے معاہدے کی تفصیل ہے۔ ویب ایپلیکیشنز آزاد ایپلی کیشنز نہیں ہیں۔ یہ ویب سرور پر چلتی ہیں۔ ، جو صارفین کے ساتھ نیٹ ورک مواصلت فراہم کرتا ہے۔ یعنی ویب سرور ویب ایپلیکیشنز کے لیے ایک قسم کا "کنٹینر" ہے۔ یہ منطقی ہے، کیونکہ ہم ویب ایپلیکیشن کی منطق لکھنا چاہتے ہیں، یعنی صارف کون سے صفحات دیکھے گا اور کیسے انہیں صارف کے اعمال پر رد عمل ظاہر کرنا چاہیے۔ اور ہم اس کے لیے کوڈ نہیں لکھنا چاہتے کہ صارف کو پیغام کیسے بھیجا جائے گا، معلومات کے بائٹس کیسے منتقل کیے جائیں گے اور دیگر کم درجے کی اور انتہائی معیاری چیزیں۔ اس سے پتہ چلتا ہے کہ ویب ایپلیکیشنز سبھی مختلف ہیں، لیکن ڈیٹا کی منتقلی ایک جیسی ہے۔ یعنی ایک ملین پروگرامرز کو ایک ہی مقصد کے لیے بار بار کوڈ لکھنا پڑے گا۔ اس لیے ویب سرور صارف کے کچھ تعامل کے لیے ذمہ دار ہے۔ اور ڈیٹا کا تبادلہ، اور ویب ایپلیکیشن اور ڈویلپر اس ڈیٹا کو تیار کرنے کے ذمہ دار ہیں۔ اور ان دونوں حصوں کو جوڑنے کے لیے، یعنی ویب سرور اور ویب ایپلیکیشن، آپ کو ان کے تعامل کے لیے ایک معاہدے کی ضرورت ہے، یعنی ایسا کرنے کے لیے وہ کن اصولوں پر عمل کریں گے؟ کسی نہ کسی طرح معاہدے کی وضاحت کرنے کے لیے، ویب ایپلیکیشن اور ویب سرور کے درمیان تعامل کیسا نظر آنا چاہیے، Servlet API کی ایجاد ہوئی۔ دلچسپ بات یہ ہے کہ یہاں تک کہ اگر آپ اسپرنگ جیسے فریم ورک استعمال کرتے ہیں، تب بھی ایک سرولیٹ API موجود ہے۔ یعنی، آپ Spring استعمال کرتے ہیں، اور Spring آپ کے لیے Servlet API کے ساتھ کام کرتا ہے۔ یہ پتہ چلتا ہے کہ ہمارے ویب ایپلیکیشن پروجیکٹ کا انحصار Servlet API پر ہونا چاہیے۔ اس صورت میں، Servlet API ایک انحصار ہوگا۔ جیسا کہ ہم جانتے ہیں، گریڈل آپ کو پراجیکٹ کے انحصار کو اعلانیہ انداز میں بیان کرنے کی بھی اجازت دیتا ہے۔ پلگ ان بتاتے ہیں کہ انحصار کو کس طرح منظم کیا جا سکتا ہے۔ مثال کے طور پر، Java Gradle پلگ ان "testImplementation" انحصار کے انتظام کا طریقہ متعارف کراتا ہے، جو کہتا ہے کہ ایسی انحصار صرف ٹیسٹوں کے لیے ضروری ہے۔ لیکن گریڈل وار پلگ ان انحصار کے انتظام کے طریقہ کار کو شامل کرتا ہے "providedCompile"، جو کہتا ہے کہ اس طرح کا انحصار ہماری ویب ایپلیکیشن کے WAR آرکائیو میں شامل نہیں کیا جائے گا۔ ہم اپنے WAR آرکائیو میں Servlet API کو کیوں شامل نہیں کرتے؟ کیونکہ Servlet API ہماری ویب ایپلیکیشن کو ویب سرور ہی فراہم کرے گا۔ اگر کوئی ویب سرور سرولیٹ API فراہم کرتا ہے، تو سرور کو سرولیٹ کنٹینر کہا جاتا ہے۔ لہذا، یہ ویب سرور کی ذمہ داری ہے کہ وہ ہمیں Servlet API فراہم کرے، اور یہ ہماری ذمہ داری ہے کہ ServletAPI کو صرف کوڈ کے مرتب ہونے کے وقت فراہم کریں۔ اس لیے providedCompile
. اس طرح، انحصار بلاک اس طرح نظر آئے گا:
dependencies {
providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
testImplementation 'junit:junit:4.12'
}
تو آئیے web.xml فائل پر واپس چلتے ہیں۔ پہلے سے طے شدہ طور پر، Gradle کوئی بھی تعیناتی ڈسکرپٹر نہیں بناتا، لہذا ہمیں یہ خود کرنے کی ضرورت ہے۔ آئیے ایک ڈائریکٹری بنائیں src/main/webapp/WEB-INF
، اور اس میں ہم ایک XML فائل بنائیں گے جس کا نام ہے web.xml
۔ اب آئیے خود "جاوا سرولیٹ اسپیسیفیکیشن" کھولتے ہیں اور چیپٹر " چیپٹر 14 ڈیپلائمنٹ ڈسکرپٹر "۔ جیسا کہ "14.3 Deployment Descriptor" میں بتایا گیا ہے، Deployment Descriptor کی XML دستاویز کو اسکیما http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd کے ذریعہ بیان کیا گیا ہے ۔ ایک XML سکیما بیان کرتا ہے کہ دستاویز کن عناصر پر مشتمل ہو سکتی ہے اور انہیں کس ترتیب میں ظاہر ہونا چاہیے۔ کون سے لازمی ہیں اور کون سے نہیں۔ عام طور پر، یہ دستاویز کی ساخت کی وضاحت کرتا ہے اور آپ کو یہ جانچنے کی اجازت دیتا ہے کہ آیا XML دستاویز صحیح طریقے سے تشکیل دی گئی ہے۔ اب آئیے باب " 14.5 مثالوں " سے مثال استعمال کرتے ہیں، لیکن اسکیم کو ورژن 3.1 کے لیے مخصوص کیا جانا چاہیے، یعنی
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd
ہمارا خالی web.xml
اس طرح نظر آئے گا:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>JAAS Example</display-name>
</web-app>
آئیے اب اس سرولیٹ کی وضاحت کرتے ہیں جس کی حفاظت ہم JAAS کا استعمال کرتے ہوئے کریں گے۔ پہلے، گریڈل نے ہمارے لیے ایپ کلاس تیار کی تھی۔ آئیے اسے ایک سرولیٹ میں تبدیل کریں۔ جیسا کہ " CHAPTER 2 The Servlet Interface " میں تصریح میں کہا گیا ہے ، کہ " زیادہ تر مقاصد کے لیے، ڈویلپرز HttpServlet کو اپنے سرولیٹس کو لاگو کرنے کے لیے بڑھا دیں گے "، یعنی کسی کلاس کو سرولیٹ بنانے کے لیے، آپ کو اس کلاس کو اس سے وراثت میں لینے کی ضرورت ہے HttpServlet
:
public class App extends HttpServlet {
public String getGreeting() {
return "Secret!";
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().print(getGreeting());
}
}
جیسا کہ ہم نے کہا، Servlet API سرور اور ہماری ویب ایپلیکیشن کے درمیان ایک معاہدہ ہے۔ یہ معاہدہ ہمیں یہ بیان کرنے کی اجازت دیتا ہے کہ جب کوئی صارف سرور سے رابطہ کرتا ہے، تو سرور صارف کی طرف سے ایک اعتراض کی شکل میں ایک درخواست تیار کرے گا HttpServletRequest
اور اسے سرولیٹ کو بھیج دے گا۔ یہ سرولیٹ کو ایک آبجیکٹ بھی فراہم کرے گا HttpServletResponse
تاکہ سرولیٹ صارف کے لیے اس کا جواب لکھ سکے۔ ایک بار جب servlet چلنا ختم ہو جائے گا، سرور صارف کو اس کی بنیاد پر جواب فراہم کر سکے گا HttpServletResponse
۔ یعنی، servlet صارف کے ساتھ براہ راست بات چیت نہیں کرتا، لیکن صرف سرور کے ساتھ. سرور کو یہ جاننے کے لیے کہ ہمارے پاس ایک سرولیٹ ہے اور اسے کن درخواستوں کے لیے استعمال کرنے کی ضرورت ہے، ہمیں سرور کو اس کے بارے میں تعیناتی ڈسکرپٹر میں بتانا ہوگا:
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>jaas.App</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/secret</url-pattern>
</servlet-mapping>
اس صورت میں، تمام درخواستیں /secret
ہمارے ایک سرولیٹ کو نام سے نہیں بھیجی جائیں گی app
، جو کلاس سے مماثل ہے jaas.App
۔ جیسا کہ ہم نے پہلے کہا، ایک ویب ایپلیکیشن صرف ویب سرور پر تعینات کی جا سکتی ہے۔ ویب سرور کو الگ سے انسٹال کیا جاسکتا ہے (اسٹینڈ اسٹون)۔ لیکن اس جائزے کے مقاصد کے لیے، ایک متبادل آپشن موزوں ہے - ایمبیڈڈ سرور پر چل رہا ہے۔ اس کا مطلب یہ ہے کہ سرور تخلیق کیا جائے گا اور پروگرام کے مطابق لانچ کیا جائے گا (پلگ ان ہمارے لیے ایسا کرے گا)، اور ساتھ ہی ہماری ویب ایپلیکیشن اس پر تعینات کی جائے گی۔ گریڈل بلڈ سسٹم آپ کو ان مقاصد کے لیے " گریڈل گریٹی پلگ ان " پلگ ان استعمال کرنے کی اجازت دیتا ہے:
plugins {
id 'war'
id 'org.gretty' version '2.2.0'
}
مزید برآں، گریٹی پلگ ان میں اچھی دستاویزات ہیں ۔ آئیے اس حقیقت کے ساتھ شروع کریں کہ گریٹی پلگ ان آپ کو مختلف ویب سرورز کے درمیان سوئچ کرنے کی اجازت دیتا ہے۔ اس کو دستاویزات میں مزید تفصیل سے بیان کیا گیا ہے: " سرولیٹ کنٹینرز کے درمیان سوئچنگ "۔ آئیے Tomcat پر سوئچ کریں، کیونکہ... یہ استعمال میں سب سے زیادہ مقبول ہے، اور اس میں اچھی دستاویزات اور بہت سی مثالیں اور تجزیہ کردہ مسائل بھی ہیں:
gretty {
// Переключаемся с дефолтного Jetty на Tomcat
servletContainer = 'tomcat8'
// Укажем Context Path, он же Context Root
contextPath = '/jaas'
}
اب ہم "gradle appRun" چلا سکتے ہیں اور پھر ہماری ویب ایپلیکیشن http://localhost:8080/jaas/secret پر دستیاب ہوگی۔
تصدیق
تصدیق کی ترتیبات اکثر دو حصوں پر مشتمل ہوتی ہیں: سرور کی طرف کی ترتیبات اور اس سرور پر چلنے والی ویب ایپلیکیشن کی طرف کی ترتیبات۔ ویب ایپلیکیشن کی سیکیورٹی سیٹنگز ویب سرور کی سیکیورٹی سیٹنگز کے ساتھ تعامل نہیں کرسکتی ہیں، اگر اس کے علاوہ کسی اور وجہ سے ویب ایپلیکیشن ویب سرور کے ساتھ تعامل نہیں کرسکتی ہے۔ یہ بیکار نہیں تھا کہ ہم نے ٹامکیٹ کو تبدیل کیا، کیونکہ... Tomcat ایک اچھی طرح سے بیان کردہ فن تعمیر ہے (دیکھیں " Apache Tomcat 8 Architecture ")۔ اس فن تعمیر کی تفصیل سے یہ واضح ہے کہ Tomcat، ایک ویب سرور کے طور پر، ویب ایپلیکیشن کو ایک مخصوص سیاق و سباق کے طور پر پیش کرتا ہے، جسے " Tomcat Context " کہا جاتا ہے۔ یہ سیاق و سباق ہر ویب ایپلیکیشن کو دوسرے ویب ایپلیکیشنز سے الگ تھلگ اپنی سیٹنگز رکھنے کی اجازت دیتا ہے۔ مزید برآں، ویب ایپلیکیشن اس سیاق و سباق کی ترتیبات کو متاثر کر سکتی ہے۔ لچکدار اور آسان۔ گہری تفہیم کے لیے، ہم مضمون " Tomcat Context Containers کو سمجھنا " اور Tomcat دستاویزی سیکشن " The Context Container " پڑھنے کی تجویز کرتے ہیں۔ جیسا کہ اوپر بتایا گیا ہے، ہماری ویب ایپلیکیشن ہماری ایپلیکیشن کے Tomcat سیاق و سباق کو استعمال کر کے متاثر کر سکتی ہے/META-INF/context.xml
۔ اور ایک بہت ہی اہم ترتیبات جس پر ہم اثر انداز ہو سکتے ہیں وہ ہے سیکیورٹی ریلمز۔ سیکیورٹی ریلمز ایک قسم کا "سیکیورٹی ایریا" ہے۔ ایک علاقہ جس کے لیے مخصوص حفاظتی ترتیبات متعین ہیں۔ اسی مناسبت سے، سیکیورٹی کے دائرے کا استعمال کرتے وقت ہم اس دائرے کے لیے بیان کردہ سیکیورٹی سیٹنگز کا اطلاق کرتے ہیں۔ حفاظتی دائروں کا انتظام کنٹینر کے ذریعے کیا جاتا ہے، یعنی ویب سرور، ہماری ویب ایپلیکیشن نہیں۔ ہم سرور کو صرف یہ بتا سکتے ہیں کہ ہماری درخواست تک کس حفاظتی دائرہ کار کو بڑھانے کی ضرورت ہے۔ ٹومکیٹ دستاویزات سیکشن " دی ریئلم کمپوننٹ " میں ایک دائرے کو صارفین اور تصدیق کرنے کے لیے ان کے کردار کے بارے میں ڈیٹا کے مجموعے کے طور پر بیان کیا گیا ہے۔ Tomcat مختلف سیکورٹی دائرے کے نفاذ کا ایک سیٹ فراہم کرتا ہے، جن میں سے ایک " جاس دائرہ " ہے۔ تھوڑی سی اصطلاحات کو سمجھنے کے بعد، آئیے فائل میں Tomcat کے سیاق و سباق کو بیان کرتے ہیں /META-INF/context.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Realm className="org.apache.catalina.realm.JAASRealm"
appName="JaasLogin"
userClassNames="jaas.login.UserPrincipal"
roleClassNames="jaas.login.RolePrincipal"
configFile="jaas.config" />
</Context>
appName
- درخواست کا نام۔ Tomcat اس نام کو میں بیان کردہ ناموں کے ساتھ ملانے کی کوشش کرے گا configFile
۔ configFile
- یہ "لاگ ان کنفیگریشن فائل" ہے۔ اس کی ایک مثال JAAS دستاویزات میں دیکھی جا سکتی ہے: " ضمیمہ B: مثال لاگ ان کنفیگریشنز "۔ اس کے علاوہ، یہ ضروری ہے کہ اس فائل کو وسائل میں سب سے پہلے تلاش کیا جائے گا. لہذا، ہماری ویب ایپلیکیشن یہ فائل خود فراہم کر سکتی ہے۔ صفات userClassNames
اور roleClassNames
ان کلاسوں کا اشارہ پر مشتمل ہے جو صارف کے پرنسپل کی نمائندگی کرتی ہیں۔ JAAS "صارف" اور "کردار" کے تصورات کو دو مختلف تصورات کے طور پر الگ کرتا ہے java.security.Principal
۔ آئیے مندرجہ بالا کلاسوں کو بیان کرتے ہیں۔ آئیے صارف کے پرنسپل کے لیے آسان ترین نفاذ بنائیں:
public class UserPrincipal implements Principal {
private String name;
public UserPrincipal(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
}
ہم کے لیے بالکل وہی عمل دہرائیں گے RolePrincipal
۔ جیسا کہ آپ انٹرفیس سے دیکھ سکتے ہیں، پرنسپل کے لیے اہم چیز کچھ نام (یا ID) کو ذخیرہ کرنا اور واپس کرنا ہے جو پرنسپل کی نمائندگی کرتا ہے۔ اب، ہمارے پاس سیکیورٹی کا دائرہ ہے، ہمارے پاس پرنسپل کلاسز ہیں۔ configFile
" " وصف سے فائل کو بھرنا باقی ہے ، عرف login configuration file
۔ اس کی تفصیل Tomcat دستاویزات میں مل سکتی ہے: " The Realm Component "۔
\src\main\resources\jaas.config
آئیے اس فائل کے مواد کو ترتیب دیں:
JaasLogin {
jaas.login.JaasLoginModule required debug=true;
};
غور طلب ہے کہ context.xml
یہاں اور میں ایک ہی نام استعمال ہوا ہے۔ یہ لاگ ان موڈیول میں سیکیورٹی کے دائرے کا نقشہ بناتا ہے۔ لہذا، Tomcat سیاق و سباق نے ہمیں بتایا کہ کون سی کلاسز پرنسپلز کی نمائندگی کرتی ہیں، نیز کون سا LoginModule استعمال کرنا ہے۔ ہمیں بس اس لاگ ان موڈیول کو لاگو کرنا ہے۔ LoginModule شاید JAAS میں سب سے زیادہ دلچسپ چیزوں میں سے ایک ہے۔ باضابطہ دستاویزات لاگ ان موڈیول کو تیار کرنے میں ہماری مدد کرے گی: " Java Authentication and Authorization Service (JAAS): LoginModule Developer's Guide "۔ آئیے لاگ ان ماڈیول کو لاگو کرتے ہیں۔ آئیے ایک کلاس بنائیں جو انٹرفیس کو لاگو کرے LoginModule
:
public class JaasLoginModule implements LoginModule {
}
سب سے پہلے ہم ابتدائی طریقہ کی وضاحت کرتے ہیں LoginModule
:
private CallbackHandler handler;
private Subject subject;
@Override
public void initialize(Subject subject, CallbackHandler callbackHandler, <String, ?> sharedState, Map<String, ?> options) {
handler = callbackHandler;
this.subject = subject;
}
یہ طریقہ محفوظ کرے گا Subject
، جس کی ہم مزید تصدیق کریں گے اور پرنسپلز کے بارے میں معلومات بھریں گے۔ ہم مستقبل کے استعمال کے لیے بھی بچت کریں گے CallbackHandler
، جو ہمیں دیا گیا ہے۔ مدد سے، CallbackHandler
ہم تھوڑی دیر بعد تصدیق کے موضوع کے بارے میں مختلف معلومات کی درخواست کر سکتے ہیں۔ CallbackHandler
آپ دستاویزات کے متعلقہ حصے میں اس کے بارے میں مزید پڑھ سکتے ہیں: " JAAS حوالہ گائیڈ: CallbackHandler "۔ login
اگلا، توثیق کا طریقہ عمل میں لایا جاتا ہے Subject
۔ یہ تصدیق کا پہلا مرحلہ ہے:
@Override
public boolean login() throws LoginException {
// Добавляем колбэки
Callback[] callbacks = new Callback[2];
callbacks[0] = new NameCallback("login");
callbacks[1] = new PasswordCallback("password", true);
// При помощи колбэков получаем через CallbackHandler логин и пароль
try {
handler.handle(callbacks);
String name = ((NameCallback) callbacks[0]).getName();
String password = String.valueOf(((PasswordCallback) callbacks[1]).getPassword());
// Далее выполняем валидацию.
// Тут просто для примера проверяем определённые значения
if (name != null && name.equals("user123") && password != null && password.equals("pass123")) {
// Сохраняем информацию, которая будет использована в методе commit
// Не "пачкаем" Subject, т.к. не факт, что commit выполнится
// Для примера проставим группы вручную, "хардcodeно".
login = name;
userGroups = new ArrayList<String>();
userGroups.add("admin");
return true;
} else {
throw new LoginException("Authentication failed");
}
} catch (IOException | UnsupportedCallbackException e) {
throw new LoginException(e.getMessage());
}
}
یہ ضروری ہے کہ login
ہمیں تبدیل نہیں کرنا چاہئے Subject
۔ ایسی تبدیلیاں صرف تصدیق کے طریقہ کار میں ہونی چاہئیں commit
۔ اگلا، ہمیں کامیاب تصدیق کی تصدیق کا طریقہ بیان کرنا چاہیے:
@Override
public boolean commit() throws LoginException {
userPrincipal = new UserPrincipal(login);
subject.getPrincipals().add(userPrincipal);
if (userGroups != null && userGroups.size() > 0) {
for (String groupName : userGroups) {
rolePrincipal = new RolePrincipal(groupName);
subject.getPrincipals().add(rolePrincipal);
}
}
return true;
}
طریقہ کو الگ کرنا عجیب لگ سکتا ہے login
اور commit
. لیکن بات یہ ہے کہ لاگ ان ماڈیولز کو یکجا کیا جا سکتا ہے۔ اور کامیاب تصدیق کے لیے کئی لاگ ان ماڈیولز کا کامیابی سے کام کرنا ضروری ہو سکتا ہے۔ اور صرف اس صورت میں جب تمام ضروری ماڈیولز کام کر چکے ہوں، تب تبدیلیوں کو محفوظ کریں۔ یہ تصدیق کا دوسرا مرحلہ ہے۔ آئیے abort
اور طریقوں کے ساتھ ختم کریں logout
:
@Override
public boolean abort() throws LoginException {
return false;
}
@Override
public boolean logout() throws LoginException {
subject.getPrincipals().remove(userPrincipal);
subject.getPrincipals().remove(rolePrincipal);
return true;
}
اس طریقہ کو abort
کہا جاتا ہے جب تصدیق کا پہلا مرحلہ ناکام ہوجاتا ہے۔ اس طریقہ کو logout
کہا جاتا ہے جب سسٹم لاگ آؤٹ ہوتا ہے۔ ہمارے کو لاگو کرنے Login Module
اور اسے ترتیب دینے کے بعد Security Realm
، اب ہمیں web.xml
اس حقیقت کی نشاندہی کرنے کی ضرورت ہے کہ ہم ایک مخصوص استعمال کرنا چاہتے ہیں Login Config
:
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>JaasLogin</realm-name>
</login-config>
ہم نے اپنے سیکورٹی دائرے کا نام بیان کیا اور تصدیق کا طریقہ - BASIC بیان کیا۔ یہ توثیق کی ان اقسام میں سے ایک ہے جو Servlet API میں سیکشن " 13.6 Authentication " میں بیان کی گئی ہے۔ رہ گیا n
GO TO FULL VERSION