gpt4 book ai didi

oracle - 如何使用 Oracle dbms_ldap 包获取 LDAP 组名称?

转载 作者:行者123 更新时间:2023-12-01 23:32:42 28 4
gpt4 key购买 nike

我使用此示例并成功连接到 LDAP 服务器 - http://www.oracle-base.com/articles/9i/ldap-from-plsql-9i.php .

SET SERVEROUTPUT ON SIZE 1000000
DECLARE
-- Adjust as necessary.
l_ldap_host VARCHAR2(256) := 'server01.tshcomputing.com';
l_ldap_port VARCHAR2(256) := '389';
l_ldap_user VARCHAR2(256) := 'cn=orcladmin';
l_ldap_passwd VARCHAR2(256) := 'password';
l_ldap_base VARCHAR2(256) := 'cn=Users,dc=tshcomputing,dc=com';

l_retval PLS_INTEGER;
l_session DBMS_LDAP.session;
l_attrs DBMS_LDAP.string_collection;
l_message DBMS_LDAP.message;
l_entry DBMS_LDAP.message;
l_attr_name VARCHAR2(256);
l_ber_element DBMS_LDAP.ber_element;
l_vals DBMS_LDAP.string_collection;

BEGIN
-- Choose to raise exceptions.
DBMS_LDAP.USE_EXCEPTION := TRUE;

-- Connect to the LDAP server.
l_session := DBMS_LDAP.init(hostname => l_ldap_host,
portnum => l_ldap_port);

l_retval := DBMS_LDAP.simple_bind_s(ld => l_session,
dn => l_ldap_user,
passwd => l_ldap_passwd);

-- Get all attributes
l_attrs(1) := '*'; -- retrieve all attributes
l_retval := DBMS_LDAP.search_s(ld => l_session,
base => l_ldap_base,
scope => DBMS_LDAP.SCOPE_SUBTREE,
filter => 'objectclass=*',
attrs => l_attrs,
attronly => 0,
res => l_message);

IF DBMS_LDAP.count_entries(ld => l_session, msg => l_message) > 0 THEN
-- Get all the entries returned by our search.
l_entry := DBMS_LDAP.first_entry(ld => l_session,
msg => l_message);

<< entry_loop >>
WHILE l_entry IS NOT NULL LOOP
-- Get all the attributes for this entry.
DBMS_OUTPUT.PUT_LINE('---------------------------------------');
l_attr_name := DBMS_LDAP.first_attribute(ld => l_session,
ldapentry => l_entry,
ber_elem => l_ber_element);
<< attributes_loop >>
WHILE l_attr_name IS NOT NULL LOOP
-- Get all the values for this attribute.
l_vals := DBMS_LDAP.get_values (ld => l_session,
ldapentry => l_entry,
attr => l_attr_name);
<< values_loop >>
FOR i IN l_vals.FIRST .. l_vals.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ATTIBUTE_NAME: ' || l_attr_name || ' = ' || SUBSTR(l_vals(i),1,200));
END LOOP values_loop;
l_attr_name := DBMS_LDAP.next_attribute(ld => l_session,
ldapentry => l_entry,
ber_elem => l_ber_element);
END LOOP attibutes_loop;
l_entry := DBMS_LDAP.next_entry(ld => l_session,
msg => l_entry);
END LOOP entry_loop;
END IF;

-- Disconnect from the LDAP server.
l_retval := DBMS_LDAP.unbind_s(ld => l_session);
DBMS_OUTPUT.PUT_LINE('L_RETVAL: ' || l_retval);
END;
/

我得到了这个结果:

Results实际上,用户有 3 个组,但其中一个组是 Primary 并存储在 primaryGroupID 中。我尝试查询组,但找不到 ID 之类的属性。如何通过 primaryGroupID 获取群组信息(例如 memberOf 属性的值)?

最佳答案

