关于一个网站(基于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()这种,当然中间你想给出什么样的数据,也就可以控制了。
------其他解决方案--------------------
设置成private的话,用户登录,会不会也拿不出密码呢?登录业务上需要去比较输入的密码和数据库中的密码是否一致,如果是private, 应该会取不到吧
------其他解决方案--------------------一般来说用户登录不需要获得密码,只要把用户输入的密码代入比较就可以了。
------其他解决方案--------------------最后我是把Get设成了private, 然后通过expression tree来获取private的值