编写高质量代码改善C#程序的157个建议——建议121:为应用程序设定运行权限
建议121:为应用程序设定运行权限
在某些情况下,可能存在这样的需求:只有系统管理员才能访问某应用程序的若干功能。这个时候,可以结合.NET中提供的代码访问安全性(Code Access Security)和基于角色(Role-Based Security)的安全性去实现。
如果要通过一下的代码正常的访问类型SampleClass,用户必须以Administrator的身份运行代码:
- class Program
- {
- static void Main()
- {
- AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
- SampleClass sample = new SampleClass();
- Console.WriteLine("代码成功运行...");
- }
- }
- [PrincipalPermission(SecurityAction.Demand, Role = @"Administrator")]
- //[PrincipalPermission(SecurityAction.Demand, Role = @"Users")]
- class SampleClass
- {
- }
如果恰巧我们是以User用户组的用户登录系统的,则会抛出异常System.Security.SecurityException:对主体权限的请求失败。只要还原上文中的那条注释的属性,就能让代码正确运行。
可以为类型增加多条PrincipalPermission属性,多个PrincipalPermission属性之间是“OR”的关系。
对于代码的控制可以细化到方法,代码如下:
- class Program
- {
- static void Main()
- {
- AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
- SampleClass sample = new SampleClass();
- sample.SampleMethod();
- sample.SampleMethodSec();
- Console.WriteLine("代码成功运行...");
- }
- }
- class SampleClass
- {
- public void SampleMethod()
- {
- Console.WriteLine("执行方法SampleMethod");
- }
- [PrincipalPermission(SecurityAction.Demand, Role = @"Administrator")]
- //[PrincipalPermission(SecurityAction.Demand, Role = @"Users")]
- public void SampleMethodSec()
- {
- Console.WriteLine("执行方法SampleMethodSec");
- }
- }
这段代码如果不是以Administrator身份运行的,则在执行完毕SampleMethod方法后也会抛出SecurityException。
除了使用Windows用户和角色,我们还可以使用用户自定义的主体。比如在一个考试系统中,只有教师才能修改成绩,而考生只能具备浏览功能。为了充分了解代码的机制,以下代码我们不用属性声明的方式:
- class Program
- {
- static void Main()
- {
- GenericIdentity examIdentity = new GenericIdentity("ExamUser");
- //String[] Users = { "Teacher", "Student" };
- String[] Users = { "Student" };
- GenericPrincipal MyPrincipal = new GenericPrincipal(examIdentity, Users);
- Thread.CurrentPrincipal = MyPrincipal;
- ScoreProcessor score = new ScoreProcessor();
- score.Update();
- }
- }
- class ScoreProcessor
- {
- public void Update()
- {
- try
- {
- PrincipalPermission MyPermission = new PrincipalPermission("ExamUser", "Teacher");
- MyPermission.Demand();
- //省略
- Console.WriteLine("修改成绩成功");
- }
- catch (SecurityException e)
- {
- Console.WriteLine(e.Message);
- }
- }
- }
以上代码运行时会抛出异常,因为我们在调用Update方法的时候只配置了Student组。要使代码能够成功运行,应该在调用处使用注释掉的那行代码。
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
编写高质量代码改善C#程序的157个建议——建议121:为应用程序设定运行权限的更多相关文章
- 博友的 编写高质量代码 改善java程序的151个建议
编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html
- 编写高质量代码--改善python程序的建议(六)
原文发表在我的博客主页,转载请注明出处! 建议二十八:区别对待可变对象和不可变对象 python中一切皆对象,每一个对象都有一个唯一的标识符(id()).类型(type())以及值,对象根据其值能否修 ...
- 编写高质量代码--改善python程序的建议(八)
原文发表在我的博客主页,转载请注明出处! 建议四十一:一般情况下使用ElementTree解析XML python中解析XML文件最广为人知的两个模块是xml.dom.minidom和xml.sax, ...
- 编写高质量代码改善java程序的151个建议——导航开篇
2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...
- 编写高质量代码改善python程序91个建议学习01
编写高质量代码改善python程序91个建议学习 第一章 建议1:理解pythonic的相关概念 狭隘的理解:它是高级动态的脚本编程语言,拥有很多强大的库,是解释从上往下执行的 特点: 美胜丑,显胜隐 ...
- 编写高质量代码改善C#程序的157个建议[1-3]
原文:编写高质量代码改善C#程序的157个建议[1-3] 前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理 ...
- 编写高质量代码改善程序的157个建议:第87个建议之区分WPF和WinForm的线程模型
今天有时间了,继续<编写高质量代码改善程序的157个建议>的阅读,当我阅读到建议87的时候,里面的一些代码示例和文中所说的不一致了,是不是我现在用的是NetFramework 4.0的缘故 ...
- 编写高质量代码改善java程序的151个建议——[1-3]基础?亦是基础
原创地址: http://www.cnblogs.com/Alandre/ (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks The reasonable man adapts himse ...
- 编写高质量代码:改善Java程序的151个建议 --[117~128]
编写高质量代码:改善Java程序的151个建议 --[117~128] Thread 不推荐覆写start方法 先看下Thread源码: public synchronized void start( ...
- 编写高质量代码:改善Java程序的151个建议 --[106~117]
编写高质量代码:改善Java程序的151个建议 --[106~117] 动态代理可以使代理模式更加灵活 interface Subject { // 定义一个方法 public void reques ...
随机推荐
- JAVA线程分析定位排查
java开发中有的时间经常遇到某个线程消耗CPU高的问题,但是不清楚这个线程在做什么. 于是网上看了一些文章,找到了一个比较靠谱的办法(Linux下,Windows同理) : 首先使用top确认是否消 ...
- js中Number()、parseInt()和parseFloat()的区别
一:Number() 如果是Boolean值,true和false值将分别被转换为1和0. 如果是数字值,只是简单的传入和返回. 如果是null值,返回0. 如果是undefined,返回NaN. 如 ...
- redis的二种启动方式
.直接启动 进入redis根目录,执行命令: #加上‘&’号使redis以后台程序方式运行 1 ./redis-server & 2.通过指定配置文件启动 可以为redis服务启 ...
- 02_java之数据类型和基本运算
01变量概述 * A: 什么是变量? * a: 变量是一个内存中的小盒子(小容器),容器是什么?生活中也有很多容器,例如水杯是容器,用来装载水:你家里的大衣柜是容器,用来装载衣裤:饭盒是容器,用来装载 ...
- C++函数及参数
传值->传递的是数据副本(结构.普通数据类型数据) 传地址->传递的是数据变量的地址(数组等) 传值的缺点是需要复制数据副本,数据量大可能增加内存需求,降低系统运行速度; 传地址也有传地址 ...
- 呕心沥血Android studio使用JNI实例
发现网上很多JNI的使用教程,也很详细,不过有的地方有些缺漏,导致很多小问题难以解决的,今天就来总结一下. 准备工作:下载NDK. 简单的说,要用到C/C++,就要用NDK.直接百度搜索然后去官网下载 ...
- LeetCode题解 #1 Two Sum
在LeetCode做的第一到题 题目大意:给出n个数,在其中找出和为一个特定数的两个数. Input: numbers={2, 7, 11, 15}, target=9Output: index1=1 ...
- **python中的类和他的成员
面向对象是一种编程方式,此编程方式的实现基于对 类 和 对象 的使用. Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. 在这里,为文章中使用 ...
- Daemon进程
这又是一个有趣的概念,daemon在英语中是"精灵"的意思,就像我们经常在迪斯尼动画里见到的那些,有些会飞,有些不会,经常围着动画片的主人公转来转去,啰里啰唆地提一些忠告,时不时倒 ...
- Unity 输入与控制
1. 鼠标输入 有关的方法和变量如下: 在 Unity 中,鼠标位置用屏幕的像素坐标表示,屏幕左下角为(0,0),右上角为(Screen.width,Screen.height). 2. 键盘操作 有 ...