DevExpress_XPO_自定义安全对象(用户、角色、操作权限)

我们将学习如何创建自定义安全对象(包括角色、用户和权限)。

注:这个例子只适用于XPO应用程序。(要在EF应用程序中使用),请自行修改。

完整项目演示网址请参考官网。

实现自定义的角色和用户对象

  •  角色继承PermissionPolicyRole类,使用附加属性CanExport。
 1 using DevExpress.Persistent.BaseImpl.PermissionPolicy;
 2 // ... 
 3 [DefaultClassOptions, ImageName("BO_Role")]
 4 public class ExtendedSecurityRole : PermissionPolicyRole {
 5     public ExtendedSecurityRole(Session session) : base(session) { }
 6     public bool CanExport {
 7         get { return GetPropertyValue<bool>("CanExport"); }
 8         set { SetPropertyValue<bool>("CanExport", value); }
 9     }
10 }
  •   按照如下方式布局页面。
  • 下面代码演示了自定义用户对象的实现。
 1 using DevExpress.Persistent.BaseImpl.PermissionPolicy;
 2 // ... 
 3 [DefaultClassOptions, ImageName("BO_Employee")]
 4 public class Employee : PermissionPolicyUser {
 5     public Employee(Session session)
 6         : base(session) { }
 7     [Association("Employee-Task")]
 8     public XPCollection<Task> Tasks {
 9         get { return GetCollection<Task>("Tasks");  }
10     }
11 }
12 [DefaultClassOptions, ImageName("BO_Task")]
13 public class Task : BaseObject {
14     public Task(Session session)
15         : base(session) { }
16     private string subject;
17     public string Subject {
18         get { return subject; }
19         set { SetPropertyValue("Subject", ref subject, value); }
20     }
21     private DateTime dueDate;
22     public DateTime DueDate {
23         get { return dueDate; }
24         set { SetPropertyValue("DueDate", ref dueDate, value); }
25     }
26     private Employee assignedTo;
27     [Association("Employee-Task")]
28     public Employee AssignedTo {
29         get { return assignedTo; }
30         set { SetPropertyValue("AssignedTo", ref assignedTo, value); }
31     }
32 }
  •  调用应用程序设计器,并按照下图所示拖拽主键。修改AuthenticationStandard的RoleType和UserType。

 实现自定义操作权限和权限请求

  • 继承接口IOperationPermission。
1 using DevExpress.ExpressApp.Security;
2 // ... 
3 public class ExportPermission : IOperationPermission {
4     public string Operation { 
5         get { return "Export"; }
6     }
7 }
  •  要实现添加权限请求,需要实现IPermissionRequest接口。
1 public class ExportPermissionRequest : IPermissionRequest {
2     public object GetHashObject() {
3         return this.GetType().FullName;
4     }
5 }

在安全策略中实现权限请求处理器

  • 所有权限请求都应该在安全策略中注册适当的权限请求处理器。继承PermissionRequestProcessorBase类,并将权限请求类型作为祖先类的泛型参数传递,以实现一个类作为处理器。
 1 public class ExportPermissionRequestProcessor : 
 2     PermissionRequestProcessorBase<ExportPermissionRequest> {
 3     private IPermissionDictionary permissions;
 4     public ExportPermissionRequestProcessor(IPermissionDictionary permissions) {
 5         this.permissions = permissions;
 6     }
 7     public override bool IsGranted(ExportPermissionRequest permissionRequest) {
 8         return (permissions.FindFirst<ExportPermission>() != null);
 9     }
10 }
  •  在事件处理程序中,将ExportPermission对象传递给PermissionDictionary。

