访问控制实验报告08283013刘唯墨.doc

上传人:scccc 文档编号:12668301 上传时间:2021-12-05 格式:DOC 页数:18 大小:52KB
返回 下载 相关 举报
访问控制实验报告08283013刘唯墨.doc_第1页
第1页 / 共18页
访问控制实验报告08283013刘唯墨.doc_第2页
第2页 / 共18页
访问控制实验报告08283013刘唯墨.doc_第3页
第3页 / 共18页
访问控制实验报告08283013刘唯墨.doc_第4页
第4页 / 共18页
访问控制实验报告08283013刘唯墨.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《访问控制实验报告08283013刘唯墨.doc》由会员分享,可在线阅读,更多相关《访问控制实验报告08283013刘唯墨.doc(18页珍藏版)》请在三一文库上搜索。

1、访问控制实验报告刘唯墨 08283013一、实验介绍谈到访问控制,或者说“授权”,这里有两层含义,一是从资源的角度,这个socket端口是否被允许操作?二是从访问者的角度,我想通过80端口看Web上的新闻,在这个系统中有没有这个资格?我想播放D盘上的视频文件,我得到了访问这个文件的权限了吗?我有运行播放器的权限吗?所以就要提及访问权限。二、实验目的实现访问控制,并理解其内容和作用。三、实验内容: 1、选择一个软件系统,在其基础代码上实施自主访问控制。2、明确自主访问控制的对象。3、实现自主访问控制授权管理的8个基本操作。包括:授权,取消授权等,须支持级联授权撤销,授权继承,否定授权等。4、实现

2、自主访问控制实施模块。 四、实验步骤:· javax.security.auth.SubjectSubject表征系统中一个认证的用户,这个词时而被译为“主题”时而被以为“主体”对系统的访问就体现为Subject.doAs()或Subject.doAsPrivileged()方法。· java.security.PrincipalPrincipal代表用户的一种身份对象,一个用户的身份可能不只一个,他所在的组或所担任的角色也是一种身份。通过一次登录后,可能向Subject插入一个或多个Principal,这时候Subject才有实际意义,而不是一个空壳。· jav

3、ax.security.auth.login.LoginContextLoginContext旨在提供一个开放的登录总接口,你只需要用从策略文件中取得的策略名,以及下面介绍的回调对象创建得到一个LoginContext,再调用一次login()方法即可完成登录,登录模块在这里是透明的。· javax.security.auth.spi.LoginModule 登录模块实现了对用户的认证逻辑,它的作用是在登录配置文件中得到体现,在后面的例子里我们会看到怎么编写一个登录配置文件以及上面说过的策略文件。LoginModule接口包括五个主要的方法:initialize方法,初始化

4、模块,保存当前Subject以及一些参数。login方法,判断一次登录过程中是否认证通过。commit方法,是否提交登录结果  logout方法:注销过程,清除内部状态,并删除Subject中全部的Principalabort方法 · javax.security.auth.callback.CallbackHandler· java.security.PrivilegedAction上面说了那么多登录相关的接口,该说说授权了,如果我们只谈写源代码,那么很简单,只要实现一个PrivilegedAction接口,覆盖一个run()方法,把你想要做

5、的事情统统放到这个run中就可以了。五、实验代码/ MyPrincipal.java package com.jungleford.auth; import java.security.Principal; public class MyPrincipal implements Principal / 一个Principal的例子 private String name; / Principal的名字 public MyPrincipal(String name) this.name = name; public String getName() /取得Principal的名字 return

6、this.name; public boolean equals(Object principal) / 判断两个Pincipal相同的依据 if (principal instanceof MyPrincipal) return this.name.equals(MyPrincipal)principal).getName(); else return false; public String toString() / Principal的表示 return "MyPrincipal: " + this.name; public int hashCode() / 确定本对

7、象的散列值 return this.name.hashCode(); / MyLoginModule.java package com.jungleford.auth; import java.util.*; import java.io.IOException; import java.security.Principal; import javax.security.auth.*; import javax.security.auth.callback.*; import javax.security.auth.login.*; import javax.security.auth.spi

