iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎样浅谈Java访问控制机制
  • 613
分享到

怎样浅谈Java访问控制机制

2023-06-17 13:06:27 613人浏览 薄情痞子
摘要

怎样浅谈Java访问控制机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java 访问控制机制的原理是:在某些策略配置文件中预定义好某些代码对某些资源具有某些操作权限,当

怎样浅谈Java访问控制机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

Java 访问控制机制的原理是:在某些策略配置文件中预定义好某些代码对某些资源具有某些操作权限,当某些代码以某个权限访问某个资源的时候,如果对该资源预指定的权限中没有该权限,则禁止访问,否则可以访问。

上面一段话读起来比较晦涩,下面先以数据库用户和数据表为例来说明。

指定某些代码对某些资源具有某些操作权限

某些代码:用户 Admin, X

某些资源:数据库表 User

操作权限:用户 Admin(某些代码)对 User 表(某些资源) 具有 CRUD 权限

用户 X(某些代码)对 User 表(某些资源) 具有 R 权限

某些代码以某个权限访问某个资源

用户 X(某些代码)查询(某个权限) User 表(某些资源),因为预定义中用户 X 对 User 表是有查询权限的,所以检查通过

用户 X(某些代码)删除(某个权限) User 表(某些资源) 中某条数据,因为预定义中用户 X 对 User 表只有查询权限,没有删除权限的,所以检查不通过

在 Java 中,道理也是一样的,只是 Java 中某个类相当于上面的某个用户,如 ClassA 相当于用户 Admin, ClassB 相当于用户 X。 但是在 Java 中情况稍微复杂一点,比如 ClassB 可以调用 ClassA 的方法,那么这时候,权限将如何检查呢?还是以例子来说明。

指定某些代码对某些资源具有某些操作权限

某些代码:用户 ClassA, ClassB

某些资源:某个配置文件 x.properties

操作权限:ClassA(某些代码)对 x.properties(某些资源) 具有读写权限

ClassB(某些代码)对 x.properties(某些资源) 具有读权限

某些代码以某个权限访问某个资源

ClassA(某些代码)读或写(某个权限) 配置文件x.properties(某些资源),因为预定义中ClassA 对 x.properties是有读和写权限的,所以检查通过

ClassB(某些代码)读(某个权限) 配置文件x.properties(某些资源),因为预定义中ClassB对 x.properties是有读权限的,所以检查通过

ClassB(某些代码)写(某个权限) 配置文件x.properties(某些资源),因为预定义中ClassB对 x.properties是没有写权限的,所以检查不通过

Class B 调用 ClassA 的写 x.properties 文件方法,是什么检查过程呢?

在 Java 中,不管有几个类的反复调用,最终都是以某个权限操作某个资源,如这里是 Class B 调用 ClassA,其最终操作权限是以写的权限去操作 x.properties 文件。那么 Java 就会对反复调用过程中的所有类进行检查,看它们对 x.properties 文件是否有写权限,如果都有则通过,只要任何一个类没有该权限,则不通过。

其中检查的过程与调用过程是互为逆向的。如在上例中,ClassB 调用 ClassA 的去写 x.properties 文件,那么 JVM 就会先检查 ClassA 对 x.properties 文件是否有写权限,因为预定义中有,所以 ClassA 通过。接下来检查 ClassB,因为预定义中,ClassB对 x.properties 文件没有写 权限,所以检查不通过,本次操作失败。

在 Java 访问控制机制中,主要有以下几个类:

SecurityManager

AccessController

AccessControlContext

ProtectionDomain

PermissionCollection

Permission

Policy

SecurityManager/ AccessController

访问控制的入口类。在 Java 中,访问控制默认是关闭的。

AccessControlContext

类的调用过程上下文。它以栈的形式保存类的调用过程,如在上面例子中,ClassB 调用 ClassA,那么 AccessControlContext 的栈底是 ClassB,栈顶是 ClassA,如果 ClassA 再调用 ClassC,那么 ClassC 在压入栈,栈顶变成了 ClassC

ProtectionDomain

这是一个关键的类。它定义了“某些代码对某些资源具有某些操作权限”,亦即那个目录下的代码对那些资源有哪些操作权限。它有三个属性:

某些代码

一般是指某个目录下的所有代码,如 “JRE_HOEM/lib/ext”在 Java 中表示为 CodeBase

某些资源

比如 conf 目录下的文件,在 Java 中表现为某个文件(夹)路径 BasePath

某些权限

是指某些代码对对某些资源操作权限的集合,比如读权限、写权限,在 Java 中表现为 PermissionCollection 类。

PermissionCollection

权限的集合类。如文件读权限、文件写权限的集合:

FilePermission(file,SecurityConstants.FILE_WRITE_ACTION)

FilePermission(file,SecurityConstants.FILE_READ_ACTION)

Permission

某个具体的权限。如文件读权限 FilePermission(file,SecurityConstants.FILE_WRITE_ACTION)

Policy

“指定某些代码对某些资源具有某些操作权限”的策略定义在策略文件中,Policy 负责从配置文件中读取这些策略,并根据策略文件构建 ProtectionDomain。JVM 中只有一个 Policy 对象。

