访问控制实验报告-08283013-刘唯墨.doc_第1页
访问控制实验报告-08283013-刘唯墨.doc_第2页
访问控制实验报告-08283013-刘唯墨.doc_第3页
访问控制实验报告-08283013-刘唯墨.doc_第4页
访问控制实验报告-08283013-刘唯墨.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

访问控制实验报告刘唯墨 08283013一、实验介绍谈到访问控制,或者说“授权”,这里有两层含义,一是从资源的角度,这个socket端口是否被允许操作?二是从访问者的角度,我想通过80端口看Web上的新闻,在这个系统中有没有这个资格?我想播放D盘上的视频文件,我得到了访问这个文件的权限了吗?我有运行播放器的权限吗?所以就要提及访问权限。二、实验目的实现访问控制,并理解其内容和作用。三、实验内容: 1、选择一个软件系统,在其基础代码上实施自主访问控制。2、明确自主访问控制的对象。3、实现自主访问控制授权管理的8个基本操作。包括:授权,取消授权等,须支持级联授权撤销,授权继承,否定授权等。4、实现自主访问控制实施模块。 四、实验步骤: javax.security.auth.SubjectSubject表征系统中一个认证的用户,这个词时而被译为“主题”时而被以为“主体”对系统的访问就体现为Subject.doAs()或Subject.doAsPrivileged()方法。 java.security.PrincipalPrincipal代表用户的一种身份对象,一个用户的身份可能不只一个,他所在的组或所担任的角色也是一种身份。通过一次登录后,可能向Subject插入一个或多个Principal,这时候Subject才有实际意义,而不是一个空壳。 javax.security.auth.login.LoginContextLoginContext旨在提供一个开放的登录总接口,你只需要用从策略文件中取得的策略名,以及下面介绍的回调对象创建得到一个LoginContext,再调用一次login()方法即可完成登录,登录模块在这里是透明的。 javax.security.auth.spi.LoginModule登录模块实现了对用户的认证逻辑,它的作用是在登录配置文件中得到体现,在后面的例子里我们会看到怎么编写一个登录配置文件以及上面说过的策略文件。LoginModule接口包括五个主要的方法:initialize方法,初始化模块,保存当前Subject以及一些参数。login方法,判断一次登录过程中是否认证通过。commit方法,是否提交登录结果logout方法:注销过程,清除内部状态,并删除Subject中全部的Principalabort方法 javax.security.auth.callback.CallbackHandler java.security.PrivilegedAction上面说了那么多登录相关的接口,该说说授权了,如果我们只谈写源代码,那么很简单,只要实现一个PrivilegedAction接口,覆盖一个run()方法,把你想要做的事情统统放到这个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) = name; public String getName() /取得Principal的名字 return ; public boolean equals(Object principal) / 判断两个Pincipal相同的依据 if (principal instanceof MyPrincipal) return .equals(MyPrincipal)principal).getName(); else return false; public String toString() / Principal的表示 return MyPrincipal: + ; public int hashCode() / 确定本对象的散列值 return .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.*; public class MyLoginModule implements LoginModule / 一个登录模块的例子 private Subject subject; / 登录主体的表征 private CallbackHandler cbHandler; / 回调对象,提供终端下获取用户名、口令的界面 private Map sharedState; / 用于缓存中间结果的共享区 private Map options; / 用于保存某些登录模块所需要用到的一些配置选项 private boolean succeeded = false; / 一次login成功的标志 private 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 initializing .); 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 available + 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(); char 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 (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.equals(user) / 目前仅允许用户名为user的登录 usrCorrect = true; if (usrCorrect & password.length = 9 & password0 = l & password1 = e & password2 = t & password3 = m & password4 = e & password5 = 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 System.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!); 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().add(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 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 = 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+) / 清除内存中的口令痕迹 passwordi = ; 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 CallbackHandler public void handle(Callback cbs) throws IOException, UnsupportedCallbackException String username = JOptionPane.showInputDialog(null, Available name: + user, Enter your name, JOptionPane.QUESTION_MESSAGE); String password = JOptionPane.showInputDialog(null, Available password: + letmepass, Enter your password, JOptionPane.QUESTION_MESSAGE); for (int i = 0; i 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.getMessage(); 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 = (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(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的 / 这里我们假设访问动作是读取当前目录下myfile.txt文件的内容 File file = new File(myfile.txt); String content = ; try BufferedReader reader = new BufferedReader( new FileReader(file); String line = reader.readLine(); while (line != null) content += line + n; line = reader.readLine(); catch (Exception e) System.err.println(Error: Reading file failed!); 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) LoginContext 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.exit(-1); try / 整体登录 lc.login(); catch (Exception e) System.err.println(Error: Login failed!); System.err.println(); e.printStackTrace(); System.exi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论