当前位置: 首页 > 编程语言 > C#

使用枚举标志位共享的WPF基于权限的授权

时间:2023-04-10 18:53:28 C#

WPF使用枚举标志位的基于权限的授权我已经做了一个月的C#所以请原谅这个问题的“地方性”,但我一直在研究这几个小时,我已经碰壁了。我已经看到了在WPF应用程序中使用IIdentity和IPrincipal进行基于角色的授权的左右示例。我找不到太多相关信息,但是,在更基于权限的授权方法中,在这个应用程序中想象没有组,只有权限和用户列表,您可以将任何权限分配给任何人。我希望能够:1)能够根据用户权限控制UI/元素,状态如下:启用、只读、不可见、折叠(如此处所示https://uiauth.codeplex.com/)2)能够在类或方法级别执行此操作指定需要哪些权限(类似于http://lostechies.com/derickbailey/2011/05/24/dont-do-role-based-authorization-checks-do-activity-basedchecks/)而不是:[PrincipalPermission(SecurityAction.Demand,Role="Administrators")]我想要的是:[PrincipalPermission(SecurityAction.Demand,Permission="Canaddusers")]现在,我看到的唯一方法是这样做是利用ICommand并使用大量字符串比较在CanExecute方法中放置授权逻辑,以查看用户是否具有执行请求操作所需的权限,如下所示://EmployeeclasspublicboolHasRight(SecurityRightright){返回employee.Permissions.Contains(右);}//实现,检查员工是否有权继续执行if(employee.HasRight(db.SecurityRights.Single(sr=>sr.Description=="Caneditusers"))){//允许执行操作}else{//用户无权继续抛出SecurityException;我听说EnumFlags可能正是我正在寻找的[Flags]Enum属性在C#中意味着什么?我想我理解enum/flag/bits但不足以完成实现......如果我有:EmployeeModel的MainViewEmployeeViewModelThingTwoModelThingTwoViewModel我不知道一切都在哪里以及如何将它们联系在一起......这是我到目前为止所做的(我意识到这不是一个有效的例子......那是我的问题!):[标志]publicenum权限{无=0,创建=1<<0,读取=1<<1,更新=1<<2,删除=1<<3,用户=1<<4,组=1<<5}publicstaticvoidtestFlag(){权限p;varx=p.HasFlag(Permissions.Update)&&p.HasFlag(Permissions.User);变种desiredPermissions=Permissions.User|权限。阅读|权限。创建;if(x&p==desiredPermissions){//用户可以被这个操作符创建和读取}}感谢您的任何指导然后testFlag将无法工作。我想你想要的东西(LINQPadc#程序片段):voidMain(){//可以创建用户但不能读回信息varuserCanBeCreatedPermission=Permissions.Create|权限。用户;//可以创建和回读varuserCanBeCreatedAndReadBackPermission=userCanBeCreatedPermission|权限。阅读;userCanBeCreatedPermission.HasFlag(Permissions.User).Dump();//返回true(userCanBeCreatedPermission.HasFlag(Permissions.User)&&userCanBeCreatedPermission.HasFlag(Permissions.Read)).Dump();//返回false//检查标志的另一种方法是组合标志并进行And掩码检查|权限.读取)).转储();//返回false//使用一个变量来组合可读性和使用权限以及掩码:vardesiredPermissions=Permissions.User|权限。阅读;//检查同时具有Create&#的用户038;读取权限((userCanBeCreatedAndReadBackPermission&desiredPermissions)==desiredPermissions).Dump();//返回true,因为用户信息可以被这个用户读回((userCanBeCreatedAndReadBackPermission&Permissions.Delete)==Permissions.Delete).Dump();//返回false,因为无法删除用户}[Flags]publicenumPermissions{None=0,Create=1这是否回答了您的问题?最终解决方案(.linq):以上为C#学习教程:使用EnumFlagBit的WPF权限授权,分享所有内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注---voidMain(){//权限定义varuserCreate=newAuthorization(Permissions.Create);varuserRead=newAuthorization(Permissions.Read);varcarrotCreate=newAuthorization(Permissions.Create);varcarrotRead=newAuthorization(Permissions.Read);//用户varuser=newUser();//用户还没有权限if(user.IsAuthorized(Permissions.Create))"IcancreateUser".Dump();否则“不为我创建用户”.Dump();//现在用户可以创建用户user.Authorizations.Add(userCreate);if(user.IsAuthorized(Permissions.Create))"我可以创建用户".Dump();否则“不为我创建用户”.Dump();//用户可以读取胡萝卜user.Authorizations.Add(carrotRead);if(user.IsAuthorized(Permissions.Create))"我可以创造胡萝卜".Dump();else“不要为我制作胡萝卜”.Dump();if(user.IsAuthorized(Permissions.Read))"我能读懂胡萝卜".Dump();else“不要给我看胡萝卜”.Dump();//用户现在可以创建胡萝卜user.Authorizations.Add(carrotCreate);if(user.IsAuthorized(Permissions.Create))"我可以创造胡萝卜".Dump();else“不要为我制作胡萝卜”.Dump();}[标志]publicenumPermissions:ulong{Create=1:Auth{publicAuthorization(Permissionspermissions){this.Permissions=permissions;}publicPermissionsPermissions{get;set;}}publicclassCarrot{publicintId{get;设置;}}公共类用户{公共用户(){授权=新列表();}公共列表授权{得到;设置;}publicboolIsAuthorized(Permissionspermission){foreach(varauthinAuthorizations)if(authisAuthorization){v??ara=authasAuthorization;如果(a.Permissions==permission)返回真;}返回假;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: