XAF 如何控制自定义按钮的使用权限

一个有问题的按钮权限控制: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;
默认所以的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 { getset; }   
        
/// <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 { getset; }        
     
public ObjectAccessModifier Modifier 
     { 
getset; }   
 }
////
 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/
原文地址:https://www.cnblogs.com/Tonyyang/p/1979657.html