在 Delphi RAD服务器内置的用户端点中更改用户名

f8rj6qna  于 2024-01-07  发布在  其他
关注(0)|答案(2)|浏览(174)

我使用 Delphi RAD服务器10.4与补丁1,2和3,我创建了端点来管理RAD用户使用身份验证和安全组件TBackEndAuth和TBackendUser组件。
我可以注册一个新的用户和登录成功使用这些组件,现在我试图更新用户信息,但我不能管理一个错误时,更新字段用户名
在代码中可以看到方法UpdateUser,当运行时,它会引发错误:
{“error”:“错误”,“描述”:“EMS错误:错误的请求。操作无法完成,因为一个或多个动态名称与静态名称冲突。冲突:用户名”}
如果我注解行lobjUser.AddPair('username',lusername_new);,那么它就可以正常工作。但是我也希望能够更新用户名。
任何帮助都是非常欢迎的。谢谢。

  1. unit DMUsermanager;
  2. // EMS Resource Module
  3. interface
  4. uses
  5. System.SysUtils, System.Classes, System.JSON,
  6. EMS.Services, EMS.ResourceAPI, EMS.ResourceTypes, REST.Backend.ServiceTypes,
  7. REST.Backend.MetaTypes, REST.Backend.EMSServices, REST.Backend.Providers,
  8. REST.Backend.ServiceComponents, Data.Bind.Components, Data.Bind.ObjectScope,
  9. REST.Backend.BindSource, REST.Backend.EMSProvider;
  10. type
  11. [ResourceName('UserManager')]
  12. TUsermanagerResource1 = class(TDataModule)
  13. EMSProvider1 : TEMSProvider;
  14. BackendAuth1 : TBackendAuth;
  15. BackendUsers1 : TBackendUsers;
  16. published
  17. [EndpointMethod(TEndpointRequest.TMethod.Post)]
  18. [ResourceSuffix('/SignUpUser')]
  19. procedure SignUpUser(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
  20. [EndpointMethod(TEndpointRequest.TMethod.Post)]
  21. [ResourceSuffix('/LoginUser')]
  22. procedure LoginUser(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
  23. [EndpointMethod(TEndpointRequest.TMethod.Post)]
  24. [ResourceSuffix('/UpdateUser')]
  25. procedure UpdateUser(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
  26. end;
  27. implementation
  28. {%CLASSGROUP 'Vcl.Controls.TControl'}
  29. {$R *.dfm}
  30. procedure TUsermanagerResource1.SignUpUser(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
  31. var
  32. lusername, lpassword : string;
  33. lcustomfieldemail, lcustomfieldage : string;
  34. lcustomfields : TCollectionItem;
  35. jo : TJSONObject;
  36. begin
  37. if ARequest.Body.TryGetObject(jo) then
  38. begin
  39. // Get user data from JSON post request body
  40. lusername := jo.GetValue<string>('username');
  41. lpassword := jo.GetValue<string>('password');
  42. lcustomfieldemail := jo.GetValue<string>('email');
  43. lcustomfieldage := jo.GetValue<string>('age');
  44. with BackEndAuth1 do
  45. begin
  46. //Create CustomFields collection
  47. UserDetails.Add;
  48. UserDetails.Items[0].Name := 'email';
  49. UserDetails.Items[0].Value := lcustomfieldemail;
  50. UserDetails.Add;
  51. UserDetails.Items[1].Name := 'age';
  52. UserDetails.Items[1].Value := lcustomfieldage;
  53. //Assign username and passowrd
  54. UserName := lusername;
  55. Password := lpassword;
  56. //Creates the user in RAD Server
  57. Signup;
  58. // Check if creation was Ok and return user info
  59. if LoggedIn then
  60. begin
  61. jo := TJSONObject.Create;
  62. jo.AddPair('Username',LoggedInUserName);
  63. jo.AddPair('Token' ,LoggedInToken);
  64. jo.AddPair('Email' ,UserDetails[0].value);
  65. jo.AddPair('Age' ,UserDetails[1].value);
  66. jo.AddPair('ID' ,LoggedInValue.ObjectID);
  67. AResponse.Body.SetValue(jo,true);
  68. end
  69. else
  70. AResponse.RaiseBadRequest('Error on SignUp the user.');
  71. end;
  72. end
  73. else
  74. // JSON object content or format error
  75. AResponse.RaiseBadRequest('Error on request body JSONOBJECT.');
  76. end;
  77. procedure TUsermanagerResource1.LoginUser(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
  78. var
  79. lusername, lpassword : string;
  80. jo : TJSONObject;
  81. begin
  82. if ARequest.Body.TryGetObject(jo) then
  83. begin
  84. // Get user credentials from JSON post request body
  85. lusername := jo.GetValue<string>('username');
  86. lpassword := jo.GetValue<string>('password');
  87. with BackEndAuth1 do
  88. begin
  89. //Create CustomFields collection
  90. UserDetails.Add;
  91. UserDetails.Items[0].Name := 'email';
  92. UserDetails.Add;
  93. UserDetails.Items[1].Name := 'age';
  94. //Assign username and passowrd
  95. UserName := lusername;
  96. Password := lpassword;
  97. //Log in into RAD Server
  98. Login;
  99. // Check if Log in was Ok and return user info
  100. if LoggedIn then
  101. begin
  102. jo := TJSONObject.Create;
  103. jo.AddPair('Username',LoggedInUserName);
  104. jo.AddPair('Token' ,LoggedInToken);
  105. jo.AddPair('Email' ,UserDetails[0].value);
  106. jo.AddPair('Age' ,UserDetails[1].value);
  107. jo.AddPair('ID' ,LoggedInValue.ObjectID);
  108. AResponse.Body.SetValue(jo,true);
  109. end
  110. else
  111. AResponse.RaiseBadRequest('Error on Log in the user.');
  112. end;
  113. end
  114. else
  115. // JSON object content or format error
  116. AResponse.RaiseBadRequest('Error on request body JSONOBJECT.');
  117. end;
  118. procedure TUsermanagerResource1.UpdateUser(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
  119. var
  120. lusername, lpassword : string;
  121. lusername_new, lpassword_new : string;
  122. lcustomfieldemail, lcustomfieldage : string;
  123. lcustomfields : TCollectionItem;
  124. jo, lobjUser : TJSONObject;
  125. lUpdatedAt : TBackendEntityValue;
  126. begin
  127. if ARequest.Body.TryGetObject(jo) then
  128. begin
  129. // Get user data from JSON post request body
  130. lusername := jo.GetValue<string>('username');
  131. lpassword := jo.GetValue<string>('password');
  132. lusername_new := jo.GetValue<string>('username_new');
  133. lpassword_new := jo.GetValue<string>('password_new');
  134. lcustomfieldemail := jo.GetValue<string>('email');
  135. lcustomfieldage := jo.GetValue<string>('age');
  136. with BackEndAuth1 do
  137. begin
  138. //Assign username and passowrd
  139. UserName := lusername;
  140. Password := lpassword;
  141. //Log in into RAD Server
  142. Login;
  143. if LoggedIn then
  144. begin
  145. //Create CustomFields collection
  146. UserDetails.Add;
  147. UserDetails.Items[0].Name := 'email';
  148. UserDetails.Items[0].Value := lcustomfieldemail;
  149. UserDetails.Add;
  150. UserDetails.Items[1].Name := 'age';
  151. UserDetails.Items[1].Value := lcustomfieldage;
  152. // UserName := lusername_new; ==> this does not work
  153. // Password := lpassword_new; ==> this does not work
  154. //Updates user data in RAD Server
  155. UpdateuserDetails;
  156. lobjUser := TJSONObject.Create;
  157. lobjUser.AddPair('username',lusername_new); // this line is the ISSUE !!
  158. lobjUser.AddPair('password',lpassword_new);
  159. BackEndUsers1.Users.UpdateUser(LoggedInValue.ObjectID,lobjuser,lUpdatedAt);
  160. // Check if creation was Ok and return user info
  161. if LoggedIn then
  162. begin
  163. jo := TJSONObject.Create;
  164. jo.AddPair('Username',LoggedInUserName);
  165. jo.AddPair('Token' ,LoggedInToken);
  166. jo.AddPair('Email' ,UserDetails[0].value);
  167. jo.AddPair('Age' ,UserDetails[1].value);
  168. jo.AddPair('ID' ,LoggedInValue.ObjectID);
  169. AResponse.Body.SetValue(jo,true);
  170. end
  171. else
  172. AResponse.RaiseBadRequest('Error on SignUp the user.');
  173. end;
  174. end;
  175. end
  176. else
  177. // JSON object content or format error
  178. AResponse.RaiseBadRequest('Error on request body JSONOBJECT.');
  179. end;
  180. procedure Register;
  181. begin
  182. RegisterResource(TypeInfo(TUsermanagerResource1));
  183. end;
  184. initialization
  185. Register;
  186. end.

字符串

还有一个问题:这是在RAD Sever内置用户端点中更新用户信息的正确方法吗?

30byixjq

30byixjq1#

我不认为一个插件可以更新,但只是自定义字段:
http://docwiki.embarcadero.com/RADStudio/Sydney/en/RAD_Server_Users_Resource#UpdateUser_Endpoint

scyqe7ek

scyqe7ek2#

我已经在质量门户网站上报告了这个错误。投票支持它来修复它
https://quality.embarcadero.com/browse/RSP-41163

相关问题