Win版本(Global.asax.cs (Global.asax.vb))

 1 ((SecurityStrategy)winApplication.Security).CustomizeRequestProcessors +=
 2     delegate(object sender, CustomizeRequestProcessorsEventArgs e) {
 3         List<IOperationPermission> result = new List<IOperationPermission>();
 4         SecurityStrategyComplex security = sender as SecurityStrategyComplex;
 5         if (security != null) {
 6             Employee user = security.User as Employee;
 7             if (user != null) {
 8                 foreach (ExtendedSecurityRole role in user.Roles) {
 9                     if (role.CanExport) {
10                         result.Add(new ExportPermission());
11                     }
12                 }
13             }
14         }
15         IPermissionDictionary permissionDictionary = new PermissionDictionary((IEnumerable<IOperationPermission>)result);
16         e.Processors.Add(typeof(ExportPermissionRequest), new ExportPermissionRequestProcessor(permissionDictionary));
17     }; 
18 winApplication.Setup();
19 winApplication.Start();

     ASP.NET版本(Program.cs (Program.vb))

 1 ((SecurityStrategy)WebApplication.Instance.Security).CustomizeRequestProcessors +=
 2     delegate(object s, CustomizeRequestProcessorsEventArgs args) {
 3         List<IOperationPermission> result = new List<IOperationPermission>();
 4         SecurityStrategyComplex security = s as SecurityStrategyComplex;
 5         if (security != null) {
 6             Employee user = security.User as Employee;
 7             if (user != null) {
 8                 foreach (ExtendedSecurityRole role in user.Roles) {
 9                     if (role.CanExport) {
10                         result.Add(new ExportPermission());
11                     }
12                 }
13             }
14         }
15         IPermissionDictionary permissionDictionary = new PermissionDictionary((IEnumerable<IOperationPermission>)result);
16         args.Processors.Add(typeof(ExportPermissionRequest), new ExportPermissionRequestProcessor(permissionDictionary));
17     };
18 WebApplication.Instance.Setup();
19 WebApplication.Instance.Start();

 Application Server

 1 static void Main(string[] args) {
 2     // ... 
 3     Func<IDataServerSecurity> dataServerSecurityProvider = () => {
 4         SecurityStrategyComplex security = new SecurityStrategyComplex(
 5             typeof(Employee), typeof(ExtendedSecurityRole), new AuthenticationStandard());
 6         security.CustomizeRequestProcessors +=
 7             delegate(object sender, CustomizeRequestProcessorsEventArgs e) {
 8                 List<IOperationPermission> result = new List<IOperationPermission>();
 9                 if (security != null) {
10                     Employee user = security.User as Employee;
11                     if (user != null) {
12                         foreach (ExtendedSecurityRole role in user.Roles) {
13                             if (role.CanExport) {
14                                 result.Add(new ExportPermission());
15                             }
16                         }
17                     }
18                 }
19                 IPermissionDictionary permissionDictionary = new PermissionDictionary((IEnumerable<IOperationPermission>)result);
20                 e.Processors.Add(typeof(ExportPermissionRequest), new ExportPermissionRequestProcessor(permissionDictionary));
21             }; 
22         return security;
23     };
24     // ... 
25 }

初始化方法说明

1 WcfDataServerHelper.AddKnownType(typeof(ExportPermissionRequest));

ExportController控制器中考虑自定义权限

