المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : شرح كامل للصالحيات في الدفلوبر مع الشرح .: الاوراكل :.



walid_8281500
03-23-2009, 05:30 AM
مقدمة
الأمن في نظم إدارة قواعد البيانات معقد، و القليل من مدراء قواعد البيانات، مدراء النظم، المدراء، و مطوري البرامج يفهمون كيفية تطبيق الأمن في نظم قواعد البيانات.

من خلال Oracle security يمكن عمل التالي:
- التحكم في الوصول إلى عناصر قاعدة البيانات ( Tables, Views, Rows, Columns, … ).
- إنشاء User profiles, Roles, Privileges.
- مراقبة العمليات التي تتم على قاعدة البيانات.

هذه النشرة تتضمن شرح لكيفية تطبيق الأمن في البرامج المصممة باستخدام Oracle Developer
والتي تقوم علي أساس إنشاء حساب فعلي في قاعدة البيانات لكل مستخدم ومنحه الصلاحيات اللازمة التي تتوافق مع طبيعة عمله في قاعدة البيانات .

الخطوات التي ستتبع في بناء هذا التطبيق
- Create users.
- Create tables.
- Create roles.
- Assign privileges to roles and users through the GRANT command.
- Build main form.
- Build menu.
- Assign roles to menu and sub-menus.
- Create forms that control the user creation and gave them privileges needed.
ملاحظة: سيتم استخدام Oracle8i، Developer6i لبناء هذا النظام.
العرض
إنشاء مستخدم و إعطاءه صلاحيات الاتصال بقاعدة البيانات:
لإنشاء مستخدم لا بد لك من تشغيل برنامج SQL Plus و الذي من خلاله يمكن التعامل مع الـ Oracle.
Start Button – All programs – OraHome81 – Application
Development – SQL Plus.
- بعد تشغيل SQL Plus ادخل اسم المستخدم و كلمة المرور system/manager





- نقوم بإنشاء مستخدم و الذي سيكون مالك للـ Objects التي سيتم انشاؤها مثل الـ Tables. و ذلك بكتابة جملة الـ DDL التالية:
Create User username Identified By password;
و ليكن:
Create user sv identified by sv;
- بعد انشاء المستخدم لا بد من منحه بعض صلاحيات النظام، مثل:
Oracle Default Roles
Role Name Type of Privileges
CONNECT Allows login and ability to create tables, views, synonyms, and data**** links.
RESOURCE Adds cluster, procedure, and trigger privileges.
DBA Complete authority to manage data**** and users. Can create users.
SYSOPER Ability to start up and shut down the data****.
SYSDBA All privileges available to the DBA role with the ability to create, start up, shut down, and recover a data****.

عن طريق كتابة جملة الـ DDL التالية:
Grant role_name/privilege_name To username;
و ليكن:
Grant connect, resource to sv;
- بعد اعطاء المستخدم الصلاحية للاتصال بقاعدة البيانات، نقوم بالاتصال بقاعدة البيانات عن طريق المستخدم الجديد الذي تم انشاؤه باستخدام جملة الـ SQL Plus:
Conn sv/sv;
- صلاحيات استخدام الـ Roles
من خلال الـ SQL Plus نستدعي الملفين:
SQL> @path\FRM60GRT.SQL يستدعى في كل مرة يتم فيها إنشاء مستخدم
SQL> @path\FRM60SEC.SQL يستدعى مرة واحدة بعد تثبيت الاوراكل

إنشاء الجداول
- سنقوم بإنشاء جدولين لهذا المستخدم و ذلك لاختبار إدخال و تحرير البيانات و هما DEPT و EMP، باستخدام جملة الـ DDL التالية:
Create table table_name
( field1 data type(length), field2 data type(length));
و ليكن:

Create table dept
( deptno number primary key,
dept_name varchar2(40) not null,
loc varchar2(100) not null);






Create table emp
( empno number primary key,
ename varchar2(60) not null,
job varchar2(60),
hiredate date not null,
sal number,
deptno number references dept(deptno));

إنشاء شريط قوائم Menu Bar

- لانشاء Menu Bar لا بد لك من تشغيل الـ Form Builder:
Start Button – All Programs – Oracle Forms6i – Form Builder.
- ننشيء شريط قوائم جديد و نسميه MAIN_MENU مثلاً.
- ثم بالضغط المزدوج على اسم الـ MENU ننتقل الى نافذة MENU EDITOR.
- و هناك نقوم بانشاء القوائم باستخدام الخيارات المتاحة.

- و في كل SUBMENU ندخل الى الـ PL-SQL EDITOR و نكتب الامر التالي:
NULL;

- بعد ذلك نقوم بعمل BUILD للقائمة:
FILE – ADMINISTRATION – COMPILE FILE ( CTRL + T )
- عند عمل BUIL للـ MENU يتم انشاء ملف تنفيذي MAIN_MENU . MMX.
- نقوم بحفظ الملف ( SOURCE FILE ) – MAIN_MENU . FMB.
- بعد ذلك سنقوم بإنشاء الـ FORMS التي سيتم ربطها مع الـ MENU.

إنشاء النماذج FORMS
- سنتطرق هنا إلى إنشاء مجموعة من النماذج و التي تختص بالتعامل مع المستخدم ( كيفية الإنشاء و الجمل البرمجية المكتوبة ). و هي:
NEW_USER.
DROP_USER.
CHANGE_PW.
PRIVILEGES.
- ملاحظة: جميع الـ FIELDS في هذا النموذج هي NON DATA**** ITEMS.

NEW_USER FORM:
- هذه النافذة تستخدم لإنشاء مستخدم جديد و إعطاءه الصلاحيات اللازمة للاتصال بقاعدة
البيانات.







- بعد تصميم النموذج أعلاه نقوم بكتابة الجمل البرمجية اللازمة لإنشاء المستخدم. كما يلي:
CREATE BUTTON
WHEN-NEW-FORM-INSTANCE TRIGGER
هذا الحدث ينطلق عند تشغيل النموذج. و يقوم بتسجيل الخروج من المستخدم الحالي، و من ثم يعمل تسجيل دخول للمستخدم System.

declare
un varchar2(10) := 'system';
pw varchar2(10) := 'manager';
begin
logout;
logon(un,pw);
end;

WHEN-BUTTON-PRESSED TRIGGER
ينطلق هذا الحدث عند الضغط على مفتاح " إنشاء " ، حيث يتم التأكد من ادخال اسم المستخدم، كلمة المرور، و التأكيد على كلمة المرور، و التأكد من تطابق كلمة المرور مع التأكيد. و من ثم انشاء المستخدم حسب الاسم و كلمة المرور المدخلتين.
declare
*****nuser number;
begin
if :un is null then
set_*****_property('*****_nu',*****_message_****,' Enter a user name');
*****nuser := show_*****('*****_nu');
go_item('un');
raise form_trigger_failure;
end if;
if :Pw is null then
set_*****_property('*****_nu',*****_message_****,' Enter a password');
*****nuser := show_*****('*****_nu');
go_item('pw');
raise form_trigger_failure;
end if;
if :confirm is null then
set_*****_property('*****_nu',*****_message_****,' Confirm the password');
*****nuser := show_*****('*****_nu');
go_item('confirm');
raise form_trigger_failure;
end if;
if :Pw != :confirm then
set_*****_property('*****_nu',*****_message_****,' The password doesn''t match the confirm password');
*****nuser := show_*****('*****_nu');
raise form_trigger_failure;
end if;
forms_ddl('create user '||:un||' identified by '||:Pw);

