要获取Java程序中当前用户的名称,可以使用simply fetch the value of the user.name
system property:
System.getProperty("user.name");
但那有多安全?对于常见的运行时环境,执行程序的用户是否可以轻松地将此属性设置为任意值(例如,使用JVM的命令行参数)?用户可以轻松欺骗此用户名吗?
我问,因为我正在编写一个可由任何人运行的命令行程序,但只有在用户是特殊管理用户时才允许某些特权操作。
请注意,自Java 11以来,user.name
属性仅在程序启动时才被有效读取,因此恶意程序代码无法欺骗它。
是的,如果用户可以自由启动应用程序,则此值可以“欺骗”并且无法依赖。
只需使用JVM arg -Duser.name=someothername
启动应用程序将导致System.getProperty("user.name")
返回该值。
对于任何可能再次登陆的人:
使用cmd命令whoami
并使用this post读取输入应该是使用用户名作为“验证”的更安全的方式。
除此之外,这也可能是欺骗性的,对于cmd命令而言可能比对JVM参数更难...