[java] 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이 코드를 실행하려고 하면 오류가 발생합니다. 누군가 내가 올바른 방향으로 가고 있는지 알려주고 문제를 이해하도록 도와주세요.



답변

System.getProperty("user.name")


답변

유닉스에서 :

new com.sun.security.auth.module.UnixSystem().getUsername()

Windows에서 :

new com.sun.security.auth.module.NTSystem().getName()

Solaris에서 :

new com.sun.security.auth.module.SolarisSystem().getUsername()


답변

모든 플랫폼에서 컴파일 할 수있는 코드 인 @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 ) );
}


답변

System.getProperty ( “user.name”)는 환경 변수가 위조 될 수 있으므로 좋은 보안 옵션이 아닙니다. C : \ set USERNAME = “Joe Doe”java … // 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 이상.

애플릿 내에서 사용하고 서명해야합니다.
정보 출처


답변

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


답변

‘설정 사용자 이름 = “사용자 이름”‘ 에만 전원이 살해되면 cmd를 창문 변수 값을 잃게, 최대 여전히만큼 존재하는 임시 재이다. 그래서 나는

System.getProperty ( “user.name”);

여전히 짧고 정확한 코드입니다.


답변

System.getenv().get("USERNAME");
-창문에서 작동합니다!

환경 속성에는 컴퓨터와 호스트에 대해 필요한 정보가 있습니다! 나는 다시 말하고있다! WINDOWS에서 작동합니다!