2012-10-30 17 views
5

Mam kod, który odczytuje dane użytkownika z konsoli przy użyciu poniższego kodu.Pozwolenie na czytanie System.in w java

Console console = System.console(); 
String input = console.readLine(); 

Jednak ten kod powinien działać w bardzo bezpiecznym środowisku, w którym uprawnienia każdej akcji są kontrolowane za pomocą pliku zasad.

Więc zrobiłem mój testowanie kodu java z pliku zasad jak

grant codeBase "file:/myjar.jar" { 
    permission java.security.AllPermission; 
}; 

nie mam pojęcia, co pozwolenie należy użyć do udzielenia pozwolenia na console.readLine().

Odpowiedz

3

Jeśli używasz System.console w JVM z SecurityManager włączoną, musisz następujące RuntimePermissions:

permission java.lang.RuntimePermission "readFileDescriptor"; 
permission java.lang.RuntimePermission "writeFileDescriptor"; 

Dlaczego?

W System.in i System.out deskryptorów (0 i 1 z 2 reprezentujących System.err) są już otwarte JVM. SecurityManager weryfikuje, czy masz dostęp do zapisu otwartych deskryptorów plików poprzez checkWrite(FileDescriptor fd) method i podobnie, masz dostęp do odczytu przez checkRead(FileDescriptor fd) method. Wymagane przez te metody RuntimePermission są wymienione w javadocs.

Podczas gdy "writeFileDescriptor" może wydawać się zbędny, konieczne jest zainicjowanie obiektu Console (co najmniej w środowisku Oracle Java 7).

+0

Dzięki. To działało jak czar. :) – Jijoy