2015-04-06 42 views
0

我正在使用VB.Net和Oracle 11g連接通過ODAC來構建桌面應用程序,它應該非常簡單,但我面臨着一種情況。在VB.net中的Oracle角色Winforms應用程序

我有我的安全角色和用戶在Oracle數據庫上定義,我的意圖是根據每個角色顯示菜單(即管理員應該看到每個菜單,而用戶只有相關的菜單)我的問題是如何完成?

我正在創建一個帶有用戶名和角色的單獨表格,但我敢打賭,有一個更好的方法來處理這個問題。現在願意採取所有建議

+0

我們通過使用登錄表單來獲取用戶和安全級別(在我們的例子中爲從0到9的int),然後使用'TreeView'對象作爲菜單並僅顯示基於用戶的安全級別與我們在程序中編寫的每個菜單選項的預定安全級別之間的關係。如果用戶安全性高於菜單項安全性,則會顯示,反之亦然。希望能給你一些工作。 – RianBattle 2015-04-06 14:01:29

回答

0

您可以使用功能DBMS_SESSION.IS_ROLE_ENABLED來獲取這些信息。

PL/SQL部分會是這樣

CREATE OR REPLACE FUNCTION IsRoleGranted(RoleName IN VARCHAR2) RETURN Integer IS 
BEGIN 
    IF DBMS_SESSION.IS_ROLE_ENABLED(RoleName) THEN 
     RETURN 1; 
    ELSE 
     RETURN 0; 
    END IF; 
END IsRoleGranted; 

在VB.NET您的通話功能是這樣的:

Dim cmd As OracleCommand 
    Dim con As OracleConnection 
    con = New ... 

    cmd = New OracleCommand("BEGIN IsRoleGranted(:role); END;" con) 
    cmd.CommandType = CommandType.Text 
    cmd.Parameters.Add("res", OracleDbType.Byte, ParameterDirection.ReturnValue) 
    cmd.Parameters("res").DbType = DbType.Byte 
    cmd.Parameters.Add("role", OracleDbType.Varchar2, ParameterDirection.Input).Value = "MYAPP_ADMIN" 
    cmd.ExecuteNonQuery() 
    AdminMenu.Visible = CByte(cmd.Parameters("res").Value) = 1 

DBMS_SESSION.IS_ROLE_ENABLED是很容易,查詢視圖SESSION_ROLES使用,因爲它也涵蓋了角色的層次結構,即角色被授予另一角色時的角色。

+0

我會採取這種方法,會讓你知道結果 – chinchillaboy 2015-04-08 20:19:45

0

在Oracle中使用活動目錄角色和用戶填充表是常用的解決方案。 Oracle有一個DBMS_LDAP包來訪問Active Directory,因此您可以獲取應用程序的組列表。我建議在您的應用中使用的角色的前綴,例如MyApp_admin,MyApp_user。

然後運行計劃工作,讓那些在羣體中的用戶,並將其填充到 這樣的僞碼錶

表GROUP_USER( ID號(9)主鍵, GROUP_NAME VARCHAR2(250 ), USER_NAME VARCHAR2(250));

  • 這使得安全在企業層面
  • 允許單點登錄的使用SYS_CONTEXT(「USERENV」,「OS_USER」)的可能性
相關問題