forms_ddl('grant connect,resource to '||:un);
forms_ddl('grant select on FRM50_ENABLED_ROLES to '||:un);
if not form_success then
set_*****_property('*****_nu',*****_message_****,' User name '''||upper(:un)||''' conflicts with another user or role name');
*****nuser := show_*****('*****_nu');
else
set_*****_property('*****_nu',*****_message_****,' User created');
*****nuser := show_*****('*****_nu');
logout;
logon(:global.un,:global.pw);
end if;
end;



PRIVS BUTTON
WHEN-BUTTON-PRESSED TRIGGER
ينطلق هذا الحدث عند الضغط على مفتاح " صلاحيات النظام " ، حيث يقوم بإنشاء Parameter يحمل اسم المستخدم، و يستدعي نموذج " الصلاحيات " حيث يتم تحديد الصلاحيات التي سيتعامل معها المستخدم.
declare
p_username paramlist;
begin
p_username := create_parameter_list('pl');
add_parameter(p_username,'p_un',****_parameter,:un );
new_form('d:\test\privs.fmx',no_rollback,no_query_ only,p_username);
end;

EXIT BUTTON
WHEN-BUTTON-PRESSED TRIGGER
ينطلق هذا الحدث عند الضغط على مفتاح " خروج " ، حيث يقوم بتسجيل الخروج من المستخدم الحالي، و من ثم تسجيل الدخول للمستخدم السابق.
logout;
logon(:global.un,:global.pw);
exit_form;









DROP_USER FORM:
- تستخدم هذه النافذة لحذف مستخدم.








DROP BUTTON
WHEN-BUTTON-PRESSED TRIGGER
ينطلق هذا الحدث عند الضغط على مفتاح " حذف "، حيث يقوم بحذف المستخدم الذي تم إدخاله في حقل " اسم المستخدم ". ويقوم بحذف الصلاحيات المخزنه في جدول Privs الذي سنتطرق إليه فيما بعد.
declare
*****nuser number;
begin
if :un is null then
set_*****_property('*****_du',*****_message_****,' Enter a user name');
*****nuser := show_*****('*****_du');
raise form_trigger_failure;
end if;
forms_ddl('drop user '||:un);
if not form_success then
set_*****_property('*****_du',*****_message_****,' User '''||upper(:un)||''' does not exist');
*****nuser := show_*****('*****_du');
else
set_*****_property('*****_du',*****_message_****,' User dropped');
*****nuser := show_*****('*****_du');
delete from scott.privs
where un = :un;
commit;
clear_form;
end if;
end;


CHANGE_PW FORM
- تستخدم هذه النافذة حتى يغير المستخدم كلمة مروره كل فترة.









CHANGE BUTTON
WHEN-BUTTON-PRESSED TRIGGER
ينطلق هذا الحدث عند الضغط على مفتاح " تغيير " ، حيث يقوم بالتأكد من ادخال كلمة المرور الحالية و الكلمة الجديدة و التأكيد، و من ثم يغير كلمة المرور حسب الكلمة المدخلة.
declare
*****cpw number;
begin
if :un is null then
set_*****_property('*****_cpw',*****_message_****, 'Enter a user name');
*****cpw := show_*****('*****_cpw');
go_item('un');
raise form_trigger_failure;
end if;
if :current_pw is null then
set_*****_property('*****_cpw',*****_message_****, 'Enter a current password');
*****cpw := show_*****('*****_cpw');
go_item('current_pw');
raise form_trigger_failure;
end if;
if :new_pw is null then
set_*****_property('*****_cpw',*****_message_****, 'Enter a new password');
*****cpw := show_*****('*****_cpw');
go_item('new_pw');
raise form_trigger_failure;
end if;
if :confirm is null then
set_*****_property('*****_cpw',*****_message_****, 'Confirm the password');
*****cpw := show_*****('*****_cpw');
go_item('confirm');
raise form_trigger_failure;
end if;

if :new_pw != :confirm then
set_*****_property('*****_cpw',*****_message_****, 'The password doesn''t match the confirm password');
*****cpw := show_*****('*****_cpw');
raise form_trigger_failure;
end if;
forms_ddl('alter user '||:un||' identified by '||:new_pw);
if not form_success then
set_*****_property('*****_cpw',*****_message_****, 'User name '''||upper(:un)||''' does not exist');
*****cpw := show_*****('*****_cpw');
else
set_*****_property('*****_cpw',*****_message_****, 'User altered');
*****cpw := show_*****('*****_cpw');
:global.pw := :new_pw;
clear_form;
logout;
logon(:global.un,:global.pw);
end if;
end;

PRIVILEGES FORM
- تستخدم هذه النافذة لمنح مستخدم جديد صلاحيات استخدام النظام من قِبل مدير النظام.



- هذه النافذة تحتوي على DATA**** BLOCK ، حيث يتم حفظ الصلاحيات في جدول تم إنشاؤه. ( هذا الجدول ننشئه تحت المستخدم SV الذي تم انشاؤه مسبقاً )
جملة انشاء الجدول الخاص بنافذة PRIVILEGES :
create table privs
( un varchar2(50),
log_out number(1),
change_pw number(1),
new_user number(1),
drop_user number(1),
privs number(1),
employ number(1),
department number(1),
calc number(1));


WHEN-BUTTON-PRESSED TRIGGER
ينطلق هذا الحدث عند تشغيل النموذج، و يقوم بتأكد من وجود قيمة للـ Parameter الذي تم تمريره من النموذج New User، اذا كان الـ Parameter لا يحمل قيمة اجعل حالة النموذج " ادخال استعلام " اذا أردت الاستعلام عن صلاحيات مستخدم مخزن مسبقاً، أما اذا كان الـ Parameter يحمل قيمة يتم اسناد قيمة الـ Parameter الى اسم المستخدم لكي لا يتم كتابته مرة اخرى، و من ثم يتم تحديد الصلاحيات.
if :parameter.p_un is null then
enter_query;
else
:un := :parameter.p_un;
end if;





LOG_OUT CHECKBOX
WHEN-CHECKBOX_CHECKED TRIGGER
ينطلق هذا الحدث عند عمل Check أو Uncheck على تسجيل خروج، ويقوم بمنح صلاحية تشغيل نافذة " تسجيل الدخول " أو سحبها.
check_user;
if checkbox_checked('log_out') then
forms_ddl('grant log_out to '||:un);
else
forms_ddl('revoke log_out from '||:un);
end if;

CHANGE_PW CHECKBOX
WHEN-CHECKBOX_CHECKED TRIGGER
ينطلق هذا الحدث عند عمل Check أو Uncheck على تغيير كلمة المرور، ويقوم بمنح صلاحية تشغيل نافذة " تغيير كلمة المرور " أو سحبها.

check_user;
if checkbox_checked('change_pw') then
forms_ddl('grant change_pw to '||:un);
else
forms_ddl('revoke change_pw from '||:un);
end if;

NEW_USER CHECKBOX
WHEN-CHECKBOX_CHECKED TRIGGER
ينطلق هذا الحدث عند عمل Check أو Uncheck على انشاء مستخدم جديد، ويقوم بمنح صلاحية تشغيل نافذة " مستخدم جديد " أو سحبها.
check_user;
if checkbox_checked('new_user') then
forms_ddl('grant new_user to '||:un);
else
forms_ddl('revoke new_user from '||:un);
end if;

DROP_USER CHECKBOX
WHEN-CHECKBOX_CHECKED TRIGGER
ينطلق هذا الحدث عند عمل Check أو Uncheck على حذف المستخدم، ويقوم بمنح صلاحية تشغيل نافذة " حذف مستخدم " أو سحبها.
check_user;
if checkbox_checked('drop_user') then
forms_ddl('grant drop_user to '||:un);
else
forms_ddl('revoke drop_user from '||:un);
end if;

PRIVS CHECKBOX
WHEN-CHECKBOX_CHECKED TRIGGER
ينطلق هذا الحدث عند عمل Check أو Uncheck على منح الصلاحيات، ويقوم بمنح صلاحية تشغيل نافذة " صلاحيات النظام " أو سحبها.
check_user;
if checkbox_checked('privs') then
forms_ddl('grant privs to '||:un);
else
forms_ddl('revoke privs from '||:un);
end if;

EMPLOY CHECKBOX
WHEN-CHECKBOX_CHECKED TRIGGER
ينطلق هذا الحدث عند عمل Check أو Uncheck على الموظفين، ويقوم بمنح صلاحية تشغيل نافذة " الموظفين " و صلاحية كاملة على الجدول Emp أو سحبها.
check_user;
if checkbox_checked('employ') then
forms_ddl('grant employ to '||:un);
forms_ddl('grant all on scott.emp to '||:un);
else
forms_ddl('revoke employ from '||:un);
forms_ddl('revoke all on scott.emp from '||:un);
end if;

DEPARTMENT CHECKBOX
WHEN-CHECKBOX_CHECKED TRIGGER
ينطلق هذا الحدث عند عمل Check أو Uncheck على الاقسام، ويقوم بمنح صلاحية تشغيل نافذة " الاقسام " و صلاحية كاملة على الجدول Deptأو سحبها.
check_user;
if checkbox_checked('departmnt') then
forms_ddl('grant departmnt to '||:un);
forms_ddl('grant all on scott.dept to '||:un);
else
forms_ddl('revoke departmnt from '||:un);
forms_ddl('revoke all on scott.dept from '||:un);
end if;

CALC CHECKBOX
WHEN-CHECKBOX_CHECKED TRIGGER
ينطلق هذا الحدث عند عمل Check أو Uncheck على الآلة الحاسبة، ويقوم بمنح صلاحية تشغيل نافذة " الآلة الحاسبة " أو سحبها.
check_user;
if checkbox_checked('calc') then
forms_ddl('grant calc to '||:un);
else
forms_ddl('revoke calc from '||:un);
end if;

SAVE BUTTON
WHEN-BUTTON-PRESSED TRIGGER
يقوم بعمل حفظ للنموذج.
Commit;

- سبق و تم انشاء Two tables و هما Emp, Dept ، و للتعامل مع هذه الجداول بشكل أسهل نقوم بإنشاء نموذجين بالاعتماد على الجدولين المذكورين.

انشاء الـ Roles

- A role :
A role is a named collection of privileges. A role may be assigned to a user, but a user cannot be assigned to a role. For example, users can log into the data****; roles cannot. A user can own objects while a role cannot. The function of a role is to group logically associated privileges and allow those privileges to be passed to a user by referencing the role.
هي عبارة عن مجموعة من الصلاحيات، يمكن إسنادها للمستخدم.
- لإنشاء Role يجب أن يملك المستخدم ( SV ) صلاحية لعمل ذلك أو يمكن الاتصال عن طريق المستخدم system/manager و من هناك يمكن عمل ذلك.

- لإعطاء الصلاحية للمستخدم ( SV ) بإنشاء Roles :

Conn system/manager ( SQL Plus بداخل نافذة )
Grant dba to sv; ( DBA is a ROLE )


- الآن سنقوم بإنشاء الـ Roles حسب الـ Menu Module الذي أنشأناه سابقاً.

- يوجد في الـ Menu أعلاه قائمتين، مجموع الأوامر أو الخيارات في القائمتين يساوي 8.
إذاً يمكننا إنشاء 8 Roles. و لتكن أسماء الـ Roles كالتالي:
- Log_out.
- New_user.
- Drop_user.
- Change_pw.
- Privs.
- Employ.
- Departmnt.
- Calc.

- كما ذكرنا سالفاً يمكن إنشاء الـ Roles من خلال الاتصال بالنظام عن طريق
system/manager أو منح المستخدم SV الـ DBA Role و إنشاءها من هناك.







- جملة انشاء الـ Role:
Create role role_name;

- Create role Log_out;
- Create role New_user;
- Create role Drop_user;
- Create role Change_pw;
- Create role Privs;
- Create role Employ;
- Create role Departmnt;
- Create role Calc;
- الـ ( Employ, Departmnt Roles ) يتم منحهم للمستخدم الذي
سيتصل بقاعدة البيانات لادخال، تعديل الجدولين Emp, Dept لذلك سنقوم بمنح
Employ, Departmnt Roles صلاحيات عمل كل شيء على هذين الجدولين
و بالتالي يتم منحهم للمستخدم:
Conn sv/sv;
Grant all on emp to employ;
Grant all on dept to department;

ربط الـ Menu مع الـ Form
- نقوم بفتح الـ Main_form الذي تم إنشاؤه مسبقاً.
- من نافذة الـ Object Navigator ندخل الى خصائص ( Property Palette ) الخاصة
بالـ Form Module .
- في خاصية Menu Module نضع إسم الـ Menu مع مسارها.
- هكذا نكون قد ربطنا الـ Menu مع الـ Form.
إسناد الـ Roles الى الـ Menu

- نقوم بتشغيل الـ Form builder و نستدعي الملف Main_Menu .
- من خصائص الـ Main_Menu، نجعل الخاصية USE SECURITY = YES،
و نُدخل في الخاصية MODULE ROLES أسماء الـ Roles التي أنشأناها مسبقاً و هي:
Log_out. New_user.
Drop_user. Change_pw.
Privs. Employ.
Departmnt. Calc.
- كما نعلم أن الـ Menu يوجد بها Submenus و لا بد من توزيع الـ Roles عليها.
- Exit القائمة الفرعية الاولى:
بما أن الامر Exit يستخدم من جميع المستخدمين، نقوم بإسناد جميع الـ Roles لها.
و ذلك بالدخول الى خصائصها ( Property Palette ):
الخاصية Item Roles : نختار منها جميع الـ Roles.
- System القائمة الفرعية الثانية:
نُسند إليها الـ Roles المعنية بها و هي:
Log_out. New_user.
Drop_user. Change_pw.
Privs.
- Windows القائمة الفرعية الثالثة:
نُسند إليها الـ Roles المعنية بها و هي:
Employ. Departmnt.
Calc.


ربط الـ Forms مع الـ Menu

- من نافذة الـ Object Navigator في الـ Form Builder نقوم بإستدعاء الملف
Main_Menu.mmb.

- النماذج التي سنربطها مع القائمة:
New_User Drop_User Change_Pw
Privs Employee Department

- لنأخذ مثلاً الـ Menu Item New User ، ندخل الى الـ PL/SQL Editor
و نكتب ما يلي:
open_form('d:\test\new_user.fmx');

open_form : اجراء يستخدم لاستدعاء نموذج مع كتابة مسار الملف
المراد استدعاءه.

- و نكرر العملية مع كل الـ Menu Items مع تغيير اسم الملف.



- بالنسبة للـ Log_out Menu Item ، تستخدم لعمل تسجيل خروج من النظام.

declare
un varchar2(40);
pw varchar2(40);
begin
logout;
logon_screen;
un := get_application_property(username);
pw := get_application_property(password);
logon(un,pw);
:global.un := un;
:global.pw := pw;
copy(upper(un),'main_blk.u');
replace_menu('d:\test\main_menu.mmx');
end;


- بالنسبة للـ Calc Menu Item ، عند اختيارها تفتح نافذة الآلة الحاسبة التابعة
لنظام التشغيل windows.
Host('c:\windows\system32\calc.exe’);
Host : Executes an indicated operating system command.

مع التحية