您的位置:首页 > 其它

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