我需要帮助为用户实现验证逻辑。我需要检查用户输入的密码是否与SQL Server用户表中的passwordhash
匹配。
对我来说最大的问题是,我在哪里实现这个验证逻辑?
您可以在下面看到我的用户实现:
public class User : BaseEntity
{
public virtual string Username { get; set; }
public virtual string Hash { get; set; }
public virtual string Salt { get; set; }
}
public interface IUserTasks
{
List<User> GetAll();
User Get(int id);
User CreateOrUpdate(User user);
void Delete(int id);
bool Validate(string username, string password);
}
public class UserTasks : IUserTasks
{
private readonly IRepository<User> _userRepository;
private readonly IValidateHashQuery _validateHashQuery;
public UserTasks(IRepository<User> userRepository, IValidateHashQuery validateHashQuery)
{
_userRepository = userRepository;
_validateHashQuery = validateHashQuery;
}
public List<User> GetAll()
{
return _userRepository.GetAll().ToList();
}
public User Get(int id)
{
return _userRepository.Get(id);
}
public User CreateOrUpdate(User user)
{
return _userRepository.SaveOrUpdate(user);
}
public void Delete(int id)
{
var entity = _userRepository.Get(id);
if(entity != null)
{
_userRepository.Delete(entity);
}
}
public bool Validate(string username, string password)
{
return _userRepository.PerformQuery(_validateHashQuery) != null ? true : false;
}
}
是否需要在Task
实现中实现验证逻辑,还是需要在我的域中创建新的查询对象并在我的Task
实现中使用它?
我真的需要帮助,期待你的回复!
罗布
答案 0 :(得分:0)
这是一个古老的争论,我之前曾与自己斗争过。
采取夏普拱门的领先优势。他们用属性检查这些问题,检查他们的DomainSignatureAttrribute,以解决对象的持久性统一性。
对我来说,这是域逻辑。任务用于编排请求中的一个或多个事件。
我将存储库接口注入您的核心对象并在那里进行检查:
public User(IUserRepsoitory userRepository)
{
this.userRepsoitory = userRepository;
}
public void IsValid()
{
return userRepository.IsPsswordValid(this);
}
我没看到这违反了任何规则。 This generally isnt recommended
答案 1 :(得分:0)
AFAIK IRepository.PerformQuery(IQuery查询)已从最新版本的SA中删除,支持使用Enhanced query object.
public class ValidateHashQuery : IValidateHashQuery
{
public bool Validate(string username, string password)
{
ISession nhSession = NHibernateSession.Current;
// you now have your session and run your query however you like
}
}
public class UserTasks : IUserTasks
{
private readonly IRepository<User> _userRepository;
private readonly IValidateHashQuery _validateHashQuery;
public UserTasks(IRepository<User> userRepository, IValidateHashQuery validateHashQuery)
{
_userRepository = userRepository;
_validateHashQuery = validateHashQuery;
}
public List<User> GetAll()
{
return _userRepository.GetAll().ToList();
}
public User Get(int id)
{
return _userRepository.Get(id);
}
public User CreateOrUpdate(User user)
{
return _userRepository.SaveOrUpdate(user);
}
public void Delete(int id)
{
var entity = _userRepository.Get(id);
if(entity != null)
{
_userRepository.Delete(entity);
}
}
public bool Validate(string username, string password)
{
return _validateHashQuery.Validate(username, password);
}
}
但是看看你的用户任务,除了调用存储库之外似乎没有做任何事情,不知道为什么不直接使用存储库会带来什么价值呢?
验证查询也是如此,您可以将该依赖项添加到控制器并直接从那里调用用户验证查询,并根据结果设置cookie / session。 然后在执行需要用户登录的任务之前,检查该cookie(理想情况下,操作[Autherise]上的某些属性)。根据您的情况,您可能希望在任务本身中拥有该授权。