XAF 如何控制自定义按钮的使用权限[转]
2011-08-11 16:46
453 查看
一个有问题的按钮权限控制:http://www.devexpress.com/Support/Center/p/Q261403.aspx(一个角色只能控制一个按钮权限) 隐藏显示按钮:http://www.devexpress.com/Support/Center/kb/p/K18055.aspx Check Permission http://documentation.devexpress.com/#Xaf/CustomDocument2981 Action based Permission:http://www.devexpress.com/Support/Center/p/Q141870.aspx
1.新建一个角色 AuditWorkHourRevocate
2.在ViewController上加入一个SampleAction:btnAuditWorkHour
3.在要控制的目标DomainObject类加上如下修饰即可控制 [Appearance("btnAuditWorkHourDisabled", AppearanceItemType = "Action", TargetItems = "btnAuditWorkHour", Enabled = false, Criteria = "Create_Uid.Roles[Name='AuditWorkHourRevocate'].Count<=0 ")]
缺点:角色名稱在程序中写死。
最好的方案用Expand中ActionState.
4.自己的实现方案(经简单测试通过)
在Main方法内加入: ((SecurityComplex)application.Security).IsGrantedForNonExistentPermission = true;
web 程序: Global.asax.cs ((SecurityComplex)WebApplication.Instance.Security).IsGrantedForNonExistentPermission = true;
默认所以的Action是开启的,若想禁用请在角色权限加入拒绝即可。
using DevExpress.ExpressApp.Security; using DevExpress.ExpressApp; namespace MemberLevelSecurityDemo.Module { using System; using System.Collections.Generic; using System.Linq; using DevExpress.Xpo; using System.ComponentModel; using System.Security; using DevExpress.ExpressApp.Actions; using DevExpress.Persistent.Base; using System.Collections; using DevExpress.ExpressApp.Model; /// <summary> /// 用角色管理Action /// Tonyyang /// Create On:2011-3-17 /// Modify On:2011-05-24 /// </summary> [NonPersistent, DefaultProperty("DisplayName")] public class ActionAccessPermission : PermissionBase { public ActionAccessPermission() { } /// <summary> /// 構造函數 /// </summary> /// <param name="actionId">按鈕ID</param> /// <param name="modifier">權限訪問類型</param> public ActionAccessPermission(string actionId, ObjectAccessModifier modifier) { this.ActionId = actionId; this.Modifier = modifier; } /// <summary> /// 顯示名稱 /// </summary> public string DisplayName { get { return this.ToString(); } } //public ActionBase Action { get; set; } /// <summary> /// 按鈕訪問權限項目List集合 /// </summary> private List<ActionAccessPermissionItem> items = new List<ActionAccessPermissionItem>(); private ActionAccessPermissionItem GetDesignModeItem() { if (items.Count > 1) { throw new InvalidOperationException(); } if (items.Count == 0) { items.Add(new ActionAccessPermissionItem()); } return items[0]; } /// <summary> /// 複製按鈕訪問權限項目 /// </summary> /// <returns></returns> private List<ActionAccessPermissionItem> CloneItems() { List<ActionAccessPermissionItem> clonedItems = new List<ActionAccessPermissionItem>(); foreach (ActionAccessPermissionItem item in items) { clonedItems.Add(new ActionAccessPermissionItem(item)); } return clonedItems; } /// <summary> /// 建立目前使用權限和指定之使用權限聯集的使用權限。 /// </summary> /// <param name="target"></param> /// <returns></returns> public override System.Security.IPermission Union(System.Security.IPermission target) { ActionAccessPermission result = (ActionAccessPermission)Copy(); result.items.AddRange(((ActionAccessPermission)target).CloneItems()); return result; } /// <summary> /// 判斷目前使用權限是否為指定之使用權限的子集。 /// </summary> /// <param name="target"></param> /// <returns></returns> public override bool IsSubsetOf(System.Security.IPermission target) { if (base.IsSubsetOf(target)) { foreach (ActionAccessPermissionItem targetItem in ((ActionAccessPermission)target).items) { if (targetItem.ActionId == ActionId) { return targetItem.Modifier == Modifier; } } return true; } return false; } /// 對象訪問方式 /// </summary> public ObjectAccessModifier Modifier { get { return GetDesignModeItem().Modifier; } set { GetDesignModeItem().Modifier = value; } } /// <summary> /// 使用 XML 編碼方式重建具有指定狀態的安全性物件。 /// </summary> /// <returns></returns> public override System.Security.SecurityElement ToXml() { SecurityElement result = base.ToXml(); SecurityElement itemElement = new SecurityElement("ActionAccessPermissionItem"); itemElement.AddAttribute("Modifier", Modifier.ToString()); itemElement.AddAttribute("ActionId", ActionId); result.AddChild(itemElement); return result; } /// <summary> /// 建立安全性物件和其目前狀態的 XML 編碼方式。 /// </summary> /// <param name="element"></param> public override void FromXml(System.Security.SecurityElement element) { items.Clear(); if (element.Children != null) { if (element.Children.Count != 1) { throw new InvalidOperationException(); } SecurityElement childElement = (SecurityElement)element.Children[0]; Modifier = (ObjectAccessModifier)Enum.Parse(typeof(ObjectAccessModifier), childElement.Attributes["Modifier"].ToString()); ActionId = childElement.Attributes["ActionId"].ToString(); } } public override string ToString() { return String.Format("{0} - {1}", ActionId, Modifier); //return base.ToString(); } /// <summary> /// 建立並傳回目前使用權限的相同複本 /// </summary> /// <returns></returns> public override System.Security.IPermission Copy() { ActionAccessPermission result = new ActionAccessPermission(); result.items.AddRange(CloneItems()); return result; } /// <summary> /// 按鈕ID /// </summary> [DataSourceProperty("Types")] [Custom("PropertyEditorType", "MemberLevelSecurityDemo.Module.WinStringArrayComboPropertyEditor")] public string ActionId { get { return GetDesignModeItem().ActionId; } set { GetDesignModeItem().ActionId = value; } } [Browsable(false)] public object Types { get { return GetActionIds(Action); } } public static ActionBase Action { get; set; } /// <summary> /// 獲取系統中所有ActionId /// </summary> /// <param name="action">ActionBase</param> /// <returns>ActonIds</returns> public string[] GetActionIds(ActionBase action) { if (action != null) { ArrayList result = new ArrayList(); foreach (IModelAction item in action.Model.Application.ActionDesign.Actions) { result.Add(item.Id); } return result.ToArray(typeof(string)) as string[]; } return null; } } } ////////// public class ActionAccessPermissionItem { public ActionAccessPermissionItem() { } public ActionAccessPermissionItem(ActionAccessPermissionItem source) { this.ActionId = source.ActionId; this.Modifier = source.Modifier; } public string ActionId { get; set; } public ObjectAccessModifier Modifier { get; set; } } //// public class ViewController1 : ViewController { public ViewController1() { //InitializeComponent(); //RegisterActions(components); } protected override void OnActivated() { foreach (Controller controller in Frame.Controllers) { foreach (ActionBase action in controller.Actions) { bool isAction = SecuritySystem.IsGranted(new ActionAccessPermission(action.Id, ObjectAccessModifier.Allow)); action.Active.SetItemValue("ActionState1", isAction); if (ActionAccessPermission.Action == null) ActionAccessPermission.Action = action; } } } }
出处:http://www.cnblogs.com/Tonyyang/
相关文章推荐
- XAF 如何控制自定义按钮的使用权限
- abap报表中(ALV或者普通屏幕的定制控制中)如何让列可以使用求和按钮
- 通过servlet.jsp.tagext.TagSupport的自定义标签实现按钮权限控制
- How to use the windows active directory to authenticate user via logon form 如何自定义权限系统,使用 active directory验证用户登录
- 如何在页面中使用Acegi权限集合和taglib控制页面元素
- 如何自定义注解实现简单的权限控制
- struts2如何使用拦截器进行用户权限控制实例
- ASP.NET Core中使用自定义验证属性控制访问权限
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射
- Apache Shiro 权限控制 使用自定义的JdbcRealm(3)
- [原] XAF 11.2权限扩展之角色按钮权限控制
- 如何在windows xp下使用ntfs权限控制
- XAF-如何实现自定义权限系统用户对象
- struts2如何使用拦截器进行用户权限控制
- 如何在weblogic 中对EJB 使用角色权限控制
- cakephp学习:大部分动作使用Auth组件来控制权限,但少部分不用,如何实现?
- 如何设计和使用自定义的权限对象(自定义权限检查函数)
- 使用angular 实现简单 用户-角色-菜单-按钮权限控制
- ABAP实例:如何设计和使用自定义的权限对象
- 如何设计和使用自定义的权限对象(自定义权限检查函数)