“某些代码对某些资源具有某些操作权限”建立过程

在 Java 中,每个类都有一个 ProtectionDomain 的一个引用,因为每个类都属于某个特定的目录下,这样就可以知道某个类对某些资源有哪些操作权限了。下面看每个类与 ProtectionDomain 建立关系的过程:

当 ClassLoader 去加载一个 class 的时候,它会把这个类及授给这个类的权限集封装到“java.security.ProtectionDomain”中,其中这些权限是通过 ClassLoader并根据策略文件进行分配的。

1) 找到类字节码的加载 URL

2) 如果这个类是从包 java.* 中加载的,那就把该类与内在的 System ProtectionDomain 关联,其中 System ProtectionDomain 是具有全部权限(AllPermission)的。如果该类不是从包 java.* 中加载的,则继续

3) 如果该类要关联的 ProtectionDomain 以及存在,则直接添加它们之间引用关系即可,否则继续

4) 创建一个 CodeSource 对象,里面封装了类字节码的加载路径

5) 创建一个 PermissionCollection 对象,并把策略文件中赋给 CodeSource 的权限封装到该 PC 对象中

6) 创建一个 ProtectionDomain,里面封装了 CodeSource 和 PermissionCollection 对象,即那些代码对那些资源有那些操作权限:ProtectionDomain = new ProtectionDomain(CodeSource,PermissionCollection)

7) 把刚加载的 class 类与当前的 ProtectionDomain 关联

各个类之间引用调用关系这里不阐述,下面继续看例子:

现在假设有如下代码:${user.dir}/testA/ClassA ${user.dir}/testB/ClassB

有如下资源:${user.dir}/conf/x.properties

加入在 Java 策略文件中添加如下策略:

grant codeBase "file:${user.dir}/testA/*" {

permission java.io.FilePermission "${user.dir}/conf *", "read";

permission java.io.FilePermission "${user.dir}/conf *", "write";

};

grant codeBase "file:${user.dir}/testB/*" {

permission java.io.FilePermission "${user.dir}/conf *", "read";

};

上面有提到,在Java 中每个 Class都保存有 ProtectionDomain的引用,这里 ClassA 和 ClassB 的 ProtectionDomain 模型如下:

怎样浅谈Java访问控制机制
怎样浅谈Java访问控制机制

下面假设 ClassB 调用 ClassA 的去写 x.poperties 文件,那么 AccessControlContext 和 PermissionCollection 对应模型是这样的:

怎样浅谈Java访问控制机制

当 AccessController.checkPermission 开始检查权限时,它知道要本次要检查的权限是 FilePermission(“x.properties”, “write”),即对 “x.properties”的写权限。于是它先获取调用过程上下文中所有类(main(JVM)-->ClassB-->ClassA-->FileOutputStream-->AccessController)的 ProtectedDomain 找出来:

JVM 从 mian 执行的,它的 ProtectedDomain 是 SystemDomain

ClassA 的 ProtectedDomain 是 ProtectedDomainA

ClassB 的 ProtectedDomain 是 ProtectedDomainB

FileInputStream 和 AccessController 的 ProtectedDomain 是 SystemDomain

把访问上下文的 ProtectedDomain 都找出来后,就逐个检查每个 ProtectedDomain 是否有 FilePermission(“x.properties”, “write”) 权限。因为在 Java 访问控制机制中,它要确保每个调用的类都有该权限才能通过检查。

于是,开始做下面检查:

1) AccessController-->SystemDomain : Java 内部代码保护域,具有所有操作权限,检查通过

2) FileInputStream-->SystemDomain : Java 内部代码保护域,具有所有操作权限,检查通过

3) ClassA-->ProtectedDomainA: 在上面的 ProtectedDomainA 模型中,我们知道它是有 FilePermission(“x.properties”, “write”) 权限的,检查通过

4) ClassB-->ProtectedDomainB: 在上面的 ProtectedDomainB 模型中,我们知道它没有 FilePermission(“x.properties”, “write”) 权限的,检查不通过

关于怎样浅谈Java访问控制机制问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: 怎样浅谈Java访问控制机制

