当前位置:  开发笔记 > 编程语言 > 正文

获取java中的登录用户名

如何解决《获取java中的登录用户名》经验,为你挑选了5个好方法。

如何在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

SecurityException当我尝试运行此代码时,我得到了一个.有人可以告诉我,我是否正朝着正确的方向前进,并帮助我理解这个问题.



1> dfa..:
System.getProperty("user.name")


+1您可以打印System.properties以获取VM初始化的大量信息
对我来说,这会打印执行VM的用户的名称.不是java应用程序上的登录用户.

2> newacct..:

在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()


这段代码违反了Java的一次编写理念,在任何地方运行(引入特定于操作系统的代码),其次,它创建了对Sun的Java实现的依赖.
根据定义,尝试获取用户名是特定于平台的.在单用户系统上运行的JVM可能根本没有用户名.
@ChinmayKanchi:如果没有用户名,那么`user.name`属性应该为null.我同意@JinKim,不要编写依赖于操作系统的东西.
开发人员不应使用com.sun包下的类.它们是内部的,将来可能会发生变化.
user.name可以在命令行上设置,因此它在很大程度上取决于用例

3> celsowm..:

@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 ) );
}


这将在Windows上中断,因为在NTSystem上获取用户名的方法是"getName()"而不是"getUsername()".我想你可以做进一步检查,然后调用正确的方法.奇怪的是,这不是由JRE抽象为OS不可知机制的吗?

4> pdjota..:

System.getProperty("user.name")不是一个好的安全选项,因为该环境变量可能是伪造的:C:\ set USERNAME ="Joe Doe"java ... //将为您提供System.getProperty("user.名称")你应该这样做:

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

JDK 1.5及更高版本.

我在applet中使用它,它必须签名. 信息来源


这不是一个完整的解决方案,因为它只能在Windows下运行.
我只是成功设法使用PowerMock替换NTSystem.getName()的实现(我相信使用自定义类加载器),所以你真的不能依赖这样的东西来'安全'......但是我不知道小程序世界中的事情如何.我原以为如果有人可以提供自定义系统属性,那么他们也可以提供自定义类或自定义类加载器.

5> ANTARA..:

使用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

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有