Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
升级旧版RMI应用程序的Java安全策略类_Java_Security_Permissions_Rmi - Fatal编程技术网

升级旧版RMI应用程序的Java安全策略类

升级旧版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

我一直在对一个最初为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

我的班级现在看起来像:

//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;
};