2011-11-25 25 views
0

我需要幫助爲用戶實施驗證邏輯。我需要檢查用戶輸入的密碼是否與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

它是一個古老的論據,我曾與自己以前戰鬥過。

以夏普拱的領先。他們通過屬性檢查出它們的DomainSignatureAttrribute來解決這些問題,以解決對象的持久性問題。

對我來說,這是域邏輯。任務是在請求中編排一個或多個事件。

我會注入一個倉庫接口到你的核心對象,並在那裏做支票:

public User(IUserRepsoitory userRepository) 
{ 
this.userRepsoitory = userRepository; 
} 

public void IsValid() 
{ 
return userRepository.IsPsswordValid(this); 
} 

我沒有看到這是如何打破任何規則。 This generally isnt recommended

+0

但是Query對象在那裏呢?我認爲這些對象用於執行自定義查詢... –

+0

你在談論http://martinfowler.com/bliki/CQRS.html嗎?然後遵循完全相同的庫注入模式並創建IQuery對象(IUserQueries)並將其注入到您的用戶構造函數中 –

+0

問題是IQuery接口不支持ExecuteQuery方法的參數。您發送的文章看起來不錯,我會花一些時間閱讀它。 –

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]上的某個屬性)。根據您的情況,您可能希望在任務本身擁有該授權。

+0

非常感謝你的例子和解釋。我剛開始接觸夏普體系結構以及它的一切,所以請原諒我的錯誤!我剛買了書「NHibernate in Action」以瞭解更多信息。我會試一試你的例子,看看它是如何工作的! –

相關問題