本文链接: https://www.lsjlt.com/news/289454.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎样浅谈Java访问控制机制
    怎样浅谈Java访问控制机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java 访问控制机制的原理是:在某些策略配置文件中预定义好某些代码对某些资源具有某些操作权限,当...
    99+
    2023-06-17
  • 浅谈Java锁机制
    目录1、悲观锁和乐观锁2、悲观锁应用3、乐观锁应用4、CAS5、手写一个自旋锁1、悲观锁和乐观锁 我们可以将锁大体分为两类: 悲观锁 乐观锁 顾名思义,悲观锁总是...
    99+
    2024-04-02
  • 浅谈Java内省机制
    目录概念JavaBean内省相关API代码案例:获取属性相关信息内省属性的注意事项完整代码概念 JavaBean 在实际编程中,我们常常需要一些用来包装值对象的类,例如Student...
    99+
    2022-11-13
    Java内省机制 Java内省
  • 浅谈Java 代理机制
    目录一、常规编码方式二、代理模式概述三、静态代理3.1、什么是静态代理3.2、代码示例四、Java 字节码生成框架五、什么是动态代理六、JDK 动态代理机制6.1、使用步骤6.2、代...
    99+
    2024-04-02
  • 浅谈Java垃圾回收机制
    目录一.什么是垃圾二.怎么回收垃圾2.1 静态对象什么时候变成垃圾被回收2.2 新生代和年老代三、垃圾回收算法3.1 标记清除算法3.2 复制清除算法(专门用于处理年轻代垃圾的)3....
    99+
    2024-04-02
  • 浅谈如何使用Python控制手机(一)
    目录1. 配置Python环境变量2. 安装Python编辑器,并在其中配置Python3. 安装控制包uiautomator2,和其它辅助包4. 安装adb5. adb调用6、设备...
    99+
    2024-04-02
  • 浅谈如何使用Python控制手机(二)
    目录1. 序言2. 前置工作3. 打开APP4. 获取APP的包名5. 打开特定页面6. 其它细节7. 总结1. 序言 每年淘宝双十一的时候,总是要刷各种各样的浏览页面,收集能量或者...
    99+
    2024-04-02
  • 如何浅析C++类访问控制问题
    本篇文章给大家分享的是有关如何浅析C++类访问控制问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在介绍C++类之前,首先要了解下什么是C++类?其实C++类是将数据成员和进...
    99+
    2023-06-17
  • 浅谈numpy广播机制
    目录Broadcast最简单的广播机制稍微复杂的广播机制广播机制到底做了什么一个正确的经典示例一种更便捷的计算方式Broadcast 广播是numpy对不同形状(shape)的数组进...
    99+
    2023-02-15
    numpy 广播机制
  • 浅谈Swift派发机制
    目录直接派发函数表派发消息机制派发具体派发直接派发 C++ 默认使用的是直接派发,加上 virtual 修饰符可以改成函数表派发。直接派发是最快的,原因是调用指令会少,还可以通过编译...
    99+
    2024-04-02
  • 浅谈AndroidDialog窗口机制
    目录问题引出Dialog源码分析构造方法show()方法问题引出 //创建dialog 方式一 AlertDialog.Builder builder=new AlertDialo...
    99+
    2024-04-02
  • 如何进行Java 同步机制浅谈
    如何进行Java 同步机制浅谈,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized关键字就...
    99+
    2023-06-03
  • 浅谈spring boot 1.5.4 异常控制
    spring boot 已经做了统一的异常处理,下面看看如何自定义处理异常1.错误码页面映射1.1静态页面必须配置在 resources/static/error文件夹下,以错误码命名下面是404错误页面内容,当访问一个不存在的链接的时候,...
    99+
    2023-05-31
    spring boot 异常处理
  • 浅谈Android IPC机制之Binder的工作机制
    目录进程和线程的关系跨进程的种类Serializable,Parcelable接口Binder进程和线程的关系 按照操作系统中的描述,线程是CPU调度的最小单位,同时线程也是一种有限...
    99+
    2024-04-02
  • 浅谈Redis的异步机制
    目录前言一、Redis 的阻塞点4 类交互对象和具体的操作之间的关系:切片集群实例交互时的阻塞点二、可以异步执行的阻塞点三、异步的子线程机制总结前言 命令操作、系统配置、关键机制、硬...
    99+
    2024-04-02
  • 浅谈Redis缓冲区机制
    目录Redis缓冲区机制客户端缓冲机制应对输入缓冲区溢出查看输入缓冲区信息如何解决输入缓冲区溢出应对输出缓冲区溢出Monitor命令的执行输出缓冲区设置不合理主从集群中的缓冲区复制缓...
    99+
    2024-04-02
  • 浅谈用java实现事件驱动机制
    由于项目需求,需要为Java提供一套支持事件驱动机制的类库,可以实现类似于C#中的event和delegate机制。众所周知,Java语言本身以及其标准库中并没有提供事件驱动机制的相关接口,虽然Swing(我且认为其不属于标准库,因为一般没...
    99+
    2023-05-31
    java 事件处理机制 ava
  • 浅谈Java非阻塞同步机制和CAS
    目录什么是非阻塞同步悲观锁和乐观锁CAS什么是非阻塞同步 非阻塞同步的意思是多个线程在竞争相同的数据时候不会发生阻塞,从而能够在更加细粒度的维度上进行协调,从而极大的减少线程调度的开...
    99+
    2024-04-02
  • MaxCompute访问控制整体架构是怎样的
    这篇文章主要介绍“MaxCompute访问控制整体架构是怎样的”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MaxCompute访问控制整体架构是怎样的”文章能帮助大家解决问题。基本术语projec...
    99+
    2023-06-03
  • 浅谈Servlet的Cookie和Session机制
    目录一、Servlet Cookies1.1 Cookies构成1.2 Servlet操作Cookie方法1.3 代码示例:1.4 验证结果二、Servlet Session2.1 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作