这里,我只是以一个例子,说一下简单权限控制,通过这个例子,大家可以设计庞大的权限管理层,把权限控制封装到数据库访问层,这样程序员就不用再写权限判断的代码了

首先,先看看我数据库DBContext的定义

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace WebApplication1
{
public class SysDB:Test.DB.TestDB
{
public SysDB()
: base(@"data source=""F:\SqliteLinqTest\TestDB""", EntityDB.DatabaseType.Sqlite)
{
} }
}

程序员读取UserInfo表,代码是这样

            var db = new SysDB();
var datasource = db.UserInfo.ToArray();

现在,有这样的需求,当前登录用户如果是admin,那么可以读取UserInfo所有字段的值,否则,只能读取id、UserName这两个字段值,并且不能显示属于财务部的user

通常,如果没有权限控制层,程序员需要这样写代码

            var db = new SysDB();
IQueryable<Test.UserInfo> query;
if (CurrentUserName == "admin")
{
query = db.UserInfo;
}
else
{
query = from m in db.UserInfo
where db.Department.Any(p=>p.Name == "财务部" && p.id == m.DepartmentID) == false
select new Test.UserInfo
{
id = m.id,
UserName = m.UserName
};
}
var datasource = query.ToArray();

如果每个页面,甚至每个控件绑定数据的时候,都需要程序员这样写代码做过滤,首先,累死程序员,其次,程序员如果忘记做判断,系统就存在了权限漏洞

现在,我就要把这条规则,封装到数据库访问层,我只需要在DBContext里面做一下重载

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace WebApplication1
{
public class SysDB:Test.DB.TestDB
{
public SysDB()
: base(@"data source=""F:\SqliteLinqTest\TestDB""", EntityDB.DatabaseType.Sqlite)
{
} public override IQueryable<Test.UserInfo> UserInfo
{
get
{
IQueryable<Test.UserInfo> query;
if (Helper.CurrentUserName == "admin")
{
query = base.UserInfo;
}
else
{
query = from m in base.UserInfo
where this.Department.Any(p => p.Name == "财务部" && p.id == m.DepartmentID) == false
select new Test.UserInfo
{
id = m.id,
UserName = m.UserName
};
} return query;
}
}
}
}

OK,封装完毕了,以后,程序员读取UserInfo表,代码还是这样就可以了

            var db = new SysDB();
var datasource = db.UserInfo.ToArray();

而且,不管程序员加任何的where条件,都不会读出属于财务部的user数据,真正做到把权限封死在数据库访问层了

其次,像我前面文章里面提到的那些支持Entity对象的控件,如EntityGridView、TextBoxList等自动绑定数据的控件,由于它们底层也是访问DBContext对象,所以也是受到这个权限的约束

注意:像下面这种写法

                    query = from m in base.UserInfo
where this.Department.Any(p => p.Name == "财务部" && p.id == m.DepartmentID) == false
select new Test.UserInfo
{
id = m.id,
UserName = m.UserName
};
select new Test.UserInfo 这样的写法,在标准的Entity Framework 6 里面是报错的,因为new的类型不能和表对象的类型相同,这种写法,只有在我前面文章介绍的Mr.E生成的数据库dll可以这样写

(Entity framework 应用篇)把权限判断封装在数据库访问层的更多相关文章

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 前言:这 ...

  2. Entity Framework 学习笔记(一)之数据模型 数据库

    关于Entity Framework  数据模型 的开发有三种模式:1.引用数据库方式:2.在VS中新建EF空模型Model 方式:3.Code 方式 Entity Framework  数据模型   ...

  3. Entity Framework 第二篇 事务

    Entity Framework  事务 结合第一篇的代码 public class BaseRepository : ITransaction, IDisposable { private XFDb ...

  4. Entity Framework 6.x - 创建模型来自于现有数据库

    Creating a Model from an Existing Database 一.创建数据库 Chapter2 USE master GO CREATE DATABASE Chapter2 G ...

  5. Entity Framework 第九篇 关于自增列的事务处理

    如果一个表带有自增列的,那么在事务处理的过程中,如果抑制了提交,自增的序号就不会得到,如果我们需要得到那怎么办呢?可以临时提交,但是既然提交了就要考虑到事务回滚,否则无法满足数据的一致性 public ...

  6. Entity Framework 第一篇

    这段时间研究了orm框架EF 写一写研究的历程和心得 先贴上核心代码 public interface ITransaction { bool IsTransaction { get;} void B ...

  7. Entity Framework应用:使用Code First模式管理数据库创建和填充种子数据

    一.管理数据库连接 1.使用配置文件管理连接之约定 在数据库上下文类中,如果我们只继承了无参数的DbContext,并且在配置文件中创建了和数据库上下文类同名的连接字符串,那么EF会使用该连接字符串自 ...

  8. ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借

    ASP.NET MVC深入浅出系列(持续更新)   一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...

  9. Entity Framework学习笔记(二)----CRUD(1)

    请注明转载地址:http://www.cnblogs.com/arhat 这篇文章老魏和大家分享一下Entity Framework的CRUD操作,在这之前呢,老魏先说一下老魏对EF的一个整体的认识, ...

随机推荐

  1. Javascript: 动态显示进度条

    {% if not config.exec_id == '' %} <br /> <div class="progress"> <div class= ...

  2. Android利用Volley异步载入数据完整具体演示样例(二)

    MainActivity例如以下: package cc.y; import android.app.Activity; import android.content.Context; import ...

  3. LeetCode 804. Unique Morse Code Words (唯一摩尔斯密码词)

    题目标签:String 题目给了我们 对应每一个 字母的 morse 密码,让我们从words 中 找出 有几个不同的 morse code 组合. 然后只要遍历 words,把每一个word 转换成 ...

  4. Dungeon Game -- latched

    The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. ...

  5. 从头认识Spring-1.9 内部类注入Bean

    这一章节我们来讨论一下内部类注入Bean. 1.domain 蛋糕类:(跟前一章节的一样) package com.raylee.my_new_spring.my_new_spring.ch01.to ...

  6. android TextView不用ScrollViewe也可以滚动的方法

    TextView textview = (TextView) findViewById(R.id.text); /** * * 只有调用了该方法,TextView才能不依赖于ScrollView而实现 ...

  7. JSP-Runoob:JSP 异常处理

    ylbtech-JSP-Runoob:JSP 异常处理 1.返回顶部 1. JSP 异常处理 当编写JSP程序的时候,程序员可能会遗漏一些BUG,这些BUG可能会出现在程序的任何地方.JSP代码中通常 ...

  8. PCB genesis自制孔点 Font字体实现方法

    一.先看genesis原有Font字体 在PCB工程CAM加孔点字体要求时,通常我们直接用Geneis软件给我们提供了2种孔点字体canned_57与canned_67,但此字体可能不能满足各个工厂个 ...

  9. C. Searching for Graph(cf)

    C. Searching for Graph time limit per test 1 second memory limit per test 256 megabytes input standa ...

  10. keystone身份认证服务

    Keystone介绍 keystone 是OpenStack的组件之一,用于为OpenStack家族中的其它组件成员提供统一的认证服务,包括身份验证.令牌的发放和校验.服务列表.用户权限的定义等等.云 ...