每个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!");
}
}
分享到:
相关推荐
`SecurityManager`的使用主要涉及以下几个方面: 1. **安装与启用**: 在Java程序启动时,可以通过调用`System.setSecurityManager(SecurityManager)`方法安装安全管理器。如果没有安装安全管理器,JVM将默认对...
在实际应用中,通常会通过配置文件或代码设置 `SecurityManager`,并根据需求选择合适的子类实现,如单服务器应用可能选择内存中的 `SessionManager`,而在分布式环境中可能需要使用 `ClusteredSessionManager`。...
在授权方面,Shiro 使用权限(Permission)、角色(Role)和用户(User)作为基础元素。权限表达式通常由冒号分隔,表示不同的操作范围。例如,`User:view` 表示用户查看权限,`User:view,edit` 表示用户有查看和...
在本教程中,我们将深入探讨如何使用Spring Boot和Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发能力而闻名,而Shiro则是一个强大的安全管理框架,提供了认证、授权、会话管理和安全加密等...
例如,我们可以使用`@RequiresAuthentication`、`@RequiresRoles`和`@RequiresPermissions`注解来限制控制器方法的访问。 总的来说,这个"shiro基础权限管理Demo"将展示如何使用Shiro框架构建一个简单的权限管理...
JFinal2.0在前一版本的基础上进行了优化和升级,提升了性能和易用性。它采用了Action+Service+Model三层架构,提供了拦截器、插件、模板引擎等特性,支持MVC模式,使得开发者可以快速构建Web应用。其核心特点包括: ...
当`SecurityManager`存在时,每次进行敏感操作(如打开网络连接、读写文件或执行系统命令)前,Java虚拟机(JVM)都会调用`checkPermission`方法来验证是否有执行该操作的权限。如果权限不足,`SecurityManager`将抛...
【标题】"SecurityManager:Web 应用程序配置不同应用程序的 RBAC-开源" 指的是一款基于Web的安全管理工具,它实现了角色基础访问控制(Role-Based Access Control,简称RBAC)的概念,用于管理多个应用程序的安全...
包装,公开了可与任何Flask-AppBuilder应用一起使用的SecurityManager 。 它将允许您的用户使用OpenIDConnect提供程序(例如Auth0,Okta或Google Apps)登录。 这大致受此答案中的代码的启发。 (麻省理工学院...
创建安全管理器利用安全管理器public static void main(String args[]){方法调用此方法时,返回所有新创建的线程实例化后所在的线
在本文中,我们将深入探讨Apache Shiro的基础配置和代码实现,以帮助你理解如何有效地使用Shiro进行权限控制。 **1. Shiro架构组件** Shiro的核心组件包括:Subject、Realms、Caches、Session Manager、...
2. **配置Shiro**:在项目的初始化阶段,需要配置Shiro的`SecurityManager`,这是Shiro的核心组件,负责管理安全相关的操作。同时,还需要配置认证和授权的相关策略,如 Realm(域)的设置, Realm是Shiro与应用数据...
### Shiro作为应用的权限基础:深入解析与实践 #### 整体架构概览 Shiro,作为Java世界中新兴的权限管理框架,以其简洁、灵活且强大的特性,在权限管理和安全控制领域脱颖而出。相较于传统的JAAS(Java ...
这是使用Scala编写的Java SecurityManager对沙盒代码的实现。 它从Jens Nordahl的汲取了灵感,尽管花了点时间才能看清参数是什么。 它由一个Main类组成,该类启动一个沙箱,然后从该沙箱中启动一个脚本。 跑步 ...
通过"shiro的helloworld",我们可以了解到Shiro的基本使用方法,这只是一个起点,随着对Shiro的深入学习,可以实现更复杂的安全需求,如记住我功能、CSRF防护、安全管理等。在实际项目中,Shiro可以灵活地与其他技术...
不过,可以使用String.Intern()方法优化字符串池的使用。 8. **浮点常量**:C#中,浮点常量默认为double类型,若要指定为float,需加上‘f’或‘F’后缀。 总的来说,C#和Java都是强大的开发语言,各有其特色。...
Shiro使用工厂模式来获得SecurityManager的实例,并提供了一个Factory接口,通过泛型定义了getInstance()方法。这允许Shiro通过不同工厂来创建不同的SecurityManager实例,如IniSecurityManagerFactory工厂。这允许...
Apache Shiro是一个强大的Java安全框架,它为应用程序提供了身份验证、授权和会话管理功能。...通过理解和掌握Shiro的基本概念和用法,开发者可以构建起坚实的安全基础,保护应用免受未经授权的访问和操作。
4. 请求权限:使用`java.security.AccessController.checkPermission()`方法检查代码是否具有执行特定操作的权限。 此外,`javaalmanac.chm`文件可能是一个包含Java编程相关知识的CHM(Compiled Help Manual)文件...
4. **执行认证**:调用SecurityManager的`login()`方法,传入之前创建的令牌对象,Shiro会根据配置的Realm进行验证。 5. **结果处理**:如果认证成功,用户被视为已登录,可以访问授权的资源;如果失败,则返回错误...