`
cunzhangok
  • 浏览: 66214 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

java SecurityManager 的说明

 
阅读更多
每个Java应用都可以有自己的安全管理器,它是防范恶意攻击的主要安全卫士。安全管理器通过执行运行阶段检查和访问授权,以实施应用所需的安全策略,从而保护资源免受恶意操作的攻击。实际上,安全管理器根据Java安全策略文件决定将哪组权限授予类。然而,当不可信的类和第三方应用使用JVM时,Java安全管理器将使用与JVM相关的安全策略来识别恶意操作。在很多情况下,威胁模型不包含运行于JVM中的恶意代码,此时Java安全管理器便不是必需的。当安全管理器检测到违反安全策略的操作时,JVM将引发AccessControlException或SecurityException。
    在Java应用中,安全管理器是由System类中的方法setSecurityManager设置的。要获得当前的安全管理器,可以使用方法getSecurityManager。
   java.lang.SecurityManager类包含了很多checkXXXX方法,如用于判断对文件访问权限的checkRead(String file)方法。这些检查方法调用SecurityManager.checkPermission方法,后者根据安全策略文件判断调用应用是否有执行所请求的操作权限。如果没有,将引发SecurityException。
    如果想让应用使用安全管理器和安全策略,可在启动JVM时设定-Djava.security.manager选项,还可以同时指定安全策略文件。如果在应用中启用了Java安全管理器,却没有指定安全策略文件,那么Java安全管理器将使用默认的安全策略,它们是由位于目录$JAVA_HOME/jre/lib/security中的java.policy定义的。
概念
策略(Policy)
    类装载器用Policy对象帮助它们决定,把一段代码导入虚拟机时应该给它们什么样的权限. 任何时候,每一个应用程序都只有一个Policy对象.
策略文件
    Sun的java1.2平台具体的Policy子类采用在一ASCII策略文件中用上下文无关文法描述安全策略.
    一个策略文件包括了一系列grant子句,每一个grant子句将一些权限授给一个代码来源。
保护域(ProtectionDomain)
    当类装载器将类型装入java虚拟机时,它们将为每一个类型指派一个保护域,保护域定义了授予
   一段特定的代码的所有权限.装载入java虚拟机的每一个类型都属于一个且仅属于一个保护域.
访问控制器(AccessController)
     implies()
          判断一个Permissioin对象的权限,是否隐含(imply)在另一个Permissioin对象的权限中。
    checkPermission()
         AccessController的核心方法,这个方法决定一个特定的操作能否被允许.
         它自顶向下检查栈,只要它遇到一个没有权限桢,它将抛出一个AccessControlException导常。
    doPrivileged()
         有的时候,调用栈较上层(更靠近栈顶)的代码可能希望执行一段代码,而这段代码在调用栈的较
         下层是不允许执行的。
          为了使可信的代码执行较不可靠的代码操作(这段不可靠的代码位于调用栈的较下层且没有执行
          这个操作的权限),AccessController类重载了四个名为doPrivileged()的静态方法.
          AccessController会忽略调用doPrivileged()方法的调用者的调用者的权限.
    Permission:
          权限是用抽象类java.security.Permission的一个子类的实例表示的.
    CodeSource:
         代码来源,包含代码库URL和签名者.
    Permissions:
        PermissionCollection(权限集合)的子类
       
装载时生成保护域的步骤:
1           根据指定的Policy文件生成一个Policy对象
2           生成CodeSource
3           用CodeSource在Policy中找到CodeSource对应的Permissions
4           用CodeSource和Permissons构造一个ProtectionDomain
5           把ProtectionDomain同这个类在方法区中的类数据联系起来(ClassLoader.defineClass()).


运行权限检查:
如当前应用程序执行new FileInputStream(“a.txt”),java会检查当前代码有没有读”a.txt”的权限.
步骤:
1           调用SecurityManager.checkRead()方法
2           调用AccessControl.checkPermission()方法,执行栈检查
实现安全管理器步骤:
(1) 创建一个SecurityManager的子类;
(2) 覆盖一些方法。
import java.io.*;

public class TestSecurity
{
   public static void main(String args[])
   {
        try {
               System.setSecurityManager(new PasswordSecurityManager("123456"));
            } catch (SecurityException se) {
                System.out.println("SecurityManager already set!");
            }
        try {
            //DataInputStream fis = new DataInputStream(new FileInputStream("input.txt"));
            BufferedReader fis = new BufferedReader(new FileReader("input.txt"));
            //DataOutputStream fos = new DataOutputStream( new FileOutputStream("output.txt"));
            BufferedWriter fos = new BufferedWriter(new FileWriter("output.txt"));
            String inputString;
            while ((inputString = fis.readLine()) != null) {
        //fos.writeBytes(inputString);
        //fos.writeByte('\n');
        fos.write(inputString);
        fos.write('\n');
            }
            fis.close();
            fos.close();
        } catch (IOException ioe) {
            System.out.println("I/O failed for SecurityManagerTest.");
        }catch(Exception e)
        {
           System.out.println(e.toString());
        }
     
   }
}


import java.io.*;
class PasswordSecurityManager extends SecurityManager {
private String password;
PasswordSecurityManager(String password) {
    super();
    this.password = password;
}
private boolean accessOK() {
    int c;
    //DataInputStream dis = new DataInputStream(System.in);
    BufferedReader dis = new BufferedReader(new InputStreamReader(System.in));
    String response;
    System.out.println("What's the secret password?");
    try {
        response = dis.readLine();
        if (response.equals(password))
            return true;
        else
            return false;
    } catch (IOException e) {
        return false;
    }
}
public void checkRead(FileDescriptor filedescriptor) {
    if (!accessOK())
        throw new SecurityException("Not a Chance!");
}
public void checkRead(String filename) {
    if (!accessOK())
        throw new SecurityException("No Way!");
}
public void checkRead(String filename, Object executionContext) {
    if (!accessOK())
        throw new SecurityException("Forget It!");
}
public void checkWrite(FileDescriptor filedescriptor) {
    if (!accessOK())
        throw new SecurityException("Not!");
}
public void checkWrite(String filename) {
    if (!accessOK())
        throw new SecurityException("Not Even!");
}
}
分享到:
评论

相关推荐

    Java1.6 API 中文说明文档

    14. **Java安全模型**:包括`SecurityManager`,用于控制代码的权限,保护系统免受恶意代码攻击。 15. **内存管理**:Java的垃圾回收机制,自动释放不再使用的对象,避免内存泄露。 Java 1.6 API中文说明文档覆盖...

    java_lang包详解.pdf

    java.lang包还包含了一些与安全、线程和内存管理相关的类,如SecurityManager用于安全管理,Thread和ThreadGroup是线程相关的类,ClassLoader负责加载类,ThreadLocal为每个线程提供独立的变量副本,而Runtime类提供...

    Java-API-1.6.rar_java 1.6api_java api 1.6 115_java doc_java-a_ja

    Java API 1.6是Java开发中的重要参考资料,它包含了Java SE 1.6版本的所有公共类、接口、方法和异常等的详细说明。这个压缩包文件“Java-API-1.6.rar”提供了Java 1.6 API的中文手册,对于理解和使用Java 1.6进行...

    java 1.6 API 中文版

    Java 1.6 API 中文版是针对Java SE(标准版)6.0平台的一份完整的官方文档,它为开发者提供了详细的类库、接口和方法的说明,是学习和开发Java应用程序的重要参考资料。这份API文档涵盖了Java语言的核心库,包括基础...

    java中文帮助文档14-26分卷共26

    例如,part14、part15到part26这些文件可能包含了从A到Z的所有Java类和接口的详细说明,包括它们的构造函数、方法、常量,以及示例代码。 文档中的内容会涵盖以下关键部分: 1. **基础类**:包括Object类、String...

    Java中文JDK_API帮助文档1-13共26分卷

    《Java中文JDK_API帮助文档1-13共26分卷》是针对Java开发者极其重要的参考资料,它包含了从基础到高级的Java开发所需的所有API(应用程序编程接口)的详细说明,以中文语言呈现,方便中国开发者理解和使用。...

    JAVA JDK_API 1.6 官方中文版 CHM格式

    《JAVA JDK_API 1.6 官方中文版 CHM格式》是一份针对Java开发者极其重要的参考资料,它提供了全面且详细的JDK 1.6版本的API(Application Programming Interface)说明。API是软件开发中的核心部分,它定义了可供...

    基于SpringBoot与Shiro整合实现的一个简单权限管理系统源码+项目说明.zip

    主要针对计算机相关专业的正在做毕设的学生和需要项目实战的Java学习者。 也可作为课程设计、期末大作业。包含:项目源码、数据库脚本、项目说明等,该项目可以直接作为毕设使用。 也可以用来学习参考借鉴!

    java内存分析.pdf

    接下来,将对这些知识点进行详细说明: 1. Java虚拟机(JVM):JVM是Java程序运行的环境,它负责将Java代码转换为机器能理解的指令并执行。JVM的设计允许Java程序“一次编写,到处运行”,这使得Java具有很好的跨...

    整合SSM框架以及Shiro实现了简单的权限控制 ##文件目录 src/main/java/config/**:相关配置文件目录

    在现代的Java Web应用开发中,使用SSM(Spring + Spring MVC + MyBatis)框架组合是一种非常流行的做法。...在权限控制方面,可以配置Shiro的安全管理器(SecurityManager)和授权信息(如角色和权限)。

    JDK API 1.6.0 中文版.7z

    JDK API 1.6.0 中文版是针对Java 6平台的开发者文档,包含了详细的类库说明和方法解释,方便中国开发者理解和使用。 在Java 6版本中,JDK API包括了许多核心类库,如`java.lang`、`java.util`、`java.io`等。这些...

    java-sandbox:填充代码和测试

    - **安全管理器(SecurityManager)**:Java提供内置的安全管理器机制,可以通过设置`System.setSecurityManager()`来启用。安全管理器会检查所有敏感操作,如文件读写、网络访问等,并根据预定义的策略决定是否...

    Apache_Shiro中文开发说明文档.docx

    Apache Shiro 是一款轻量级的安全框架,专为Java开发者设计,用于实现应用程序的身份认证、授权和会话管理。这个中文开发文档详细介绍了如何在项目中集成和使用Shiro,帮助开发者构建安全的系统。 **1. 什么是Shiro...

    JDK_API_1_6_zh_CN.zip

    此外,文档还包含了异常的解释、枚举类型说明以及注解(Annotation)的使用等,帮助开发者深入理解Java语法和最佳实践。 总结,JDK 1.6 API中文文档是Java开发者的重要工具,无论你是初学者还是经验丰富的开发人员...

    shiro在springmvc里面的集成使用

    以下是对 Shiro 在 Spring MVC 中集成使用的详细说明。 首先,Shiro 的核心组件包括 Realm(领域)、SecurityManager(安全管理器)、Subject(当前用户对象)等。在 Spring MVC 中集成 Shiro,我们需要配置 ...

    JDK1.6 API帮助文档.CHM

    《JDK1.6 API帮助文档.CHM》是Java开发者的重要参考资料,它包含了Java Development Kit (JDK) 1.6版本的所有公共类、接口、枚举和异常的详细说明。这个CHM(Microsoft Compiled HTML Help)文件是Windows平台上的...

    JDK1.6 API

    11. **安全管理**:JDK 1.6引入了更完善的权限控制和安全模型,通过SecurityManager进行代码的安全检查。 12. **并发工具**:Concurrent包提供了如Semaphore、CyclicBarrier、CountDownLatch等高级并发工具,帮助...

    JDK_API1.6中文版

    《JDK_API1.6中文版》是一个针对Java开发者极其重要的参考资料,它包含了Java编程语言中所有的接口、类以及抽象类的详细说明。这个压缩包中的核心文件是`JDK_API_1_6_zh_CN.CHM`,这是一部中文版的Java API文档,...

    JDK_API_1_6_zh_CN.CHM

    Java的安全模型由AccessController、Permission、SecurityManager等类构成,它们为防止恶意代码和保护系统资源提供了保障。 9. **图形用户界面** Swing和AWT库提供了丰富的组件和布局管理器,用于构建跨平台的...

    单点登录sso-shiro-cas-maven

    <property name="securityManager" ref="securityManager" /> <!-- 设定用户的登录链接,这里为cas登录页面的链接地址可配置回调地址 --> ${shiro.loginUrl}" /> <!-- 添加casFilter到shiroFilter ...

Global site tag (gtag.js) - Google Analytics