• 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/
  • 相关阅读:
    配置 L3 agent
    Why Namespace?
    虚拟 ​router 原理分析
    创建 router 连通 subnet
    用 config drive 配置网络
    cloud
    写在最前面
    使用apktool工具遇到could not decode arsc file的解决办法
    php-fpm优化
    解决官网下载jdk只有5k大小的错误
  • 原文地址:https://www.cnblogs.com/Tonyyang/p/1979657.html
Copyright © 2020-2023  润新知