امنیت در JSP
در سری مقالات آموزش Java Enterprise, به مبحث امنیت در JSP میپردازیم.
تا به اینجا مباحثی پیرامون JSP و Servlet ها بررسی شد. اما یکی از مهم ترین ویژگی های هر برنامه ای (مخصوصا برنامه های تحت وب) امنیت برنامه است.. مطمئنا هر زبان برنامه نویسی یکسری تدابیر برای تضمین امنیت برنامه های نوشته شده با آن زبان تعیین کرده است و مسلما زبان جاوا نیز از این قاعده مستثنی نیست. در Web Application ها, میتوان با تعیین role ها, نسبت به امن کردن منابع اقدام کرد.
تامین امنیت Web Application ها به دو دسته Declarative و Programmatic تقسیم میشود. Declarative Security به معنای تدابیری است که با استفاده از تنظیمات Web Application, برای آن تعیین میشود. این تنظیمات در web.xml انجام میشود. Programmatic Security نیز روش هایی است که با استفاده از کد های برنامه نویسی و بررسی request object ایمنی برنامه را تامین میکند.
ایمنی به این معنا است سطوح دسترسی برای منابع هر برنامه تعیین شود. به این ترتیب نیاز است تا علاوه بر احراز هویت کاربر, سطوح دستری وی را نیز مشخص کنیم. اساسا احراز هویت به چهار دسته تقسیم میشود:
- HTTP Basic : در این روش کاربر برای دسترسی به منابع باید احراز هویت شود. به این معنا که برای دسترسی به منبع مورد نظر باید نام کاربری و رمز عبور خود را وارد کند
- HTTP Digest : این روش بر پایه روش قبلی است با این تفاوت که نیاز است تا رمزعبور به حالت رمز شده ارسال شود
- HTTP Client : در این روش با استفاده از SSL یک ارتباط بین Client و Server ایجاد میشود و احراز هویت انجام میشود
- Form Based : در این روش با استفاده از یک فرم اطلاعات کاربر را دریافت و مجوز وی برای دسترسی به منابع را بررسی میکنیم (مانند مقاله طراحی فرم ورود)
برای استفاده از روش های فوق نیاز است تا آنها را در برنامه تعریف کنیم. توجه داشته باشید که موارد فوق از دسته Declarative Security هستند. بنابراین نیاز است تا در web.xml تعریف شوند. در web.xml به این صورت میتوان روش احراز هویت را تعیین کرد:
<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"> <login-config> <auth-method>BASIC</auth-method> </login-config> </web-app>
اگر بخواهیم از روش Form Based استفاده کنیم نیاز است تا علاوه بر مشخص کردن متد احراز هویت اطلاعات مربوط به Form را نیز تکمیل کنیم
<login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>failed.jsp</form-error-page> </form-login-config> </login-config>
در ادامه از مفهومی به نام Role Based Security, برای احراز هویت و مشخص کردن سطوح دسترسی به منابع استفاده میشود. به این ترتیب منابع با استفاده از role ها محدود و دسته بندی میشوند. میتوان role هایی را در Tomcat تعریف کرد. برای تعریف این role ها نیاز است تا به محل نصب Tomcat بروید و از پوشه Conf فایل tomcat-users.xml را ویرایش کنید.
<role rolename="manager-gui"/> <role rolename="manager-status"/> <!-- Zero To Hero Role --> <user username="admin" password="admin" role="manager-gui,manager-status" />
میتوان به یک کاربر چندین role را اختصاص داد.
<security-constraint> <web-resource-collection> <web-resource-name>Zero To Hero Private Resources</web-resource-name> <url-pattern>/index.jsp</url-pattern> <http-method>GET</http-method> </web-resource-collection> <auth-constraint> <description>Security Example</description> <role-name>ZHRole</role-name> </auth-constraint> </security-constraint> <security-role> <role-name>ZHRole</role-name> </security-role>
در کد بالا یک سطح امنیتی را برای برنامه مشخص کرده ایم:
- Web resource Name : یک نام دلخواه مشخص میکنیم
- URL Pattern : آدرس منبعی که میخواهیم این قوانین بر آن اعمال شود را مشخص کند
- HTTP Method : متد Request را مشخص میکند
- Auth Constraint : در این tag باید Role مورد نظر مشخص شود و آن را در قسمت role name مشخص میکنیم
- Security Role : در این قسمت میتوان یک Role برای این سطح دسترسی مشخص کرد
و در پایان روش Authentication را مشخص میکنیم
<security-constraint> <web-resource-collection> <web-resource-name>Zero To Hero Private Resources</web-resource-name> <url-pattern>/index.jsp</url-pattern> <http-method>GET</http-method> </web-resource-collection> <auth-constraint> <description>Security Example</description> <role-name>ZHRole</role-name> </auth-constraint> </security-constraint> <security-role> <role-name>ZHRole</role-name> </security-role> <login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/failed.jsp</form-error-page> </form-login-config> </login-config>
اکنون اگر کاربر به صفحه اصلی Web Application در خواست دهد, به فرم ورود هدایت میشود.
در کنار Declarative Security از Programmatic Security برای افزایش ضریب ایمنی برنامه استفاده میشود. همانطور که در مقالات قبل بررسی شد, Request درقالب یک object از کلاس HttpServletRequest است. همانطور که مشخص است, متد هایی در این کلاس برای احراز هویت کاربر وجود دارد.
if (req.isUserInRole("admin")) { // code }
برای مثال در کد فوق Role را بررسی میکند.
سری مقالات آموزش JSP و Servlet به پایان رسیده است. در مقاله بعد به سری مقالات Hibernate در Java Enterprise میپردازیم.
سری مقالات آموزش Java Enterprise ادامه دارد.
با ما همراه باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.