【问题标题】:Oracle Roles in VB.net Winforms applicationVB.net Winforms 应用程序中的 Oracle 角色
【发布时间】:2025-11-29 17:45:01
【问题描述】:

我正在使用通过 ODAC 连接的 VB.Net 和 Oracle 11g 来构建桌面应用程序,这应该很简单,但我遇到了一个问题。

我在 Oracle 数据库上定义了我的安全角色和用户,我的意图是根据每个角色显示菜单(即管理员应该看到每个菜单,而用户只能看到相关菜单)我的问题是如何实现?

我正在创建一个包含用户名和角色的单独表,但我敢打赌有更好的方法来处理这个问题。目前愿意接受所有建议

【问题讨论】:

  • 我们通过使用登录表单来获取用户和安全级别(在我们的例子中是从 0 到 9 的 int),然后使用 TreeView 对象作为菜单并且仅根据用户的安全级别显示菜单选项与我们在程序中编码的每个菜单选项的预定安全级别。如果用户安全性高于菜单项安全性,则显示,反之亦然。希望这能让你有所收获。

标签: sql vb.net winforms oracle


【解决方案1】:

您可以使用函数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 更易于使用,因为它还涵盖了角色的层次结构,即当一个角色被授予另一个角色时。

【讨论】:

  • 我会采取这种方式,让你知道结果
【解决方案2】:

在 Oracle 中使用活动目录角色和用户填充表是一种常用的解决方案。 Oracle 有一个 DBMS_LDAP 包来访问 Active Directory,因此您可以获得应用程序的组列表。我建议为您的应用中使用的角色添加前缀,例如 MyApp_admin、MyApp_user。

然后运行计划作业以获取组中的用户并将其填充到 类似这样的伪代码表

TABLE GROUP_USER ( ID NUMBER(9) 主键, GROUP_NAME VARCHAR2(250), USER_NAME VARCHAR2(250));

  • 这将安全性置于企业级
  • 允许使用 sys_context('USERENV','OS_USER') 进行单点登录

【讨论】:

    最近更新 更多