8、.*; public class MyLoginModule implements LoginModule / 一个登录模块的例子 private Subject subject; / 登录主体的表征 private CallbackHandler cbHandler; / 回调对象,提供终端下获取用户名、口令的界面 private Map sharedState; / 用于缓存中间结果的共享区 private Map options; / 用于保存某些登录模块所需要用到的一些配置选项 private boolean succeeded = false; / 一次login成功的标志 priv

9、ate boolean cmtSucceeded = false; / 整体登录成功的提交标志 private String username; / 取得用户名 private char password; / 取得口令 private Principal principal; / 取得登录后的身份标志 public void initialize(Subject subject, CallbackHandler cbHandler, Map sharedState, Map options) / 初始化过程 System.out.println("Login module init

10、ializing ."); System.out.println(); this.subject = subject; this.cbHandler = cbHandler; this.sharedState = sharedState; this.options = options; public boolean login() throws LoginException / 一次登录过程 if (cbHandler = null) / 尚未配置回调对象 throw new LoginException("Error: No CallbackHandler availab

11、le " + "to garner authentication information from the user"); Callback cbs = new Callback2; / 仅使用用户名回调和口令回调 cbs0 = new NameCallback("Login: "); cbs1 = new PasswordCallback("Password: ", false); try cbHandler.handle(cbs); username = (NameCallback)cbs0).getName(); ch

12、ar temp = (PasswordCallback)cbs1).getPassword(); if (temp = null) / 口令为空 temp = new char0; password = new chartemp.length; System.arraycopy(temp, 0, password, 0, temp.length); (PasswordCallback)cbs1).clearPassword(); / 清除内存中的口令痕迹 catch (IOException ioe) throw new LoginException(ioe.toString(); catch

13、 (UnsupportedCallbackException uce) throw new LoginException("Error: " + uce.getCallback().toString() + " not available to garner authentication information " + "from the user"); boolean usrCorrect = false; / 用户名正确否? boolean pwdCorrect = false; / 口令正确否? if (username.equ

14、als("user") / 目前仅允许用户名为user的登录 usrCorrect = true; if (usrCorrect && password.length = 9 && password0 = 'l' && password1 = 'e' && password2 = 't' && password3 = 'm' && password4 = 'e' && password

15、5 = 'p' && password6 = 'a' && password7 = 's' && password8 = 's') / user的口令指定为letmepass System.out.println("MyLoginModule: Authentication pass!"); System.out.println(); pwdCorrect = true; succeeded = true; return true; / 一次登录成功 else S

16、ystem.out.println("MyLoginModule: Authentication failed!"); System.out.println(); succeeded = false; username = null; for (int i = 0; i < password.length; i+) / 清除内存中的口令痕迹 passwordi = ' ' password = null; if (!usrCorrect) throw new FailedLoginException("Username incorrect!&

17、quot;); else throw new FailedLoginException("Password incorrect!"); public boolean commit() throws LoginException / 根据登录配置策略判断是否整体登录成功 if (succeeded = false) return false; else principal = new MyPrincipal(username); if (!subject.getPrincipals().contains(principal) subject.getPrincipals().a

18、dd(principal); / 把新的身份添加到subject中 System.out.println("MyLoginModule: Add a new principal to current subject."); System.out.println(); username = null; for (int i = 0; i < password.length; i+) / 清除内存中的口令痕迹 passwordi = ' ' password = null; cmtSucceeded = true; return true; public

19、boolean abort() throws LoginException / 放弃登录,将状态复位至登录前 if (succeeded = false) return false; else if (succeeded = true && cmtSucceeded = false) succeeded = false; username = null; if (password != null) for (int i = 0; i < password.length; i+) / 清除内存中的口令痕迹 passwordi = ' ' password =

20、 null; principal = null; else logout(); return true; public boolean logout() throws LoginException / 注销,并将状态复位至登录前 subject.getPrincipals().remove(principal); succeeded = false; succeeded = cmtSucceeded; username = null; if (password != null) for (int i = 0; i < password.length; i+) / 清除内存中的口令痕迹 p

21、asswordi = ' ' password = null; principal = null; return true; / MyCallbackHandler.java package com.jungleford.auth; import java.io.IOException; import javax.security.auth.callback.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MyCallbackHandler implements

22、CallbackHandler public void handle(Callback cbs) throws IOException, UnsupportedCallbackException String username = JOptionPane.showInputDialog(null, "<html>Available name: " + "<font color="blue">user</font></html>", "Enter your name",

23、 JOptionPane.QUESTION_MESSAGE); String password = JOptionPane.showInputDialog(null, "<html>Available password: " + "<font color="blue">letmepass</font></html>", "Enter your password", JOptionPane.QUESTION_MESSAGE); for (int i = 0; i <

24、; cbs.length; i+) if (cbsi instanceof TextOutputCallback) TextOutputCallback toc = (TextOutputCallback)cbsi; switch (toc.getMessageType() case TextOutputCallback.INFORMATION: System.out.println(toc.getMessage(); break; case TextOutputCallback.ERROR: System.out.println("Error: " + toc.getMe

25、ssage(); break; case TextOutputCallback.WARNING: System.out.println("Warning: " + toc.getMessage(); break; default: throw new IOException("Unsupported message type: " + toc.getMessageType(); else if (cbsi instanceof NameCallback) / prompt the user for a username NameCallback nc =

26、 (NameCallback)cbsi; /System.err.print(nc.getPrompt(); /System.err.flush(); nc.setName(username); else if (cbsi instanceof PasswordCallback) / prompt the user for sensitive information PasswordCallback pc = (PasswordCallback)cbsi; /System.err.print(pc.getPrompt(); /System.err.flush(); pc.setPassword

27、(password.toCharArray(); else throw new UnsupportedCallbackException(cbsi, "Unrecognized Callback"); /MyAction.java package com.jungleford.auth; import java.io.*; import java.security.*; public class MyAction implements PrivilegedAction / 对资源的授权访问动作 public Object run() / run方法是必须overriding

28、的 / 这里我们假设访问动作是读取当前目录下my文件的内容 = new File("my"); String content = "" try BufferedReader reader = new BufferedReader( new (file); String line = reader.readLine(); while (line != null) content += line + "n" line = reader.readLine(); catch (Exception e) System.err.println(&

29、quot;Error: Reading !"); System.err.println(); e.printStackTrace(); return content; /JAASTest.java package com.jungleford.auth; import javax.security.auth.Subject; import javax.security.auth.login.LoginContext; public class JAASTest / 测试我们JAAS登录和授权的shell public static void main(String args) Log

30、inContext lc = null; try / 创建context,使用自定义的回调对象,策略名为JAASTest / 简单起见,仅使用一个MyLoginModule模块 lc = new LoginContext("JAASTest", new MyCallbackHandler(); catch (Exception e) System.err.println("Error: Creating login context failed!"); System.err.println(); e.printStackTrace(); System.e

31、xit(-1); try / 整体登录 lc.login(); catch (Exception e) System.err.println("Error: Login failed!"); System.err.println(); e.printStackTrace(); System.exit(-1); / 获得授权访问 Object object = Subject.doAs(lc.getSubject(), new MyAction(); System.out.println("Access successfully! Reading file:&quo

32、t;); System.out.println("="); System.out.println(object); System.out.println("="); System.exit(0); /login.conf JAASTest com.jungleford.auth.MyLoginModule required; ; /jaas.policy grant permission javax.security.auth.AuthPermission "createLoginContext" permission javax.s

33、ecurity.auth.AuthPermission "doAs" permission javax.security.auth.AuthPermission "modifyPrincipals" permission javax.security.auth.AuthPermission "getSubject" ; grant principal com.jungleford.auth.MyPrincipal "guest" permission java.io. "my","read" ;六、实验分析由于java对环境配置非常复杂,在安装过openssl密码库,改变环境变量之后,这个代码编译无错但是始终运行不出来,并且始终找不到原因。由于时间有限,没来的及把所有的内容实现。不过已经实现了简单的访问控制。由于实验的难度,代码部分借鉴了网络上的一些内容,并结合了在之前操作系统课和java智能卡课中的内容,但是在搜索资料的过程当中,让我了解了更多。七、实验心得通过本次试验,对访问控制有了一定了解。但是由于对java语言的不熟悉和气复杂性,本次实验始终运行不出来。但是在编译代码的过程中,对访问控制的个方面问题都有了一定的认识。18 / 18文档可自由编辑打印

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1