Tùy chỉnh xác thực trong Oracle APEX
Xem thêm các chuyên mục:

Là một website được viết trên công nghệ web Flutter vì vậy hỗ trợ rất tốt cho người học, kể cả những người học khó tính nhất.
Hiện tại website đang tiếp tục được cập nhập nội dung cho phong phú và đầy đủ hơn. Mong các bạn nghé thăm và ủng hộ website mới của chúng tôi.


Tài liệu được viết dựa trên:
-
Oracle APEX 5.0
Khi bạn tạo một ứng dụng Oracle APEX, mặc định trang login được tạo ra với mã số trang (page number) là 101. Mặc định việc login sử dụng cách xác thực của APEX (APEX authentication), nghĩa là bạn phải nhập vào username và password được tạo ra bởi APEX Admin. Trong trường hợp bạn có một bảng riêng để tạo lưu thông tin người dùng, bạn cần phải tùy biến xác thực.
OK đây là trang login mặc định được tạo ra:

Để bắt đầu ví dụ này, bạn cần chạy Script để tạo bảng lưu trữ người dùng và các package để xử lý đăng nhập (login).
Tạo bảng USER_ACCOUNT:
create table USER_ACCOUNT
(
USER_NAME VARCHAR2(30) not null,
PASSWORD VARCHAR2(30) not null,
USER_TYPE VARCHAR2(10) not null,
ACTIVE VARCHAR2(1) not null,
EMAIL VARCHAR2(64) not null,
FULL_NAME VARCHAR2(64) not null
) ;
alter table USER_ACCOUNT
add constraint USER_ACCOUNT_PK primary key (USER_NAME) ;
alter table USER_ACCOUNT
add constraint USER_ACCOUNT_UK unique (EMAIL) ;
-----------------------------------
insert into user_account (USER_NAME, PASSWORD, USER_TYPE,
ACTIVE, EMAIL, FULL_NAME)
values ('tom', 'tom123', 'admin', 'Y', '[email protected]', 'Tom');
insert into user_account (USER_NAME, PASSWORD, USER_TYPE,
ACTIVE, EMAIL, FULL_NAME)
values ('jerry', 'jerry123', 'user', 'Y', '[email protected]', 'Jerry');
insert into user_account (USER_NAME, PASSWORD, USER_TYPE,
ACTIVE, EMAIL, FULL_NAME)
values ('donald', 'donald123', 'guest', 'N', '[email protected]', 'Donald');
Commit;
PKG_SECURITY
Create Or Replace Package Pkg_Security Is
Function Authenticate_User(p_User_Name Varchar2
,p_Password Varchar2) Return Boolean;
-----
Procedure Process_Login(p_User_Name Varchar2
,p_Password Varchar2
,p_App_Id Number);
End Pkg_Security;
/
Create Or Replace Package Body Pkg_Security Is
Function Authenticate_User(p_User_Name Varchar2
,p_Password Varchar2) Return Boolean As
v_Password User_Account.Password%Type;
v_Active User_Account.Active%Type;
v_Email User_Account.Email%Type;
Begin
If p_User_Name Is Null Or p_Password Is Null Then
-- Thông báo nhập user name và password.
Apex_Util.Set_Session_State('LOGIN_MESSAGE'
,'Please enter Username and password.');
Return False;
End If;
----
Begin
Select u.Active
,u.Password
,u.Email
Into v_Active
,v_Password
,v_Email
From User_Account u
Where u.User_Name = p_User_Name;
Exception
When No_Data_Found Then
-- Ghi vào Session user không tồn tại.
Apex_Util.Set_Session_State('LOGIN_MESSAGE'
,'User not found');
Return False;
End;
If v_Password <> p_Password Then
-- Thông báo mật khẩu không chính xác.
Apex_Util.Set_Session_State('LOGIN_MESSAGE'
,'Password incorrect');
Return False;
End If;
If v_Active <> 'Y' Then
Apex_Util.Set_Session_State('LOGIN_MESSAGE'
,'User locked, please contact admin');
Return False;
End If;
---
-- Ghi các thông tin người dùng vào Session (Để sử dụng về sau).
--
Apex_Util.Set_Session_State('SESSION_USER_NAME'
,p_User_Name);
Apex_Util.Set_Session_State('SESSION_EMAIL'
,v_Email);
---
---
Return True;
End;
--------------------------------------
Procedure Process_Login(p_User_Name Varchar2
,p_Password Varchar2
,p_App_Id Number) As
v_Result Boolean := False;
Begin
v_Result := Authenticate_User(p_User_Name
,p_Password);
If v_Result = True Then
-- Chuyển tới trang 1 theo mặc định (Trang HOME).
Wwv_Flow_Custom_Auth_Std.Post_Login(p_User_Name -- p_User_Name
,p_Password -- p_Password
,v('APP_SESSION') -- p_Session_Id
,p_App_Id || ':1' -- p_Flow_page
);
Else
-- Chuyển về trang login
Owa_Util.Redirect_Url('f?p=&APP_ID.:101:&SESSION.');
End If;
End;
End Pkg_Security;
/
Click vào mục "Shared Component" ở đây cho phép bạn khai báo các "Application Items", nó là các items sẽ được sử dụng trong ứng dụng của bạn.



Nhập vào một Application Items với tên "LOGIN_MESSAGE", giá trị của nó chính là thuộc tính "LOGIN_MESSAGE" của Session, bạn có thể sét đặt giá trị của nó trong PL/SQL:
Apex_Util.Set_Session_State('LOGIN_MESSAGE'
,'User not found');


Tương tự bạn tạo thêm 2 Application Items khác:
- SESSION_USER_NAME
- SESSION_EMAIL

Mở trang LOGIN trên APEX Page Designer:

Thêm mới Region:


Thay đổi các thuộc tính cho Region vừa tạo ra.

Sét đặt điều kiện Region này hiển thị



Tiếp theo bạn phải sửa đổi code xử lý Process khi người dùng click vào nút Submit.

- PL/SQL Code:
Pkg_Security.Process_Login(:P101_USERNAME,
:P101_PASSWORD,
:APP_ID);

Save và chạy lại ứng dụng:

