日期:2014-05-20  浏览次数:20859 次

关于一个网站(基于EF 和 MVC3)用户实体的一个疑问
用户实体中包含了密码等一些私密的数据,但是每次使用EF查询都会全部返回,大家认为有没有必要屏蔽这些私密数据,又该如何屏蔽。

举个例子:


public class User
{
   [Key]
   public string UserName{get;set;}
  
   [Required]
   public string Password{get;set;}

   public int Age {get;set;}
}


利用EF的code first设计了一个如上的User实体,包含密码。当用户通过网站的“注册”功能创建用户的时候,业务逻辑会封装一个包含了用户名和密码的User实例,并调用EF的DbSet<User>.Add(user)方法将这个新用户加入到数据库中。这个时候密码是必须的。

但是,网站上还有个功能是“显示活跃用户”,这会调用EF的DbContext.Set<User>()方法获取用户并筛选, 返回的User就会包含这个用户的所有数据(密码等)。而此时密码是不必要的,返回了密码可能会加大安全隐患。


大家是如何设计的呢? 或者EF有没有什么办法可以使一个Field对某些行为可读,而对某些行为不可读?

------最佳解决方案--------------------
public string Password{private get;set;}


------其他解决方案--------------------
如果你的项目不涉及外包,没必要考虑这个问题。如果有外包方面的需要,那就很有必要了。
EF做这个我觉得还是比较麻烦的,但总算不失为一种方案。
  我的办法是,再增加一层,让外包团队没办法直接访问你的EF生成的增,删,改,查这些操作。
   DbSet<User>.Add(user)
   DbContext.Set<User>() 
   将这些全部屏蔽掉,改为user.Add()这种,当然中间你想给出什么样的数据,也就可以控制了。

------其他解决方案--------------------
引用:
public string Password{private get;set;}


设置成private的话,用户登录,会不会也拿不出密码呢?登录业务上需要去比较输入的密码和数据库中的密码是否一致,如果是private, 应该会取不到吧
------其他解决方案--------------------
一般来说用户登录不需要获得密码,只要把用户输入的密码代入比较就可以了。
------其他解决方案--------------------
最后我是把Get设成了private, 然后通过expression tree来获取private的值