自定义中,代码如下(不允许导出数据的用户禁用控制器):

 1 public class SecuredExportController : ViewController {
 2     protected override void OnActivated() {
 3         base.OnActivated();
 4         ExportController controller = Frame.GetController<ExportController>();
 5         if (controller != null) {
 6             controller.ExportAction.Executing += ExportAction_Executing;
 7             if(SecuritySystem.Instance is IRequestSecurity) {
 8                 controller.Active.SetItemValue("Security", 
 9                     SecuritySystem.IsGranted(new ExportPermissionRequest()));
10             }
11         }
12     }
13     void ExportAction_Executing(object sender, System.ComponentModel.CancelEventArgs e) {
14         SecuritySystem.Demand(new ExportPermissionRequest());
15     }
16 }

 添加演示数据

 1 public class Updater : ModuleUpdater {
 2     public Updater(IObjectSpace objectSpace, Version currentDBVersion) : 
 3         base(objectSpace, currentDBVersion) { }
 4     public override void UpdateDatabaseAfterUpdateSchema() {
 5         base.UpdateDatabaseAfterUpdateSchema();
 6         ExtendedSecurityRole defaultRole = CreateUserRole();
 7         ExtendedSecurityRole administratorRole = CreateAdministratorRole();
 8         ExtendedSecurityRole exporterRole = CreateExporterRole();
 9         Employee userAdmin = ObjectSpace.FindObject<Employee>(new BinaryOperator("UserName", "Admin"));
10         if (userAdmin == null) {
11             userAdmin = ObjectSpace.CreateObject<Employee>();
12             userAdmin.UserName = "Admin";
13             userAdmin.IsActive = true;
14             userAdmin.SetPassword("");
15             userAdmin.Roles.Add(administratorRole);
16         }
17         Employee userSam = ObjectSpace.FindObject<Employee>(new BinaryOperator("UserName", "Sam"));
18         if (userSam == null) {
19             userSam = ObjectSpace.CreateObject<Employee>();
20             userSam.UserName = "Sam";
21             userSam.IsActive = true;
22             userSam.SetPassword("");
23             userSam.Roles.Add(exporterRole);
24             userSam.Roles.Add(defaultRole);
25         }
26         Employee userJohn = ObjectSpace.FindObject<Employee>(new BinaryOperator("UserName", "John"));
27         if (userJohn == null) {
28             userJohn = ObjectSpace.CreateObject<Employee>();
29             userJohn.UserName = "John";
30             userJohn.IsActive = true;
31             userJohn.Roles.Add(defaultRole);
32             for (int i = 1; i <= 10; i++) {
33                 string subject = string.Format("Task {0}",i);
34                 Task task = ObjectSpace.FindObject<Task>(new BinaryOperator("Subject", subject));
35                 if (task == null) {
36                     task = ObjectSpace.CreateObject<Task>();
37                     task.Subject = subject;
38                     task.DueDate = DateTime.Today;
39                     task.Save();
40                     userJohn.Tasks.Add(task);
41                 }
42             }
43         }
44         ObjectSpace.CommitChanges();
45     }
46     private ExtendedSecurityRole CreateAdministratorRole() {
47         ExtendedSecurityRole administratorRole = ObjectSpace.FindObject<ExtendedSecurityRole>(
48             new BinaryOperator("Name", SecurityStrategyComplex.AdministratorRoleName));
49         if (administratorRole == null) {
50             administratorRole = ObjectSpace.CreateObject<ExtendedSecurityRole>();
51             administratorRole.Name = SecurityStrategyComplex.AdministratorRoleName;
52             administratorRole.IsAdministrative = true;
53         }
54         return administratorRole;
55     }
56     private ExtendedSecurityRole CreateExporterRole() {
57         ExtendedSecurityRole exporterRole = ObjectSpace.FindObject<ExtendedSecurityRole>(
58             new BinaryOperator("Name", "Exporter"));
59         if (exporterRole == null) {
60             exporterRole = ObjectSpace.CreateObject<ExtendedSecurityRole>();
61             exporterRole.Name = "Exporter";
62             exporterRole.CanExport = true;
63         }
64         return exporterRole;
65     }
66     private ExtendedSecurityRole CreateUserRole() {
67         ExtendedSecurityRole userRole = ObjectSpace.FindObject<ExtendedSecurityRole>(
68             new BinaryOperator("Name", "Default"));
69         if (userRole == null) {
70             userRole = ObjectSpace.CreateObject<ExtendedSecurityRole>();
71             userRole.Name = "Default";
72             userRole.SetTypePermission<Task>(SecurityOperations.FullAccess, SecurityPermissionState.Allow);
73             userRole.SetTypePermission<Employee>(SecurityOperations.ReadOnlyAccess, SecurityPermissionState.Allow);
74             userRole.AddObjectPermission<PermissionPolicyUser>(SecurityOperations.ReadOnlyAccess,
75                  "[Oid] = CurrentUserId()", SecurityPermissionState.Allow);
76         }
77         return userRole;
78     }
79 }

 效果展示

