博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XAF 如何控制自定义按钮的使用权限
阅读量:5093 次
发布时间:2019-06-13

本文共 6294 字,大约阅读时间需要 20 分钟。

 

一个有问题的按钮权限控制:(一个角色只能控制一个按钮权限)

隐藏显示按钮:

Check Permission

1.新建一个角色 
 
 [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 { 
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;           
             }        
         }     
     }  
 }
欢迎转载,转载请注明出处:

转载于:https://www.cnblogs.com/Tonyyang/archive/2011/03/10/1979657.html

你可能感兴趣的文章
docker+gitlab的安装和迁移
查看>>
P3232 [HNOI2013]游走 解题报告
查看>>
Spring 事务相关点整理
查看>>
HDU 2546 饭卡
查看>>
如何将字符串常量转为变量?
查看>>
SoapUI
查看>>
弹出遮罩和对话框
查看>>
西游释厄传 所有物品代码
查看>>
模式学习之创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。...
查看>>
越狱的 iPhone、iPad 通过网站实现一键安装 ipa 格式的 APP 应用
查看>>
总结的比较好的OpenGL教程
查看>>
property 与 attribute的区别
查看>>
Circle
查看>>
2018-2019-2 20175232 实验四《Android程序设计》实验报告
查看>>
httpserver
查看>>
mysql with c++
查看>>
2019.3.28
查看>>
第七天android:弹球1
查看>>
POJ3252 Round Numbers
查看>>
Android Studio配置完毕Genymotion 看不到Genymotion图标
查看>>