2011-03-18 10 views
5

मैं डेल्फी XE DataSnap एप्लिकेशन में प्रमाणीकरण को लागू करने का प्रयास कर रहा हूं। मैंने इसे एक बहुत ही सरल उदाहरण में तोड़ दिया, लेकिन अभी भी किसी विधि या कक्षा के लिए TRoleAuth विशेषता के प्रभाव नहीं दिख रहे हैं।डेल्फी डेटा स्नैप प्रमाणीकरण TRoleAuth विशेषता का सम्मान नहीं कर रहा है

यहां एक साधारण DSServerMethods क्लास है जिसमें जेनरेट किए गए नमूना विधियां शामिल हैं। कक्षा को अतिथि और किसी भी अधिकृत भूमिका के साथ सजाया गया है, और अनचाहे भूमिका से इनकार कर दिया। ReverseString विधि केवल पढ़ने से इनकार किया भूमिका के साथ सजाया गया है:

type 
    [TRoleAuth('guest,anyone','unwelcome')] 
    TMyDSServerMethods = class(TDSServerModule) 
    DataSetProvider1: TDataSetProvider; 
    ... 
    public 
    { Public declarations } 
    function EchoString(Value: string): string; 
    [TRoleAuth('','readonly')] 
    function ReverseString(Value: string): string; 
    ... 
    end; 

मैं OnUserAuthenticate पद्धति पर भूमिकाएं सौंपने कर रहा हूँ। उदाहरण के लिए, मेरे पास एक उपयोगकर्ता है जिसके लिए मैं ऑनयूसर प्रमाणीकरण से रीडोनली भूमिका निभा रहा हूं, एक भूमिका जो मुझे विश्वास है कि उपयोगकर्ता को रिवर्सस्ट्रिंग फ़ंक्शन निष्पादित करने की अनुमति से इंकार कर देना चाहिए।

मैं क्या समझ से, मेरे कोड EventObject.AuthorizedRoles और TDSAuthenticationManager की OnUserAuthorize विधि से EventObject.DeniedRoles TStrings के खिलाफ उपयोगकर्ता की भूमिकाओं की तुलना करनी चाहिए, और उसके अनुसार इस विधि का वैध औपचारिक पैरामीटर निर्धारित किया है।

यहां एक साधारण ऑनयूसर प्राधिकृत विधि है जिसे मैं टेसिंग के लिए उपयोग कर रहा हूं। जब मैं रीवर्सस्ट्रिंग, EventObject.AuthorizedRoles और EventObject.DeniedRoles को आमंत्रित करने के प्रयास में पढ़ने वाली भूमिका के साथ किसी उपयोगकर्ता के जवाब में डीबगर का उपयोग करके इसमें कदम उठाता हूं, और EventObject.Roles में केवल पढ़ने की भूमिका होती है।

procedure TServerContainer1.DSAuthenticationManager1UserAuthorize(
    Sender: TObject; EventObject: TDSAuthorizeEventObject; 
    var valid: Boolean); 
begin 
    outputdebugstring(PChar(Eventobject.UserName)); 
    if EventObject.UserRoles <> nil then 
    outputdebugstring(PChar(eventobject.UserRoles.Text)); 
    if EventObject.AuthorizedRoles <> nil then 
    outputdebugstring(PChar(eventobject.AuthorizedRoles.Text)); 
    if EventObject.DeniedRoles <> nil then 
    outputdebugstring(PChar(eventobject.DeniedRoles.Text)); 
    valid := True; 
end; 

मैं बात को अनदेखा कर रहा हूँ, या वहाँ एक संपत्ति है कि मैं कार्य करने के लिए TRoleAuth विशेषता सक्षम करने के लिए कहीं न कहीं निर्धारित करने की आवश्यकता है?

= = = = = = = = = संपादित करें: मैट डेलोंग ने उत्तर प्रदान किया। DSAuth इकाई (जहां TRoleAuth कस्टम विशेषता वर्ग घोषित किया गया है) इकाई के इंटरफ़ेस अनुभाग से अनुपलब्ध था जिसमें DSServerModule वंश को परिभाषित किया गया था।

उत्तर

10

यह सुनिश्चित करने के लिए एक बात यह है कि आपके सर्वर विधियों के वर्ग में आपके पास इंटरफ़ेस अनुभाग के उपयोग खंड में "DSAuth" इकाई है। यदि आप नहीं करते हैं, तो आपको "असमर्थित भाषा सुविधा: 'कस्टम विशेषता' कहकर संकलित समय चेतावनी दिखाई देनी चाहिए। यदि यह हो रहा है, तो इसका मतलब है कि आपके गुणों को अनदेखा किया जा रहा है क्योंकि TRoleAuth प्रकार अज्ञात है।

यदि ऐसा नहीं है, तो मुझे यकीन नहीं है कि यह और क्या होगा। यदि आपके ऑनयूसर प्राधिकृत ईवेंट में ठीक से काम कर रहा है, तो आपको कोड विशेषता में परिभाषित "readonly" भूमिका वाली "EventObject.DeniedRoles" दिखाई देनी चाहिए। आपको इस भूमिका वाले "EventObject.UserRoles" को भी देखना चाहिए। यदि ऐसा है, तो आपको OnUserAuthorize को लागू करने की आवश्यकता नहीं होगी, और कोड स्वचालित रूप से इस उपयोगकर्ता प्रमाणीकरण से इंकार कर देगा।

कुछ बातें गौर करने योग्य

  • आप एक समारोह या प्रक्रिया पर एक TRoleAuth विशेषता डालें, तो वह विशेषता वर्ग पर डाल बदल देता है यह नहीं जोड़ता है (केवल यह है कि एक विधि के लिए।) इसके लिए

  • यदि आप एक डिज़ाइन-टाइम विशेषता सेट करते हैं जो विधि पर लागू होता है (TDSAuthenticationManager घटक पर 'भूमिकाओं' संग्रह को संशोधित करके) तो कोड में जोड़े गए विशेषता को अनदेखा कर दिया जाएगा।

आशा है कि मदद करता है,

चटाई

+2

अरे, इतना करने के लिए स्वागत करते हैं। –

+0

"असमर्थित भाषा सुविधा"? अस्पष्ट भाषा में डेल्फी कंपाइलर वार्ता :) – mjn

+1

बिंगो! DSAuth इकाई इंटरफ़ेस (या कार्यान्वयन अनुभाग) में प्रकट नहीं हुई DSServerModule के खंड का उपयोग करती है। जैसे ही मैंने इसे TRoleAuth विशेषता में रखा, उसका काम किया। –