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");
UNIX의 경우:
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.get Property("user.name")를 제공합니다.다음 작업을 수행해야 합니다.
com.sun.security.auth.module.NTSystem NTSystem = new com.sun.security.auth.module.NTSystem();
System.out.println(NTSystem.getName());
JDK 1.5 이후
애플릿 안에서 사용하는데, 서명해야 해요.정보 소스
유고 인민군을 사용하는 것은 간단하다.
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
'set Username='사용자 이름"은 cmd 창이 아직 가동 중인 경우에만 존재하는 임시 재정의로, 일단 종료되면 변수는 값을 잃게 됩니다.그래서 제가 생각하기에
System.getProperty("user.name");
사용하기에는 아직 짧고 정확한 코드입니다.
System.getenv().get("USERNAME");
- 윈도우에서 작동!
환경 속성에는 컴퓨터와 호스트에 대해 필요한 정보가 있습니다.다시 한 번 말하지만!WINDOWS로 동작!
다음은 WINDOWS 전용 솔루션입니다.
응용 프로그램(Tomcat 등)이 Windows 서비스로 시작되는 경우 System.getProperty("user.name") 또는 System.getenv().get("USERNAME")는 현재 로그인한 사용자 이름이 아닌 서비스를 시작한 사용자를 반환합니다.
또한 Java 9에서는 NTSystem etc 클래스에 액세스할 수 없습니다.
Windows에 대한 회피책:wmic을 사용할 수 있으므로 다음 명령을 실행해야 합니다.
wmic ComputerSystem get UserName
사용 가능한 경우 다음 형식의 출력이 반환됩니다.
UserName
{domain}\{logged-in-user-name}
주의: 윈도에서는 cmd /c를 프리픽스로 사용해야 합니다.다음은 대략적인 프로그램의 예입니다.
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());
}
Linux Centos에서 테스트했습니다.
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
System.out.format("%s=%s%n", envName, env.get(envName));
}
System.out.println(env.get("USERNAME"));
언급URL : https://stackoverflow.com/questions/797549/get-login-username-in-java
'programing' 카테고리의 다른 글
Gson을 사용하는 Android에서 @SerializedName 주석의 기본 목적은 무엇입니까? (0) | 2022.09.05 |
---|---|
어떻게 하면 PHP 타입 힌트에서 "캐치 가능한 치명적인 오류"를 잡을 수 있을까요? (0) | 2022.09.05 |
휴지 상태:MyISAM 대신 Mysql InnoDB 테이블 생성 (0) | 2022.09.05 |
REST - JSON을 사용한HTTP 포스트 멀티파트 (0) | 2022.09.05 |
열에서 고유한 값을 찾은 다음 정렬합니다. (0) | 2022.09.05 |