gpt4 book ai didi

servicestack - 如何以编程方式为服务和/或 RequestDTO 分配角色和权限

转载 作者:行者123 更新时间:2023-12-02 01:20:56 24 4
gpt4 key购买 nike

静态地,我像这样设置对我的服务的访问权限:

[Authenticate]
public class AppUserService : Service
{
[RequiredRole("Administrator")]
public object Post(CreateAppUser request)
{
//.....
}
}

我如何以编程方式执行此操作?

我会让用户使用 GUI 创建角色。然后我将提供可用方法的列表,例如通过使用改进的代码提供方法,例如:

        var appHost = HostContext.AppHost;
var restPaths = appHost.RestPaths;
foreach (var restPath in restPaths)
{
var reqType = restPath.RequestType;
string verbs = string.Empty;
if (restPath.Verbs != null)
{
var counter = 0;
foreach (var verb in restPath.Verbs)
{
if (counter > 0) verbs += ", ";
verbs += verb;
counter++;
}
}
Debug.WriteLine($"Path: {restPath.Path} | Verbs: {verbs} | Name: {reqType.Name} FullName: {reqType.FullName}");
}

上面的代码输出类似

Path: /appusers | Verbs: POST | Name: CreateAppUser FullName: MyServer.ServiceModel.DTOs.Request.CreateAppUser

所以我可以在我的 UI 中显示 RequestTypeName 属性,并让他定义允许哪些角色调用此方法。因此,用户可以创建一个名为“用户管理”的角色,并允许该角色的成员执行 CreateAppUser

使用注释我会写

[RequiredRole("Administrator", "User Management")]
public object Post(CreateAppUser request)
{ .... }

这在 C# 代码中是否可行?

最佳答案

ServiceStack 确实有一种在运行时动态添加属性的方法,例如:

typeof(CreateAppUser)
.AddAttributes(new RequiredRoleAttribute("Administrator", "User Management"));

这是静态声明属性的替代方案,但它仍然不是数据驱动授权系统的解决方案。

但是除了 ServiceStack 的内置属性之外,您还可以通过在服务中验证它来添加自己的自定义授权逻辑:

public ICustomAuth CustomAuth { get; set; }

public object Post(CreateAppUser request)
{
var session = base.GetSession();
var requiresRoles = CustomAuth.GetRequiredRoles(request.GetType());
var hasAllRoles = requiresRoles.All(r =>
session.HasRole(r, base.AuthRepository))
if (!hasAllRoles)
throw new UnauthorizedAccessException("Requires all roles");
}

如果您经常这样做,您将希望将自定义验证逻辑重构为单个可重用方法,或者如果您更喜欢自定义 RequestFilter 属性。

关于servicestack - 如何以编程方式为服务和/或 RequestDTO 分配角色和权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40301327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com