Получить логин в java - PullRequest
       10

Получить логин в java

82 голосов
/ 28 апреля 2009

Как я могу получить имя пользователя / логин на 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 ]

200 голосов
/ 28 апреля 2009
System.getProperty("user.name")
30 голосов
/ 29 апреля 2009

в 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()
15 голосов
/ 05 июня 2014

на основе ответа @ newacct , кода, который можно скомпилировать на любой платформе:

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 ) );
}
15 голосов
/ 18 февраля 2010

System.getProperty ("user.name") не является хорошей опцией безопасности, поскольку эта переменная среды может быть подделана C: \ set USERNAME = "Джо Доу" Джава ... // выдаст вам 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 и выше.

Я использую его в апплете, и он должен быть подписан. источник информации

6 голосов
/ 18 ноября 2015

Используя 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);

https://github.com/java-native-access/jna

2 голосов
/ 01 июня 2015

'set Username = "Username"' - это временное переопределение, которое существует только до тех пор, пока windows cmd все еще работает, после его закрытия переменная теряет значение. Так что я думаю

System.getProperty ( "user.name");

- все еще короткий и точный код для использования.

1 голос
/ 11 августа 2015

System.getenv().get("USERNAME"); - работает на windows!

В свойствах среды у вас есть необходимая информация о компьютере и хосте! Я говорю снова! Работает на WINDOWS!

...