运行WinForm或者ASP.NET,登录“Admin”用户,打开用户的详细视图。

   登录“Sam”用户,“Export To”是可用的;登录“John”,“Export To”不是可用的。

参考网址

[1] https://documentation.devexpress.com/eXpressAppFramework/113384/Task-Based-Help/Security/How-to-Implement-Custom-Security-Objects-Users-Roles-Operation-Permissions

[2]完整项目演示:www.devexpress.com/example=E3794

[3] PermissionPolicyRole 的属性信息:https://documentation.devexpress.com/eXpressAppFramework/DevExpress.Persistent.BaseImpl.PermissionPolicy.PermissionPolicyRole.members

转载于:https://www.cnblogs.com/luyj00436/p/11504468.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.系统特点 本插件框架实现了界面与逻辑的解偶,从此告别在代码中到处判断工具栏上按钮的使能,同时在不修改系统已有代码的前提下也能实现向系统中增加功能即符合开放-封闭原则,避免在扩展新功能时需要大量修改已有代码,从而又引入了新的BUG,且各模块可以相对比较独立,多人同时开发,从而实现快速开发。 2.运行体验 如果你看到本文档说明你已成功下载了本插件框架的运行包和示例源码,请确保你的电脑安装了.net framework4.0,以及ACE引擎(通过OLEDB访问ACCESS数据库,一般安装了OFFICE以后即具有此引擎)。 运行步骤:(1)将压缩包解压 (2)进入OUTPUT目录,直接运行MainForm.exe文件,输入用户名:admin,密码为空,点击登录即可进入软件。 进入软件后,系统会自动打开Customers数据库信息,该界面显示Customers数据库的列表。工具栏上方还有配置、权限管理两个主要功能页面,其主要功能如下: 配置:本功能页面主要实现的功能是插件的配置,用于配置插件运行的DLL,系统的名称,插件所包含的功能按钮(在DLL中可以包含多个插件,如果在配置文件中没有配置,系统也不会显示出来),包括工具页面,每个工具页面可以包含多个按钮。也可以设置某个功能插件能够自动运行(即打开软件直接打开工功能,如Customers数据库即是被定义为自启动的示例),PAD面板(示例中的测试面板)。 权限管理:权限管理实现了基本的权限管理包括用户管理,用户权限角色管理,角色权限。特点在于不光能根据角色分配权限,也能对用户单独分配临时权限。 3.开发环境 要编译运行本示例源码请确保你的计算机上已安装: Visual studio 2010 .net framework4.0 DevExpress11.1.6(编译需要安装此包,运行只需要包含相关的DLL文件,已在本包中包含) 解压压缩包,使用visual studio2010打开文件夹中的td.Addin.sln工程文件,点击运行,即可自动编译,如果提示LC.EXE已退出错误,请再次确认你已安装了DevExpress11.1.6。 4.开发体验 任务:向系统中增加一个功能:在customers的工具栏增加一个显示详情按钮,点击此按钮弹出对话框显示当前选中行的信息。本示例展示如何在不修改原有代码的情况下增加功能。 步骤:1.在解决方案中增加一个类库工程:EditNorthWindForm 2.向该工程增加引用:引用位于OUTPUT文件夹中的NorthWind.dll td.Core.dll td.Security.dll 以及所有以DevExpress开头的文件(由于界面使用了DEV控件,所以必须引用) ,添加.NET 的文件System.Drawing System.Windows.Forms。 3.向工程中增加窗口文件:EditNorthWindForm.cs,在工程上点右键,选择添加窗口,如下: 然后将窗口绘制成需要的样式,如增加TEXTBOX等。 将代码修改为: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using DevExpress.XtraEditors; using td.Core; namespace NorthWind { public partial class EditNorthWindForm : DevExpress.XtraEditors.XtraForm { public EditNorthWindForm() { InitializeComponent(); CenterToScreen(); var view= WorkBenchSingleTon.WorkBench.GetTabPage("Customers"); if (view != null) { var control = view.ViewContentControl as NorthWind.NortWindControl; if (control.gridView.gridView1.GetSelectedRow

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值