Получить имя пользователя для входа в java
Как я могу получить имя пользователя/логин в Java?
это код, который я пробовал...
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());
}
Я SecurityException
когда я пытаюсь запустить этот код. Может кто-нибудь, пожалуйста, скажите мне, иду ли я в правильном направлении, и помогите мне понять проблему.
7 ответов:
в Unix:
new com.sun.security.auth.module.UnixSystem().getUsername()
в Windows:
new com.sun.security.auth.module.NTSystem().getName()
в Солярис:
new com.sun.security.auth.module.SolarisSystem().getUsername()
System. getProperty("user.name") не является хорошим вариантом безопасности, так как эта переменная среды может быть подделана: C:\ set USERNAME= " Joe Doe" Ява... // даст вам System. getProperty("user.name") Вы должны сделать:
com.sun.security.auth.module.NTSystem NTSystem = new com.sun.security.auth.module.NTSystem(); System.out.println(NTSystem.getName());
JDK 1.5 и выше.
Я использую его в апплет, и он должен быть подписан. информация источник
вдохновленный @newacct's ответ, код, который может быть скомпилирован в любой платформе:
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 ) ); }
С помощью JNA его просто:
String username = Advapi32Util.getUserName(); System.out.println(username); Advapi32Util.Account account = Advapi32Util.getAccountByName(username); System.out.println(account.accountType); System.out.println(account.domain); System.out.println(account.fqn); System.out.println(account.name); System.out.println(account.sidString);