Bagaimana saya bisa mendapatkan nama pengguna / nama login di Java?
Ini adalah kode yang telah saya coba ...
try{
LoginContext lc = new LoginContext(appName,new TextCallbackHandler());
lc.login();
Subject subject = lc.getSubject();
Principal principals[] = (Principal[])subject.getPrincipals().toArray(new Principal[0]);
for (int i=0; i<principals.length; i++) {
if (principals[i] instanceof NTUserPrincipal || principals[i] instanceof UnixPrincipal) {
String loggedInUserName = principals[i].getName();
}
}
}
catch(SecurityException se){
System.out.println("SecurityException: " + se.getMessage());
}
Saya mendapatkan SecurityException
ketika saya mencoba menjalankan kode ini. Bisakah seseorang memberi tahu saya apakah saya sedang menuju ke arah yang benar, dan membantu saya untuk memahami masalahnya.
Jawaban:
System.getProperty("user.name")
sumber
user.name
nama properti?di Unix:
new com.sun.security.auth.module.UnixSystem().getUsername()
di Windows:
new com.sun.security.auth.module.NTSystem().getName()
di Solaris:
new com.sun.security.auth.module.SolarisSystem().getUsername()
sumber
user.name
properti seharusnya kosong. Saya setuju dengan @JinKim, jangan menulis hal-hal yang bergantung pada OS.terinspirasi oleh jawaban @newacct , kode yang dapat dikompilasi di semua platform:
String osName = System.getProperty( "os.name" ).toLowerCase(); String className = null; String methodName = "getUsername"; if( osName.contains( "windows" ) ){ className = "com.sun.security.auth.module.NTSystem"; methodName = "getName"; } else if( osName.contains( "linux" ) ){ className = "com.sun.security.auth.module.UnixSystem"; } else if( osName.contains( "solaris" ) || osName.contains( "sunos" ) ){ className = "com.sun.security.auth.module.SolarisSystem"; } if( className != null ){ Class<?> c = Class.forName( className ); Method method = c.getDeclaredMethod( methodName ); Object o = c.newInstance(); System.out.println( method.invoke( o ) ); }
sumber
com.sun
kelas tidak dapat diakses secara default di Jawa 9+. Solusi ini tidak akan berhasil.System.getProperty ("user.name") bukanlah opsi keamanan yang baik karena variabel lingkungan tersebut dapat dipalsukan: C: \ set USERNAME = "Joe Doe" java ... // akan memberi Anda System.getProperty ("user. name ") Anda harus melakukan:
com.sun.security.auth.module.NTSystem NTSystem = new com.sun.security.auth.module.NTSystem(); System.out.println(NTSystem.getName());
JDK 1.5 dan yang lebih baru.
Saya menggunakannya dalam applet, dan itu harus ditandatangani. sumber info
sumber
com.sun.security.auth.module.NYSystem
lebih tinggi di classpath? Saya tidak tahu apakah runtime Java mencoba mencegah eksploitasi semacam itu, tetapi saya rasa tidak akan ada cara yang tidak dapat dilakukan untuk membuatnya 'aman' kecuali dengan menjalankan kode pada kotak yang tidak dapat diakses oleh klien yang berpotensi berbahaya .Menggunakan JNA sederhana:
https://github.com/java-native-access/jna
sumber
The 'set Username = 'Username'' adalah override sementara yang hanya ada selama jendela cmd masih naik, setelah itu membunuh, variabel kehilangan nilai. Jadi saya pikir
masih merupakan kode yang pendek dan tepat untuk digunakan.
sumber
System.getenv().get("USERNAME");
- bekerja di jendela!Di properti lingkungan Anda memiliki informasi yang Anda butuhkan tentang komputer dan host! Saya katakan lagi! Bekerja di WINDOWS!
sumber
System.getenv("username")
? :)Di bawah ini adalah solusi untuk WINDOWS SAJA
Dalam kasus di mana aplikasi (seperti Tomcat) dimulai sebagai layanan windows, System.getProperty ("user.name") atau System.getenv (). Get ("USERNAME") mengembalikan pengguna yang memulai layanan dan bukan nama pengguna yang masuk saat ini.
Juga di Java 9 kelas NTSystem dll tidak akan bisa diakses
Jadi solusi untuk windows: Anda dapat menggunakan wmic , jadi Anda harus menjalankan perintah di bawah ini
Jika tersedia, ini akan mengembalikan keluaran dalam bentuk:
Catatan: Untuk windows Anda perlu menggunakan cmd / c sebagai awalan, jadi di bawah ini adalah program mentah sebagai contoh:
Process exec = Runtime.getRuntime().exec("cmd /c wmic ComputerSystem get UserName".split(" ")); System.out.println(exec.waitFor()); try (BufferedReader bw = new BufferedReader(new InputStreamReader(exec.getInputStream()))) { System.out.println(bw.readLine() + "\n" + bw.readLine()+ "\n" + bw.readLine()); }
sumber