मैं डेल्फी 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 वंश को परिभाषित किया गया था।
अरे, इतना करने के लिए स्वागत करते हैं। –
"असमर्थित भाषा सुविधा"? अस्पष्ट भाषा में डेल्फी कंपाइलर वार्ता :) – mjn
बिंगो! DSAuth इकाई इंटरफ़ेस (या कार्यान्वयन अनुभाग) में प्रकट नहीं हुई DSServerModule के खंड का उपयोग करती है। जैसे ही मैंने इसे TRoleAuth विशेषता में रखा, उसका काम किया। –