如何将安全策略文件添加到 rmi 应用程序的 gradle 构建?

Posted

技术标签:

【中文标题】如何将安全策略文件添加到 rmi 应用程序的 gradle 构建?【英文标题】:How can I add a security policy file to a gradle build for an rmi application? 【发布时间】:2018-08-23 23:41:09 【问题描述】:

谁能告诉我如何将 java 命令 "-Djava.security.policy=mysecurity.policy" 添加到 gradle 构建以用于 java rmi 应用程序。谢谢。

这是我运行 gradle run 时遇到的错误

gradle 运行

任务:运行 线程“主”java.security.AccessControlException 中的异常:访问被拒绝(“java.net.SocketPermission”“127.0.0.1:1099”“connect,resolve”) 在 java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) 在 java.security.AccessController.checkPermission(AccessController.java:884) 在 java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 在 java.lang.SecurityManager.checkConnect(SecurityManager.java:1051) 在 java.net.Socket.connect(Socket.java:584) 在 java.net.Socket.connect(Socket.java:538) 在 java.net.Socket.(Socket.java:434) 在 java.net.Socket.(Socket.java:211) 在 sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) 在 sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148) 在 sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) 在 sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 在 sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 在 sun.rmi.server.UnicastRef.newCall(UnicastRef.java:338) 在 sun.rmi.registry.RegistryImpl_Stub.rebind(RegistryImpl_Stub.java:147) 在 identityserver.server.IdServer.setupServer(IdServer.java:73) 在 identityserver.server.IdServer.main(IdServer.java:32) 75% 执行 [13 秒]

:运行

//Gradle 构建文件

apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'identityserver.server.IdServer'

repositories
    mavenCentral()


dependencies
    compile "commons-cli:commons-cli:1.4"


jar 
    baseName = 'gs-gradle'
    version = '0.1.0'


sourceSets
    main.java.srcDirs = ["src/identityserver/server", "src/identityserver/client"]

//Java rmi 服务器类,带有安全管理器集

package identityserver.server;
import org.apache.commons.cli.*;

import java.awt.*;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class IdServer extends UnicastRemoteObject implements ServerOperations
    private static final long serialVersionUID = -5057719935941913677L;
    private static int registryPort = 1099;
    private Options options;
    private String[] args;
    private String name;

    public static void main(String[] args)
        IdServer idServer = null;
        try 
            idServer = new IdServer(args,"//IdServer");
         catch (RemoteException e) 
            System.out.println("IdServer err: " + e.getMessage());
            e.printStackTrace();
        

        if (args.length > 3)
            idServer.usage();
            System.exit(1);
        

        idServer.parse();
        idServer.setupServer(idServer);
    

    public IdServer(String[] args, String name) throws RemoteException
        super();
        this.args = args;
        this.name = name;
        options = new Options();

        options.addOption("p","port",true, "port number");
        options.addOption("v", "verbose",false, "print detailed messages");

    

    public void parse()
        CommandLineParser parser = new DefaultParser();

        CommandLine cmd = null;
        try 
            cmd = parser.parse(options, args);

            if (cmd.hasOption("p"))
                System.out.println("Have port number " + cmd.getOptionValue("p"));

            else if (cmd.hasOption("v"))
                System.out.println("Verbose!!!!");
            
         catch (ParseException e) 
//            e.printStackTrace();
            usage();
        
    

    private void usage()
        System.err.println("Usage: java IdServer [--port <port#>][--verbose]");
    

    public void setupServer(IdServer idServer)
        try 
            System.setSecurityManager(new SecurityManager());
            Registry registry = LocateRegistry.getRegistry(registryPort);
            registry.rebind("IdServer", idServer);
            System.out.println("IdServer bound in registry");
         catch (RemoteException e) 
            e.printStackTrace();
            System.exit(1);
        
    
    @Override
    public String createAccount(String loginName) throws RemoteException 
        return "Account created without password";
    

    @Override
    public String createAccount(String loginName, String realName, String password) throws RemoteException 
        return "Account created with password";
    

【问题讨论】:

你为什么使用安全管理器? 【参考方案1】:

您可以将 jvm 属性添加到您的测试配置中

test 
  systemProperties 'java.security.policy': file("$projectDir/mysecurity.policy").absolutePath

【讨论】:

以上是关于如何将安全策略文件添加到 rmi 应用程序的 gradle 构建?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WAS 中定义 java 安全策略文件?

如何将类型添加到 GWT 的序列化策略白名单?

带有SecurityManager策略文件的Java Shipping JAR

如何在 chrome 扩展 manifest.json 文件中设置多个内容安全策略

RMI 如何添加库(并授予它们套接字权限)

拒绝加载样式表,因为它违反了内容安全策略