文件访问控制机制
一、要求简述
用访问控制矩阵实现对文件的存取控制
能够成功创建主体,客体,并且可添加对对象进行的操作权限,例如读R,写W,执行E;能够成功删除文件对象的某个权限以及成功删除整个文件。
系统具有人性化,如果出现删除的权限不存在,输入的客体或者主体已经存在,删除未添加的权限,系统需给出提示性语句
当用户向文件系统提出存取要求时,由存取控制验证模块根据该矩阵内容对本次存取要求进行比较,如果不匹配的话,系统拒绝执行。例如语句错误。
二、主要代码
package Main;
import java.util.*;
import javafx.util.Pair;
public class Main
{
public static void main(String[] args)
{
try(Scanner in = new Scanner(System.in))//try-cash语句,为了处理异常,会再次提醒用户
{
Set<String> subjects = new HashSet<>();//利用接口编程,实现多态,,有时候可能不知道子类需要何种类型而声明一个接口,是hashset的类型
Set<String> objects = new HashSet<>();
Map<Pair<String, String>, Set<String>> so = new HashMap<>();
int line = Integer.parseInt(in.nextLine());//将map里面的String类型的数字,转化成某进制的int类型
for(int i = 0; i < line; i++)
{
String instruction = in.nextLine();
String[] elements = instruction.split("\\s+");
String instructionType = elements[0];
if(instructionType.equals("create")) finish1:
{
if(elements.length != 3)
{
System.err.println("create命令输入错误");
break finish1;
}
if(elements[1].equals("subject"))
{
if(subjects.contains(elements[2]))
{
System.err.println("输入的主体已存在");
break finish1;
}
else subjects.add(elements[2]);
}
else if(elements[1].equals("object"))
{
if(objects.contains(elements[2]))
{
System.err.println("输入的客体已存在");
break finish1;
}
else objects.add(elements[2]);
}
else
{
System.err.println("创建的对象错误");
break finish1;
}
System.out.println("命令成功执行1");
}
else if(instructionType.equals("enter")) finish2:
{
if(elements.length != 4)
{
System.err.println("enter命令输入错误");
break finish2;
}
String[] triple = elements[3].replaceAll("\\[|\\]", "").split("\\,");
if(subjects.contains(triple[0]) && objects.contains(triple[1]))
{
Pair<String, String> key = new Pair<>(triple[0], triple[1]);
Set<String> value;
if(so.containsKey(key)) value = so.get(key);
else value = new HashSet<>();
value.add(elements[1]);
so.put(key, value);
}
else
{
System.err.println("[" + triple[0] + "," + triple[1] + "]不存在");
break finish2;
}
System.out.println("命令成功执行2");
}
else if(instructionType.equals("delete")) finish3:
{
if(elements.length != 4)
{
System.err.println("delete命令输入错误");
break finish3;
}
String[] triple = elements[3].replaceAll("\\[|\\]", "").split("\\,");
if(subjects.contains(triple[0]) && objects.contains(triple[1]))
{
Pair<String, String> key = new Pair<>(triple[0], triple[1]);
if(so.containsKey(key))
{
Set<String> value = so.get(key);
if(value.contains(elements[1]))
{
value.remove(elements[1]);
so.put(key, value);
}
else
{
System.err.println("欲删除的权限不存在");
break finish3;
}
}
else
{
System.err.println("[" + triple[0] + "," + triple[1] + "]不存在");
}
}
else
{
System.err.println("[" + triple[0] + "," + triple[1] + "]不存在");
break finish3;
}
System.out.println("命令成功执行3");
}
else if(instructionType.equals("destory")) finish4:
{
if(elements.length != 3)
{
System.err.println("destory命令输入错误");
break finish4;
}
if(elements[1].equals("subject"))
{
if(subjects.contains(elements[2]))
{
subjects.remove(elements[2]);
Iterator<Map.Entry<Pair<String, String>, Set<String>>> iter = so.entrySet().iterator();
while(iter.hasNext())
{
Map.Entry<Pair<String, String>, Set<String>> m = iter.next();
String pk = m.getKey().getKey();
String temp = elements[2];
if(pk.equals(temp))
{
iter.remove();
}
}
}
else
{
System.err.println("输入的主体不存在");
break finish4;
}
}
else if(elements[1].equals("object"))
{
if(objects.contains(elements[2]))
{
objects.remove(elements[2]);
Iterator<Map.Entry<Pair<String, String>, Set<String>>> iter = so.entrySet().iterator();
while(iter.hasNext())
{
Map.Entry<Pair<String, String>, Set<String>> m = iter.next();
String pv = m.getKey().getValue();
String temp = elements[2];
if(pv.equals(temp))
{
iter.remove();
}
}
}
else
{
System.err.println("输入的客体不存在");
break finish4;
}
}
else
{
System.err.println("删除的对象错误");
break finish4;
}
System.out.println("命令成功执行4");
}
}
/*System.err.println(subjects);
System.err.println(objects);
System.err.println(so);*/
}
}
}
/*
成功创建主体客体,成功添加权限,删除某文件中的某个权限,删除整个文件
11
create subject a
create object b
create object d
create subject c
enter r into [a,b]
enter w into [a,b]
enter r into [c,b]
enter o into [a,d]
enter i into [a,b]
delete r from [a,b]
destory subject c
如果删除的权限不存在,系统将给与提示
4
create subject a
create object b
enter r into [a,b]
delete w from [a,b]
如果输入的客体已经存在,系统将给与提示
3
create subject a
create object b
create object b
如果输入的主体已经存在,系统给与提示
2
create subject a
create subject a
如果删除未输入的权限,系统将给与提示
2
create subject a
delete r from [a,b]
delete命令错误
2
create subject a
delete from [a,b]
*/
三、测试结果
(1)成功创建主体客体,成功添加权限,删除某文件中的某个权限,删除整个文件
(2)如果删除的权限不存在,系统将给与提示
(3)如果输入的主体or客体已经存在,系统将给与提示
- 如果删除未输入的权限,系统将给出提示
- delete命令错误
四、分析与总结
此次项目满足了大作业要求,实现了用访问控制矩阵实现对文件的存取控制的功能,访问控制矩阵,它由三元组(S,O,A)来定义,其中:
S是主体的集合——行标对应主体
O是客体的集合——列标对应客体
A是访问矩阵,矩阵元素A[s,o]是主体s在o上实施的操作
主体是访问操作中的主动实体,客体是访问操作中的被动实体,主体对客体进行访问,系统根据访问矩阵来进行访问控制。
在操作系统的访问控制矩阵中,系统可能需要访问的任何东西,如文件,一块硬件或进程,被称为一个对象。像用户进程和其他可能需要访问的文件之类的主体有不同的访问能力(如读,写,读写),称为权限。矩阵列出沿着一个轴的对象和沿着另一个轴的对象,以提供关于分配给不同主题的变化权利的信息。有两种控制方式,一种基于行的方式,即将访问权限绑定到主体上,主体对于客体拥有不同权限。Capability基于此种方式实现。例如seL4。另一种基于列的方式,对于特定的客体,记录不同主体对其的访问权限。ACL(Access Control List)基于此种方式实现。例如Linux。
我的程序中,使用java语言定义二维矩阵进行存取控制,矩阵内容一维是主题,另一维为客体,矩阵元素则是用户对文件的存取控制权,包括读R,写W,执行E等等。在程序初始时,建立主体,A,B,代表文件,然后将权限写入,根据系统提示,实现控制。
在制作项目的过程中,从构思开始,我认为碰到的最大的问题是用怎样的数据结构定义二维矩阵,才能更加简便快捷实现功能,最后我选择的是java语言中特有的pair,set,map数据结构,pair将一对值组合成一个值,这一对值可以具有不同的数据类型,以来存储我的主体和客体,插入,删除都是靠着pair的值,它在这里作为map中独一无二的键值,set是一个不重复的数据的集合,用来存储权限,权限部分增删改查都可以,而Map是键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象
这一次文件控制操作系统的编写,让我深深体会到编程语言的魅力,和各个科目都连接紧密,也必然是一个软件工程专业学生的重要基础。而且这次实习,我深切认识到平时老师教授的基础知识有多重要。只有平时的扎实功底,才能在实际操作中如鱼得水,而也只有积极地把书本知识和实际操作共同结合在一起,才可以暴露出平时学习中的问题,就像我发现我实际操作并不娴熟,知识转化为操作不太自然。操作系统课程设计是我专业课程知识综合应用的实践训练,“千里之行始于足下”,今天的课程设计,让我学会脚踏实地迈开这一步,为明天能稳健地在学习大潮中奔跑打下坚实的基础。通过这次实习,我明白了,平时应多对知识点进行巩固,复习。多多上机操作,克服操作不娴熟,知识转化为操作不自然的问题。也请老师在以后的学习中,对我进行严厉的指导和监督,我一定会按老师平时的教导去学习。去增强自己的专业技能,不断地实践,克服自身问题,做出更好的成绩。