有没有办法在 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);
有没有办法应用轻量级行级安全性。
本质上我要申请
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);