升级旧版RMI应用程序的Java安全策略类
我一直在对一个最初为Java2或Java3开发的遗留Java应用程序(已有十多年历史)进行维护升级,现在我遇到了一个让我痛苦了一周的事情 应用程序实现自己的名为PolicyManager的策略。此类扩展了javax.security.auth.Policy。文档告诉我,java 4中的java.security.Policy已被弃用并替换为java.security.Policy,因此我努力将其替换掉。我替换了导入并更新了getPermissions方法,以接受java.security.ProtectionDomain,而不是javax.security.auth.Subject和java.security.CodeSource 我的班级现在看起来像:升级旧版RMI应用程序的Java安全策略类,java,security,permissions,rmi,Java,Security,Permissions,Rmi,我一直在对一个最初为Java2或Java3开发的遗留Java应用程序(已有十多年历史)进行维护升级,现在我遇到了一个让我痛苦了一周的事情 应用程序实现自己的名为PolicyManager的策略。此类扩展了javax.security.auth.Policy。文档告诉我,java 4中的java.security.Policy已被弃用并替换为java.security.Policy,因此我努力将其替换掉。我替换了导入并更新了getPermissions方法,以接受java.security.Pro
//import javax.security.auth.Policy;
import java.security.Policy;
public class PolicyManager extends Policy
{
@Override
public synchronized void refresh()
{
PermissionManager.getInstance().clearAll();
}
@Deprecated
public PermissionCollection getPermissions( Subject subject, CodeSource cs )
{
PermissionCollection permissions = null;
Iterator<?> iterator = subject.getPrincipals().iterator();
Principal principal = null;
while( iterator.hasNext() )
{
principal = (Principal)iterator.next();
PermissionCollection principalPerm = null;
try
{
principalPerm = PermissionManager.getInstance().
getPrincipalPermissions(principal.getClass().getName(),
principal.getName(), cs, false);
}
catch (SQLException ex)
{
continue;
}
if (permissions == null)
{
permissions = principalPerm;
}
else
{
Enumeration<?> en = principalPerm.elements();
Permission permission = null;
while( en.hasMoreElements() )
{
permission = (Permission)en.nextElement();
if ( !permissions.implies( permission ) )
{
permissions.add( permission );
}
}
}
}
return (permissions == null)?new Permissions():permissions;
}
public PermissionCollection getPermissions(ProtectionDomain pd)
{
PermissionCollection permissions = null;
List<Principal> principalList = new ArrayList<Principal>();
for (Principal test : pd.getPrincipals()) {
principalList.add(test);
}
Iterator<Principal> iterator = principalList.iterator();
Principal principal = null;
while( iterator.hasNext() )
{
principal = (Principal)iterator.next();
PermissionCollection principalPerm = null;
try
{
principalPerm = PermissionManager.getInstance().
getPrincipalPermissions(principal.getClass().getName(),
principal.getName(), pd.getCodeSource(), false);
}
catch (SQLException ex)
{
continue;
}
if (permissions == null)
{
permissions = principalPerm;
}
else
{
Enumeration<?> en = principalPerm.elements();
Permission permission = null;
while( en.hasMoreElements() )
{
permission = (Permission)en.nextElement();
if ( !permissions.implies( permission ) )
{
permissions.add( permission );
}
}
}
}
return (permissions == null)?new Permissions():permissions;
}
}
还是没什么。我甚至不确定当管理器扩展到java.security.policy之外时,应用程序是否正在尝试加载安全策略。我在VM参数中添加了-Djava.security.debug=policy,但什么也没有出现。它似乎没有加载任何内容,甚至没有加载默认的Java策略。控制台是空白的。当我扩展javax.security.auth.Policy时,我看到了您所期望的一切—策略授予、评估等
该应用程序不使用安全管理器,但我确实尝试了实现一个(通过VM参数-Djava.security.manager和System.setSecurityManager(new SecurityManager());)的代码实现),只是想看看这是否有帮助,它只会让事情变得更糟——什么都不能执行。在服务器启动时,ojdbc6.jar被拒绝测试数据库连接
只需将上述类中的导入翻转回javax.security.auth.Policy即可修复所有问题。向后翻转会导致访问被拒绝错误,并且不会从我的策略文件中授予权限。我已经通读了关于Java安全策略实现的所有内容,但我没有找到任何解释。所以您扩展了Java策略类,看起来还可以。您是如何将该更改传播到应用程序的其余部分的?我刚刚在使用Policy类的其他类中更新了导入。就这样。将import javax.security.auth.Policy更改为import java.security.Policy,以便运行时使用自定义实现,a)调用
java.security.Policy.setPolicy(java.security.Policy)
,或b)更改/lib/security/java.security
中Policy.provider
的值,或者c)通过java.security.Provider
SPI以编程方式注册它。我会去掉它并使用正确构造的.policy文件,或者可能根本没有安全管理器。
grant {
permission java.security.AllPermission;
};