簡體   English   中英

Oracle Apex 中的授權和用戶角色?

[英]Authorization and user roles in Oracle Apex?

因此,Apex 擁有“工作區”,可讓您創建三種類型的用戶 - 所有這些用戶本質上都是組織內部的。 此外,Apex 上單個站點的開發人員似乎沒有辦法只為他的站點擁有“用戶”。

我錯過了什么嗎?

我需要能夠讓外部(業務)用戶能夠訪問網站的某些功能,例如,會計只能看到頁面 A 和 B,而管理人員可以看到 A、B 和 C。

我需要有能力擁有不同程度的訪問權限的幾組人。

這只能通過創建工作區/組來完成嗎? 或者可以僅在我的網站上內部完成嗎?

盡管 APEX 有一個名為“組”的內置用戶管理概念,但我必須承認我從未使用過它,並且快速閱讀文檔並沒有讓我清楚您如何使用它們來控制訪問(但請參閱Tom 的回答在這里)。

您可能需要在數據庫中創建用戶/角色表,並將這些表與 APEX 授權方案結合使用來控制對頁面的訪問。 可以使用函數體創建類型為“PL/SQL 函數返回布爾值”的單個授權方案:

return my_auth_pkg.is_authorized (p_user    => :app_user,
                                  p_app_id  => :app_id
                                  p_page_id => :app_page_id);

然后,您將實現該包以查找用戶的權限並決定是為應用程序和頁面 ID 返回 TRUE 還是 FALSE。在此處輸入圖片說明

或者,您可以直接在授權方案中執行 SQL 來檢查訪問:在此處輸入圖片說明

(注意“user_roles”和“role_pages”是我編的名字,代表你的表)

我只想擴展托尼的回答,這本身就是正確的。 我只想向您展示另一種方式,我認為這對初學者來說會更容易,並且省略了表格的創建。

如果您的應用程序使用 Apex 作為身份驗證方案,那么您的用戶將通過工作區本身的管理進行管理。 您可以創建、編輯和刪除用戶,但也可以定義組並將用戶鏈接到組。 您可以創建多個“最終用戶”類型的用戶,並定義幾個組,例如“Executives”。

Apex 用戶和組創建一個組 創建組后,轉到要分配此組的用戶,然后將該組添加到該用戶的組中

向用戶添加組

完成設置后,您仍然需要授權方案。 事實仍然是您需要一些 pl/sql 知識,但由於一些方便的 api 工作,可以將編碼保持在最低限度。基於頂點組定義授權 current_user_in_group執行它所說的:它檢查當前用戶是否已分配了所述組。 通過使用一些簡單的 IF 結構進行一些擴展,您可以將其提升一點!

並不是說我完全推薦這種方法,我自己覺得它有點乏味,並且您需要有人進入 APEX 來實際維護用戶及其組,但這很可能在您的環境中是可以接受的。 但是,您可以使用它開始。 您可以非常輕松地切換身份驗證方案,並通過更改您的授權方案使其符合新的身份驗證方案,之后您可以輕松快速地進行調整。 當然,這取決於您的優先事項和目標。

授權是確定是否允許經過身份驗證/身份驗證的人訪問資源或執行操作的過程。 它基於分配給用戶的一組權限或角色。 例如,在 Oracle 數據庫中,管理員具有調度作業的權限,而用戶則不能。 授權與身份驗證有何不同? 身份驗證和授權通常一起工作。 換句話說,授權遵循身份驗證。 身份驗證決定你是誰? 授權決定你可以做什么?

我知道這已經很老了,但 Google 把我帶到了這里,所以我會盡量帶上我的五美分。 Tom 的回答對我幫助很大,但我想利用 APEX 的團體補助金。 例如我有用戶組:基本用戶、高級用戶和管理員用戶。 較高的用戶級別也應該可以訪問較低級別的應用程序/頁面。 如果我使用 APEX_UTIL.CURRENT_USER_IN_GROUP,我需要檢查所有應該具有訪問權限的組。 如果我添加另一個用戶組,則必須將該組添加到每個應用程序的授權方案中。 而且所有用戶都需要在他們有權訪問的所有組中。

我的解決方案是還檢查 APEX 中的 Group Grants。 首先,我將用戶添加到管理員用戶組。 之后,我將基本用戶和高級用戶組添加到管理員用戶組。 這還不夠,APEX 不會授予基本用戶應用的管理員用戶訪問權限,APEX_UTIL.CURRENT_USER_IN_GROUP 也不知道這些。 所以我對PL/SQL做了一些調整,我的授權方案如下:

DECLARE
    isInGroup BOOLEAN;
    userID    NUMBER(30);
    authGroup VARCHAR2(40);
    
    BEGIN
        authGroup := 'Basic User';                  -- User group to look for
        isInGroup := false;
        userID    := APEX_UTIL.GET_CURRENT_USER_ID;
    
        FOR a IN (
            SELECT wf.group_name AS group FROM wwv_flow_group_users wf WHERE wf.user_id = userID
            UNION
            SELECT gg.group_name FROM wwv_flow_group_users gu 
            RIGHT JOIN apex_workspace_group_groups gg ON gg.grantee_name = gu.group_name
            WHERE user_id = userID) 
        LOOP
            IF a.group = authGroup THEN
                isInGroup := true;
            END IF;
        END LOOP;
    
    RETURN isInGroup;
    END;

UNION 之前的第一個 SELECT 獲取當前用戶所屬的所有組的名稱,在我的情況下只有管理員用戶。 UNION 之后的第二個 SELECT 是第一個選擇中的組授予訪問權限的所有組的列表。 就我而言,基本用戶和高級用戶。 這整個組在 LOOP 中迭代,如果其中一個組等於開頭定義的 authGroup,則返回 true。

這樣我就可以只將新用戶添加到他們合適的組中,他們也可以訪問較低級別的應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM