提问人:Marc Guillot 提问时间:11/16/2023 最后编辑:Marc Guillot 更新时间:11/16/2023 访问量:51
拦截 RAD 服务器端点请求
Intercept the RAD Server endpoint requests
问:
有没有办法拦截对 RAD 服务器端点的所有请求?
我想以编程方式控制对端点的授权,这样我就可以动态定义对这些端点的权限,而不是在EMSServer.ini上固定且不可更改。
文档说,对于编程控制,我必须检查并引发自定义资源上的异常。
编程控制
您可以创建一个新的扩展 RAD 服务器引擎并添加代码 阻止访问特定的 RAD 服务器端点。在代码中, 您可以检查请求是否来自特定的 RAD 服务器用户或 来自特定 RAD 服务器组中的 RAD 服务器用户。
如果不允许请求中标识的 RAD 服务器用户 访问端点时,自定义资源应引发异常(至 指示请求未经授权)。
它有效,我可以手动检查每个端点是否用户有权执行该端点。
[ResourceSuffix('/item/{id}')]
procedure GetItem(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
...
...
procedure TEndpointCustomers.GetItem(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
var id: string;
begin
TCustomPermissions.ValidateRequest(AContext);
id := ARequest.Params.Values['id'];
AResponse.Body.SetStream(TCustomer.Item(id), 'application/json', True);
end;
...
...
class procedure TCustomPermissions.ValidateRequest(AContext: TEndpointContext);
var
User, Resource, Endpoint: string;
begin
Resource := AContext.Request.Resource;
Endpoint := AContext.EndpointName;
if Assigned(AContext.User) then
User := AContext.User.UserName;
if not VeryfiyEndpointPermissions(User, Resource, Endpoint) then
raise Exception.CreateFmt(_(rsNoPermissions), [Resource, Endpoint]);
end;
问题在于,必须在每个端点上调用该检查很麻烦且容易忘记。有没有办法在单个点上拦截对端点的所有请求?
我正在寻找一个事件或类似的事件,例如 Datasnap 拥有的 WebModule.BeforeDispatch,因此我可以在那里调用我的,它将保护所有 RAD 服务器端点。TCustomPermissions.ValidateRequest(AContext: TEndpointContext)
答: 暂无答案
评论