示例中需要在eclipse中创建2个project:ServiceCentre和TestService
java.policy
grant codeBase " file:/D:/Workspaces/ExchangeConnect_V2_Trunk_Maven_workspace/ServiceCentre/bin/* " {
permission java.io.FilePermission " c:/TestService-1.0.jar " , " read " ;
permission java.lang.RuntimePermission " createClassLoader " ;
} ;
grant codeBase " file:/c:/TestService-1.0.jar " {
permission java.io.FilePermission " C:/text.txt " , " read " ;
} ;
Project - ServiceCentre
package test;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
/** */ /**
* @author Donf Yang
*/
public class ServiceCentreMain {
public void loadService() {
URL[] urls;
try {
urls = new URL[] { new URL( " file:c:/TestService-1.0.jar " ) } ;
URLClassLoader ll = new URLClassLoader(urls);
final Class a = ll.loadClass( " test.TestService " );
Object o = a.newInstance();
Method m = a.getMethod( " doService " , null );
m.invoke(o, null );
} catch (Exception e) {
e.printStackTrace();
}
}
/** */ /**
* @param args
*/
public static void main(String[] args) {
ServiceCentreMain s = new ServiceCentreMain();
s.loadService();
}
}
Project - TestService
将TestService打包,放到C盘
package test;
import java.io.FilePermission;
import java.security.AccessController;
import java.security.Permission;
/** */ /**
* @author Donf Yang
*
*/
public class TestService {
public void doService() {
doFileOperation();
}
private void doFileOperation() {
Permission perm = new FilePermission( " C:/text.txt " , " read " );
AccessController.checkPermission(perm);
System.out.println( " TestService has permission " );
}
}
运行这个例子的时候,会出现权限错误,把doService()修改一下,就可以顺利通过
public void doService() {
// doFileOperation();
AccessController.doPrivileged( new PrivilegedAction() {
public Object run() {
doFileOperation();
return null ;
}
} );
}
在这个例子中AccessControlContext的stack顺序为
2. file:/D:/Workspaces/ExchangeConnect_V2_Trunk_Maven_workspace/ServiceCentre/bin/*
1 . file:/c:/TestService-1.0.jar
2没有权限,1有权限,使用doPrivileged后,不检查2
看一下java.security.AccessController的JavaDoc:
A caller can be marked as being " privileged " (see doPrivileged and below). When making access control decisions, the checkPermission method stops checking if it reaches a caller that was marked as " privileged " via a doPrivileged call without a context argument (see below for information about a context argument). If that caller ' s domain has the specified permission, no further checking is done and checkPermission returns quietly, indicating that the requested access is allowed. If that domain does not have the specified permission, an exception is thrown, as usual.
其中提到的no further checking is done的意思是指stack中的checking
加入一个TestService2,文件操作在1,stack为(1,2,3为checking顺序)
3 . file:/D:/Workspaces/ExchangeConnect_V2_Trunk_Maven_workspace/ServiceCentre/bin/*
2 . file:/c:/TestService-1.0.jar
1. file:/c:/TestService2-1.0.jar
checking顺序为 1->2->3
如果doPrivileged是在2中调用,那么1,2需要具有权限,3不再进行检查
如果doPrivileged是在1中调用,那么1需要具有权限,2,3不再进行检查
总结:
1. 这里容易理解错误的地方是checking顺序,例如一个调用链 MethodA->MethodB->MethodC(这里的3个方法需要在3个不同的ProtectionDomain 中),doPrivileged在MethodB中,很容易理解成检查A,B而不检查C,实际上stack中检查顺序为C->B->A,也就是检查C,B而不检查A
2. ServiceCentre不需要太多权限,而Service就需要使用doPrivileged来避免受到ServiceCentre的权限限制(如果service有足够的权限),Equinox中有很多这样的例子(Equinox扮演Service的角色)。
分享到:
相关推荐
AccessController类提供的静态方法可以方便地对这些对象的访问权限进行检查和修改,确保了只有具备相应权限的进程才能执行特定操作。 例如,开发者可以使用AccessController的CheckPermission方法来验证当前线程...
8. **权限动态授予**:在运行时,可以使用AccessController类的doPrivileged方法来临时提升代码的权限,但这种方式需要谨慎使用,因为可能导致安全性漏洞。 9. **Java Security API**:Java提供了一整套的Security ...
在 BufferedWriter 中,lineSeparator 变量用于存储行分隔符,它的值是通过 java.security.AccessController.doPrivileged 方法获取的。 BufferedWriter 的使用场景包括日志记录、文件写入、网络传输等场景。在这些...
例如,代码片段中展示了如何使用`AccessController.doPrivileged`方法来获取磁盘列表: ```java public String getDiskList() { return (String) AccessController.doPrivileged( new PrivilegedAction() { ...
at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc....
4. java.security.AccessController:在需要进行安全性检查的地方,会调用AccessController的doPrivileged方法,这会暂时放松当前代码的信任级别。 三、实现机制 1. 沙箱模型:Java的沙箱模型限制了未经签名的代码...
6. **代码实现**:在实际代码中,使用`AccessController.doPrivileged()`方法来执行需要特定权限的代码块。这样,即使在没有权限的环境中,也可以在受保护的上下文中执行这些操作。 在文档"权限实现实例.doc"中,...
在Java中,可以通过`java.security.PrivilegedAction`和`java.security.AccessController.doPrivileged()`方法实现。 10. **Java标准权限(Standard Permissions)**:Java提供了一些预定义的权限,如`All...
新的变体AccessController.doPrivileged使代码能够断言其特权的子集,而不会阻止堆栈的完整遍历来检查其他权限 更强大的基于密码加密的算法 JSSE服务器中的SSL / TLS服务器名称指示(SNI)扩展支持 支持AEAD算法...
3. **编写受保护代码**:使用`AccessController.doPrivileged()`方法来包裹可能需要特殊权限的代码块。 4. **权限检查**:在需要的地方插入`checkPermission()`调用来检查当前线程是否具有执行特定操作的权限。 5. *...
该实现重写受保护的方法my.seoj.activiti.sandbox.script.Main.PrivilegedScriptingEngines.evaluate(String,String,Bindings) 重写的方法应该将super.evaluate()包装在AccessController.doPrivileged()中。...
- 使用AccessController.doPrivileged进行安全敏感操作。 - 对外部输入进行验证,防止安全漏洞。 - 创建文件时设置合适的访问权限,确保数据安全。 - 记录日志时不应直接抛异常,而应处理异常并记录相关信息。 ...
AccessController是Java安全架构中的关键组件,它控制代码是否可以访问系统资源。当调用`checkPermission`方法时,它会检查当前执行代码的上下文,以确定访问请求是否被允许。如果调用代码具有所需的权限,访问请求...
- 使用AccessController.doPrivileged()进行安全敏感操作,此处关键字可能是`final`,用于确保变量不可修改。 9. **安全编程**: - 对外部输入的数据必须进行验证,防止注入攻击。 - 不允许不受信任的代码直接...
代码中使用了`AccessController.doPrivileged`,这涉及到Java的安全模型,用于在特权上下文中执行代码,此处填入`final`关键字可能是为了确保`copy`变量不会被改变。 9. **安全编程**:外部输入应进行验证,防止...
`AccessController.doPrivileged()`方法用于在特权上下文中执行代码块,允许在此范围内执行需要特定权限的操作,而无需显式检查权限。 在Spring框架中,权限验证通常与Spring Security集成。Spring Security提供了...
at java.security.AccessController.doPrivileged(NativeMethod) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at sun.misc.Launcher$ExtClassLoader.findClass(Launcher.java:229) at java....
在Java的安全实现中,`java.security`包包含了一系列与安全相关的类和接口,如`AccessController`。`AccessController`是访问控制框架的核心,它在调用栈中检查权限,如果调用链中的任何部分缺乏所需权限,就会抛出`...