2009-04-28 5 views
71

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을 얻을 ... 내가 시도 코드입니다. 누군가 제가 올바른 방향으로 나아가고 있는지 알려 주어 문제를 이해하도록 도와 주시겠습니까? 유닉스에서

+2

내가 당신을 오해 두려워 해요,하지만 난 당신의 질문을 이해하지 못하고 있습니다. 로그인 사용자 이름은 무엇입니까? Windows/GNU 리눅스 로그인? 웹 서버의 기본 인증? – guerda

+0

세부 정보가 게시되지 않은 경우 아무 것도 이해할 수 없습니다. –

+0

죄송합니다. 나는 Java에 익숙하지 않고 이제는 이해하기가 약간 어렵습니다. –

답변

175
System.getProperty("user.name") 
+3

+1 System.properties를 인쇄하면 VM이 초기화되는 많은 정보를 얻을 수 있습니다 –

+0

고마워요!Flash/actionscript에서 왔습니다 ... 커버 할 looooooot가 있습니다 :) –

+1

나를 위해이 명령은 VM을 실행하는 사용자의 이름을 인쇄합니다. Java 어플리케이션의 로그인 사용자가 아닙니다. –

27

: Windows의

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

:

솔라리스에서
new com.sun.security.auth.module.NTSystem().getName() 

:

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

이 코드는 자바의 쓰기 (한 번만 실행, OS 특정 코드의 도입)의 철학에 반대하며 둘째, Sun의 Java 구현에 대한 의존성을 만듭니다. –

+12

사용자 이름을 얻는 것은 정의에 따라 플랫폼에 따라 다릅니다. 단일 사용자 시스템에서 실행되는 JVM에는 사용자 이름이 전혀 없을 수도 있습니다. –

+6

@ChinmayKanchi : 사용자 이름이 없으면'user.name' 속성은 null이어야합니다. 나는 @JinKim에 동의한다. OS 의존적 인 것을 쓰지 마라. –

14

은 System.getProperty는 ("user.name")는 아니다 그 환경 변수가 위조 될 수 있기 때문에 좋은 보안 옵션 : C :

com.sun.security.auth.module.NTSystem NTSystem = new com.sun.security.auth.module.NTSystem(); 
System.out.println(NTSystem.getName()); 

JDK 1.5 이상 : = "조 미상" 자바 설정 \ USERNAME ... // 당신에게 당신이해야한다고은 System.getProperty ("user.name") 을 줄 것이다.

애플릿 내에서 사용하며 서명해야합니다. info source

+0

아주 편리 +1! 감사! –

+2

이것은 Windows에서만 작동하므로 완전한 솔루션은 아닙니다. –

+1

너무 스푸핑 될 수 있습니까? 예 : 클래스 패스 내의 커스텀 클래스 로더 또는 com.sun.security.auth.module.NYSystem의 커스텀 구현이 더 높은가? Java 런타임이 이러한 익스플로잇을 막으려 고 시도하는지는 모르겠지만 잠재적으로 악의적 인 클라이언트가 액세스 할 수없는 상자에서 코드를 실행하는 것 외에는 '보안'할 수있는 방법이있을 것이라고 생각하지 않습니다. . – bacar

13

'의 대답은 모든 플랫폼에서 컴파일 할 수있는 코드 :

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)); 
} 
+0

리플렉션을 유용하게 사용 :) – Zizouz212

+3

NTSystem에서 사용자 이름을 가져 오는 방법이 "getUsername()"이 아닌 "getName()"이므로 Windows에서이 기능이 중단됩니다. 추가 검사를 한 다음 올바른 방법을 호출 할 수 있다고 가정합니다. 기괴한 이것은 JRE에 의해 운영 체제에 의존하지 않는 메커니즘으로 추상화되지는 않습니까? –

2

' @newacct 에서 영감을 설정 한 사용자 이름 = "아이디" '는 임시 재입니다 만 cmd 윈도우가 아직 켜져있는 한 존재합니다. 일단 사라지면 변수는 값을 잃습니다. 그래서 나는 생각한다.

System.getProperty ("user.name");

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

1

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

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

+0

'System.getenv ("username")'은 어떨까요? :) –

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

+0

도메인 사용자로 로그인했지만 동일한 이름의 로컬 사용자가있는 경우이 작업은 작동하지 않습니다. getAccountByName은 로컬 사용자에 대한 정보를 반환합니다. – Dave

관련 문제