有没有办法在 servicestack 中应用行级安全性?

Is there a way to apply row level security in servicestack?

有没有办法应用轻量级行级安全性。

本质上我要申请

            OrmLiteConfig.SqlExpressionSelectFilter = q =>
            {
                if (q.ModelDef.ModelType.HasInterface(typeof(IRowLevelSecurity)))
                {
                    q.Where<IRowLevelSecurity>(x => x.ClientId == request.ClientId);
                }
            };

目前我无法访问“请求”dto。

所有 OrmLiteConfig 过滤器都是静态委托,因此它们将无法访问运行时请求上下文,除非它可以从允许它的主机中的单例上下文中获得。

我不推荐它,但您可以使用请求上下文来设置一个您可以在过滤器中访问的变量,例如:

GlobalRequestFilters.Add((req, res, dto) => {
    if (dto is IRowLevelSecurity dtoRow)
        RequestContext.Instance.Items["ClientId"] = dtoRow.ClientId;
});

OrmLiteConfig.SqlExpressionSelectFilter = q => {
    var clientId = RequestContext.Instance.Items["ClientId"] as string;
    if (clientId == null) return;
    if (q.ModelDef.ModelType.HasInterface(typeof(IRowLevelSecurity)))
    {
        q.Where<IRowLevelSecurity>(x => x.ClientId == clientId);
    }
};

但我个人会避免任何脆弱的、与其外部主机紧密耦合且可测试性差的单例运行时上下文访问。为了减少样板文件,我将其包装在扩展方法中,例如:

public static class MyOrmLiteUtils
{
    public static SqlExpression<T> From<T>(this IDbConnection db, IRowLevelSecurity dto)
        where T : IRowLevelSecurity
    {
        var q = db.From<T>();
        return q.Ensure(x => x.ClientId == dto.ClientId);
    }
}

您可以像使用普通 OrmLite 查询一样使用您的服务中的哪些内容,例如:

var q = db.From<Table>(dto);