尽管这可能很烦人,但这必然是一个由两部分组成的过程。 memberOf(和 LDAP 多值属性)存储除 PrimaryGroup 成员资格之外的所有组成员资格,正如您所发现的,primaryGroup 成员资格的存储方式完全不同。关键是组对象的“primaryGroupToken”属性,它与用户的primaryGroupID 相关。

我正在做相反的事情,因此作为对自己的服务,我创建了自己的函数来提供primaryGroup ID值/“ token ”:

   --Special from of group membership not appearing in the memberof attribute.
--Function accepts (flexibly) a SID or a group name and return the token that
--would be stored in the attribute "primaryGroupID" of a user object.
FUNCTION get_primaryGroupToken(p_sid_samid IN VARCHAR2) RETURN VARCHAR2 IS
l_retval PLS_INTEGER;
l_attrs dbms_ldap.string_collection;
l_message dbms_ldap.message;
l_entry dbms_ldap.message;
l_attr_name VARCHAR2(256);
l_ber_element dbms_ldap.ber_element;
l_vals dbms_ldap.string_collection;
l_primaryGroupToken VARCHAR2(256) := NULL;
l_filter VARCHAR2(256);
BEGIN
IF SUBSTR( p_sid_samid, 2, 1 ) = '-' THEN
dbms_output.put_line('group spec Is sid');
l_filter := '(objectSid=' || p_sid_samid || ')';
ELSE
dbms_output.put_line('group spec Is samid');
-- You could probably also use CN here instead of sAMAccountName
l_filter := '(&(sAMAccountName=' || p_sid_samid || ')(objectClass=group))';
END IF;
l_retval := get_ldap_session();
l_attrs(1) := 'primaryGroupToken';
l_retval := DBMS_LDAP.search_s(ld => g_session,
base => g_ldap_auth_base,
scope => DBMS_LDAP.SCOPE_SUBTREE,
filter => l_filter,
attrs => l_attrs,
attronly => 0,
res => l_message);
IF DBMS_LDAP.count_entries(ld => g_session, msg => l_message) > 0 THEN
--Get all the entries returned by our search.
l_entry := DBMS_LDAP.first_entry(ld => g_session,msg => l_message);
<<entry_loop>>
WHILE l_entry IS NOT NULL
LOOP
-- Get all the attributes for this entry.
l_attr_name := DBMS_LDAP.first_attribute(ld => g_session,ldapentry => l_entry, ber_elem => l_ber_element);
IF lower(l_attr_name) <> 'primarygrouptoken' THEN
DBMS_OUTPUT.PUT_LINE('ATTIBUTE_NAME unexpected : ' || l_attr_name );
ELSE
l_vals := DBMS_LDAP.get_values (ld => g_session, ldapentry => l_entry, attr => l_attr_name);
END IF;
<< values_loop >>
FOR i IN l_vals.FIRST .. l_vals.LAST
LOOP
l_primaryGroupToken := l_vals(i);
END LOOP values_loop;
IF l_primaryGroupToken IS NULL THEN
l_attr_name := DBMS_LDAP.next_attribute(ld => g_session, ldapentry => l_entry, ber_elem => l_ber_element);
l_entry := DBMS_LDAP.next_entry(ld => g_session,msg => l_entry);
ELSE
EXIT;
END IF;
END LOOP entry_loop;
END IF;
-- Disconnect from the LDAP server.
l_retval := DBMS_LDAP.unbind_s(ld => g_session);
RETURN l_primaryGroupToken;
END get_primaryGroupToken;

请注意,该函数位于包中,并且“g_”变量是包全局变量。当然,消除仅开发 dbms_output 调用等。

然后我只进行了两次过滤器搜索,一次针对primaryGroupID,一次针对memberOf,以获取该组的所有成员。

就您的情况而言,正好相反,拥有自己的函数,首先评估所有 memberOf 值,然后通过 LDAP 搜索具有该primaryGroupToken 的组来单独处理primaryGroupToken。

关于oracle - 如何使用 Oracle dbms_ldap 包获取 LDAP 组名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19254308/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com