隔离/访问自定义验证器,servicestack API中的设置会话信息

时间:2013-04-23 16:05:54

标签: session servicestack


我想知道从我们通过servicestack的fluent-validation API挂钩连接的自定义验证器中访问用户的 AuthSession 的最佳方法。基本上,这些要求迫使我们使用名为“ DocNumberValidator ”的类通过此验证器访问数据库。用户的身份验证在身份验证时保存到会话中,我们需要此信息才能完成成功的SQL查询。如何访问此会话信息(见下文....)。 IoC容器没有引用AuthSession?

  • 我想问题是,有人如何将必要的会话值传递给SS验证框架调用的类

示例代码:


public class MyValidator : AbstractValidator<Statuses>
{
    public IDocNumberValidator DocNumberValidator { get; set; }

    public StatusesValidator()
    {
        RuleFor(s => s.DocNumber)
              .Must(docNum => this.DocNumberValidator.Validate(docNum))
              .WithMessage("Document Number is invalid.")
              .WithErrorCode("S-001");
    }
}

 public class DocNumberValidator : IDocNumberValidator
{
    public IDbConnectionFactory Db { get; set; }

    public bool Validate(string docNum)
    {
        var isFound = false;
        this.Db.Run(conn =>
            {
                var sql = "SELECT COUNT([docNumber]) FROM [TABLE] WHERE [docNumber] = @DocNum AND [UserId] = @UserID";
                var cmd = conn.CreateCommand();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = sql;
                cmd.Parameters.Add(new SqlParameter("@DocNum", docNum));
                cmd.Parameters.Add(new SqlParameter("@UserID", ????????)); // how does one get access to saved users session here
                int cnt = (int) cmd.ExecuteScalar();
                if (cnt == 1)
                    isFound = true;

            });

        return isFound;
    }
}

1 个答案:

答案 0 :(得分:1)

不确定这是最好的方法。接受建议。

  • 使用SessionFeature.GetSessionKey()获取会话密钥
  • public ICacheClient CacheClient { get; set; }添加到验证程序。 将由IoC容器注入
  • 从中获取AuthUserSession(或您正在使用的任何类型) 使用密钥缓存

已添加到您的示例中

public class DocNumberValidator : IDocNumberValidator
{
    public IDbConnectionFactory Db { get; set; }
    public ICacheClient CacheClient { get; set; }

    public bool Validate(string docNum)
    {
        var isFound = false;
        var sessionKey = SessionFeature.GetSessionKey();
        var user = CacheClient.Get<AuthUserSession>(sessionKey); //Use whatever class you stored in the session

        this.Db.Run(conn =>
            {
                var sql = "SELECT COUNT([docNumber]) FROM [TABLE] WHERE [docNumber] = @DocNum AND [UserId] = @UserID";
                var cmd = conn.CreateCommand();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = sql;
                cmd.Parameters.Add(new SqlParameter("@DocNum", docNum));
                cmd.Parameters.Add(new SqlParameter("@UserID", user.UserAuthId)); // user whatever property you need access to
                int cnt = (int) cmd.ExecuteScalar();
                if (cnt == 1)
                    isFound = true;

            });

        return isFound;
    }
}