Xác thực trong Oracle APEX

Tác giả CCNACCNP, T.Tư 19, 2019, 04:14:49 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Xác thực trong Oracle APEX


1. Giới thiệu

    Tài liệu này dựa trên:  Oracle APEX 5.0

2. Xác thực mặc định của APEX

    Khi bạn tạo một ứng dụng Oracle APEX, trang đăng nhập mặc định được tạo với số trang là 101. Đăng nhập mặc định sử dụng xác thực APEX, có nghĩa là bạn phải nhập tên người dùng và mật khẩu được tạo bởi Quản trị viên APEX. Trong trường hợp bạn có một bảng riêng để lưu thông tin người dùng, bạn cần tùy chỉnh xác thực.
    OK đây là trang đăng nhập mặc định được tạo:


3. Tập lệnh SQL

    Để 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à tạo gói.
    Tạo bảng USER_ACCOUNT:

Mã nguồn [Chọn]
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

Mã nguồn [Chọn]
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
 
        -- Write to Session, Notification must enter a username and 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
     
           -- Write to Session, User not found.
           Apex_Util.Set_Session_State('LOGIN_MESSAGE'
                                      ,'User not found');
           Return False;
     End;
     If v_Password <> p_Password Then
   
        -- Write to Session, Password incorrect.
        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;
     ---
     -- Write user information to Session.
     --
     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
        -- Redirect to Page 1 (Home Page).
        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
        -- Login Failure, redirect to page 101 (Login Page).
        Owa_Util.Redirect_Url('f?p=&APP_ID.:101:&SESSION.');
     End If;
  End;
 
End Pkg_Security;

4. Khai báo các mục ứng dụng

Nhấp vào "Thành phần được chia sẻ", ở đây cho phép bạn khai báo "Mục ứng dụng", đó là các mục sẽ được sử dụng trong ứng dụng của bạn.






Nhập tên cho Mục ứng dụng là "LOG_MESSAGE", giá trị của nó là thuộc tính "LOGIN_MESSAGE" của Phiên, bạn có thể đặt giá trị của nó trong PL / SQL:

Mã nguồn [Chọn]
Apex_Util.Set_Session_State('LOGIN_MESSAGE'
                                             ,'User not found');




Tương tự, bạn tạo 2 Mục ứng dụng:

Mã nguồn [Chọn]
SESSION_USER_NAME
SESSION_EMAIL


5. Tùy chỉnh Xác thực

    Mở trang ĐĂNG NHẬP trong Trình thiết kế trang APEX:


Tạo khu vực mới:





Thay đổi các thuộc tính cho Vùng mới được tạo.


Đặt điều kiện hiển thị cho Vùng này.






Tiếp theo, bạn phải sửa đổi quy trình xử lý mã khi người dùng nhấp vào nút Gửi.


PL/SQL Code:

Mã nguồn [Chọn]
Pkg_Security.Process_Login(:P101_USERNAME,
                           :P101_PASSWORD,
                           :APP_ID);


Lưu và chạy ứng dụng của bạn: