Get login username in java
System.getProperty("user.name");
How to get current user name of Linux in Java
To get the output of the process, you need to attach the InputStream
of to the normal output of the subprocess. Then, you can read from it by creating a BufferedReader
. To get the first line of the output of the process (on stdout) you can use this code:
Process proc = Runtime.getRuntime().exec("whoami");
BufferedReader stdin = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String username = stdin.readLine();
System.out.println(username);
You can also get the InputStream
of the error output of the subprocess (stderr) with proc.getErrorStream()
if this should be necessary.
However, there is a better way if you want to get the username of the user executing the VM:
String username = System.getProperty("user.name");
System.out.println(username);
Java current machine name and logged in user?
To get the currently logged in user:
System.getProperty("user.name"); //platform independent
and the hostname of the machine:
java.net.InetAddress localMachine = java.net.InetAddress.getLocalHost();
System.out.println("Hostname of local machine: " + localMachine.getHostName());
How to get the remote user's username in java
You want to do something called SSO (Single Sign On): A user is logged in somewhere (in your case his Windows computer) and you want to authenticate the user with this (already done) login. This is a very common use case and there are different ways to do that. However, the big question is always how you can trust those third party system. And this is where the trouble begins.
Since your question is not very clear, I assume you have a Java Glassfish server running on Windows Server and a Java client (because you asked for Java code). So the Java server must authenticate who the user of the Java client is. And the server must trust this information.
Using System.getProperty("user.name");
isn't a good idea since anybody can change it. You can start your Java program with java -Duser.name=Joe <your_program>
and that's it.
But since you are on Windows, you could use Windows to help you. If both, your client and server, are in the same domain, they are authenticated against the same system. You can ask this system for the user identity. Typically machines of a company are in the same domain.
To do this there is a tool called Waffle. It does a secure Windows authentication between machines in the same domain. If your client and server are in the same domain, it is an easy way to perform an SSO (a single sign on). You can find it on GitHub: http://dblock.github.io/waffle/
Here is a simple example from one of my own questions a couple of months ago (see here):
// client credentials handle
IWindowsCredentialsHandle credentials= WindowsCredentialsHandleImpl.getCurrent("Negotiate");
credentials.initialize();
// initial client security context
WindowsSecurityContextImpl clientContext = new WindowsSecurityContextImpl();
clientContext.setPrincipalName(Advapi32Util.getUserName());
clientContext.setCredentialsHandle(credentials.getHandle());
clientContext.setSecurityPackage(securityPackage);
clientContext.initialize();
// accept on the server
WindowsAuthProviderImpl provider = new WindowsAuthProviderImpl();
IWindowsSecurityContext serverContext = null;
do {
if (serverContext != null) {
// initialize on the client
SecBufferDesc continueToken = new SecBufferDesc(Sspi.SECBUFFER_TOKEN, serverContext.getToken());
clientContext.initialize(clientContext.getHandle(), continueToken);
}
// accept the token on the server
serverContext = provider.acceptSecurityToken(clientContext.getToken(), "Negotiate");
} while (clientContext.getContinue() || serverContext.getContinue());
System.out.println(serverContext.getIdentity().getFqn());
for (IWindowsAccount group : serverContext.getIdentity().getGroups())
System.out.println(" " + group.getFqn());
You can use Waffle also for websites. However, I didn't do that and cannot explain you what to do in this case.
And one important remark: I think you are a little bit confused. If you do request.getRemoteHost()
on your server, you try to get the identity of the client who send the request (by the way, it is not secure, a client could send anything). However, if you do System.getProperty("user.name")
on your server, you try to get the name of the server itself. Be aware where you are (on client or server) and what you want. And make sure whether you can trust this information or not. Security is difficult.
Related Topics
Arraylist Initial Capacity and Indexoutofboundsexception
Javafx Automatic Resizing and Button Padding
Returning Overlapping Regular Expressions
Selenium Many Logs (How to Remove)
Calculating Difference in Dates in Java
Should You Report the Message Text of Exceptions
Jformattedtextfield:Input Time Duration Value
Java Error - Actual and Formal Argument Lists Differ in Length
How to Retrieve Image from Project Folder
Why Jscrollpane in Joptionpane Not Showing All Its Content
Eclipse Windowbuilder, Overlapping JPAnels
Deployment Error:Starting of Tomcat Failed, the Server Port 8080 Is Already in Use
Environment Variable to Control Java.Io.Tmpdir
Access to Private Inherited Fields via Reflection in Java
Technique or Utility to Minimize Java "Warm-Up" Time
Using Powermockito.Whennew() Is Not Getting Mocked and Original Method Is Called
Dependency Injection in Struts2 Accessing Session Scoped Beans