{"id":986,"date":"2015-04-21T13:52:19","date_gmt":"2015-04-21T05:52:19","guid":{"rendered":"http:\/\/j178.mtgbb.com\/?p=986"},"modified":"2015-04-21T13:52:19","modified_gmt":"2015-04-21T05:52:19","slug":"%e5%be%9eoracle-db%e9%80%8f%e9%81%8eldap%e9%a9%97%e8%ad%89-windows%e7%99%bb%e5%85%a5%e5%b8%b3%e8%99%9f%e5%af%86%e7%a2%bc","status":"publish","type":"post","link":"https:\/\/j178.mtgbb.com\/?p=986","title":{"rendered":"\u5f9eOracle DB\u900f\u904eLDAP\u9a57\u8b49 Windows\u767b\u5165\u5e33\u865f\u5bc6\u78bc"},"content":{"rendered":"<p>\u8cc7\u6599\u4f86\u6e90\uff1a <\/p>\n<pre lang=\"oracle8\">\r\n\u6b64 package  \u7528\u4f86\u6aa2\u6838\u8f38\u5165\u5e33\u865f\u3001\u5bc6\u78bc\u662f\u70ba\u500b\u4eba\u96fb\u8166\u767b\u5165\u7684\u5e33\u865f\u3001\u5bc6\u78bc\r\n\r\n\u82e5\u6b63\u78ba\u7121\u8aa4\uff0c\u5247\u56de\u50b3\u59d3\u540d\u3001\u90e8\u9580\u4ee3\u865f\r\n\r\n\u5426\u5247\u5247\u56de\u50b3 false;1 or false;2 or false;3 \u4ee3\u8868\u5404\u7a2e\u932f\u8aa4\u72c0\u6cc1\r\n\r\n \r\n\r\nCREATE OR REPLACE PACKAGE BODY dcp_login IS\r\n  FUNCTION chk_pass(p_uid IN VARCHAR2, p_pass IN VARCHAR2) RETURN VARCHAR2 AS\r\n    -- Adjust as necessary.\r\n    l_user        VARCHAR2(256) := p_uid; -- eg.'a012345';\r\n    l_ldap_host   VARCHAR2(256) := 'aaaaa.com.tw';\r\n    l_ldap_port   VARCHAR2(256) := '389';\r\n    l_ldap_user   VARCHAR2(256) := p_uid || '@aaaaa.com.tw';\r\n    l_ldap_passwd VARCHAR2(256) := p_pass; -- AD login pass\r\n    l_ldap_base   VARCHAR2(256) := 'dc=aaaaa,dc=com,dc=tw'; --'cn=users,dc=aaaaa,dc=com,dc=tw';\r\n    -- Local\r\n    l_retval      PLS_INTEGER;\r\n    l_session     dbms_ldap.session;\r\n    l_attrs       dbms_ldap.string_collection;\r\n    l_message     dbms_ldap.message;\r\n    l_entry       dbms_ldap.message;\r\n    l_attr_name   VARCHAR2(256);\r\n    l_ber_element dbms_ldap.ber_element;\r\n    l_vals        dbms_ldap.string_collection;\r\n  \r\n    --\r\n    v_department VARCHAR2(256);\r\n    v_sn         VARCHAR2(256);\r\n    v_givenname  VARCHAR2(256);\r\n  BEGIN\r\n    l_retval := -1;\r\n  \r\n    -- 1. Initialize the LDAP session\r\n    BEGIN\r\n      l_session := dbms_ldap.init(l_ldap_host, l_ldap_port);\r\n    EXCEPTION\r\n      -- Connect fail\r\n      WHEN OTHERS THEN\r\n        RETURN 'false;1';\r\n    END;\r\n  \r\n    -- 2. Authenticate to the directory\r\n    BEGIN\r\n      l_retval := dbms_ldap.simple_bind_s(l_session,\r\n                                          l_ldap_user,\r\n                                          l_ldap_passwd);\r\n    \r\n      -- Wrong Password \r\n      IF l_retval <> dbms_ldap_utl.success THEN\r\n        RETURN 'false;2';\r\n      END IF;\r\n    EXCEPTION\r\n      -- Wrong Password \r\n      WHEN OTHERS THEN\r\n        RETURN 'false;2';\r\n    END;\r\n  \r\n    -- 3. Get all attributes\r\n    l_attrs(1) := '*'; -- retrieve all attributes   \r\n    BEGIN\r\n      -- 3-1.\r\n      l_retval := dbms_ldap.search_s(ld       => l_session,\r\n                                     base     => l_ldap_base,\r\n                                     scope    => dbms_ldap.scope_subtree,\r\n                                     filter   => 'sAMAccountName=' || l_user || '*',\r\n                                     attrs    => l_attrs,\r\n                                     attronly => 0,\r\n                                     res      => l_message);\r\n      --filter   => 'objectclass=*',\r\n    \r\n      -- 3-2.\r\n      IF dbms_ldap.count_entries(ld => l_session, msg => l_message) > 0 THEN\r\n        -- 3-2-1. Get all the entries returned by our search.\r\n        l_entry := dbms_ldap.first_entry(ld => l_session, msg => l_message);\r\n      \r\n        -- 3-2-2. < < entry_loop >>\r\n        WHILE l_entry IS NOT NULL LOOP\r\n          -- 3-2-2-1. Get all the attributes for this entry.\r\n          l_attr_name := dbms_ldap.first_attribute(ld        => l_session,\r\n                                                   ldapentry => l_entry,\r\n                                                   ber_elem  => l_ber_element);\r\n        \r\n          -- 3-2-2-2. < < attributes_loop >>\r\n          WHILE l_attr_name IS NOT NULL LOOP\r\n            -- Get all the values for this attribute.\r\n            BEGIN\r\n              l_vals := dbms_ldap.get_values(ld        => l_session,\r\n                                             ldapentry => l_entry,\r\n                                             attr      => l_attr_name);\r\n            EXCEPTION\r\n              WHEN OTHERS THEN\r\n                NULL; -- skip convert error\r\n            END;\r\n          \r\n            ----  < < values_loop >>\r\n            FOR i IN l_vals.first .. l_vals.last LOOP\r\n            \r\n              --\r\n              IF substrb(l_attr_name, 1, 5) = 'given' THEN\r\n                v_givenname := substr(l_vals(i), 1, 200);\r\n              END IF;\r\n            \r\n              IF substrb(l_attr_name, 1, 5) = 'depar' THEN\r\n                v_department := substr(l_vals(i), 1, 200);\r\n              END IF;\r\n            \r\n              IF l_attr_name LIKE 'sn%' THEN\r\n                v_sn := substr(l_vals(i), 1, 200);\r\n              END IF;\r\n              \/*\r\n              IF (substrb(l_attr_name, 1, 5) IN ('given', 'depar') OR\r\n                 l_attr_name LIKE 'sn%') THEN\r\n              \r\n                dbms_output.put_line('ATTIBUTE_NAME: ' || l_attr_name ||\r\n                                     ' = ' || substr(l_vals(i), 1, 200));\r\n              \r\n              END IF;\r\n              *\/\r\n            END LOOP values_loop;\r\n            l_attr_name := dbms_ldap.next_attribute(ld        => l_session,\r\n                                                    ldapentry => l_entry,\r\n                                                    ber_elem  => l_ber_element);\r\n          END LOOP attibutes_loop;\r\n          -- end: 3-2-2-2.\r\n        \r\n          l_entry := dbms_ldap.next_entry(ld => l_session, msg => l_entry);\r\n        END LOOP entry_loop;\r\n        -- end: 3-2-2.\r\n      \r\n      END IF;\r\n      -- end: 3-2.\r\n    \r\n    EXCEPTION\r\n      WHEN OTHERS THEN\r\n        -- others\r\n        RETURN 'false;3';\r\n    END;\r\n    --end: 3\r\n  \r\n    RETURN v_sn || v_givenname || ';' || v_department;\r\n  END chk_pass;\r\n\r\n--   FUNCTION get_userinfo(p_uid IN VARCHAR2, p_pass in varchar2)\r\n--      RETURN VARCHAR2;\r\nEND dcp_login;\r\n\r\n-------------------\r\nCall Function:\r\n--------------------\r\nSELECT dcp_login.chk_pass('empno', 'password') val FROM dual;\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u8cc7\u6599\u4f86\u6e90\uff1a \u6b64 package \u7528\u4f86\u6aa2\u6838\u8f38\u5165\u5e33\u865f\u3001\u5bc6\u78bc\u662f\u70ba\u500b\u4eba\u96fb\u8166\u767b\u5165\u7684\u5e33\u865f\u3001\u5bc6\u78bc \u82e5\u6b63\u78ba\u7121\u8aa4\uff0c\u5247\u56de\u50b3\u59d3\u540d\u3001\u90e8 &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[54],"class_list":["post-986","post","type-post","status-publish","format-standard","hentry","category-database","tag-ldap"],"_links":{"self":[{"href":"https:\/\/j178.mtgbb.com\/index.php?rest_route=\/wp\/v2\/posts\/986","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/j178.mtgbb.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/j178.mtgbb.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/j178.mtgbb.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/j178.mtgbb.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=986"}],"version-history":[{"count":1,"href":"https:\/\/j178.mtgbb.com\/index.php?rest_route=\/wp\/v2\/posts\/986\/revisions"}],"predecessor-version":[{"id":1232,"href":"https:\/\/j178.mtgbb.com\/index.php?rest_route=\/wp\/v2\/posts\/986\/revisions\/1232"}],"wp:attachment":[{"href":"https:\/\/j178.mtgbb.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=986"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j178.mtgbb.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=986"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j178.mtgbb.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=986"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}