Como obter o nome de usuário do usuário remoto em java

Eu estou trabalhando em aplicativo que não tem nenhum mecanismo de login, qualquer usuário na minha organização pode usar isso. Mas eu quero escolher o nome de usuário dos usuários remotos que usarão minha ferramenta. Eu tenho um botão clicando no que eu quero para obter seus nomes de usuário.

Eu tentei request.getRemoteUser tem null . tentou System.getenv("USERNAME") obtendo o usuário logado do localhost onde o servidor reside. Tentei getHostName , System.getProperty obteve o nome do host local. Tentei isso também – new com.sun.security.auth.module.NTSystem().getName() mas mesmo resultado.

Eu estou usando o servidor java6, windows server e glassfish3.

Por favor, sugira algo, pois não quero usar nenhum link externo ou ferramenta.

Você quer fazer algo chamado SSO (Single Sign On): Um usuário está logado em algum lugar (no seu caso, seu computador Windows) e você quer autenticar o usuário com este login (já feito). Este é um caso de uso muito comum e existem diferentes maneiras de fazer isso. No entanto, a grande questão é sempre como você pode confiar nesses sistemas de terceiros. E é aí que o problema começa.

Como sua pergunta não está muito clara, presumo que você tenha um servidor Java Glassfish em execução no Windows Server e em um cliente Java (porque você solicitou o código Java). Portanto, o servidor Java deve autenticar quem é o usuário do cliente Java. E o servidor deve confiar nessa informação.

Usando System.getProperty("user.name"); Não é uma boa idéia, já que qualquer um pode mudar isso. Você pode iniciar seu programa Java com java -Duser.name=Joe e java -Duser.name=Joe .

Mas desde que você está no Windows, você pode usar o Windows para ajudá-lo. Se ambos, seu cliente e servidor, estiverem no mesmo domínio, eles serão autenticados no mesmo sistema. Você pode perguntar a esse sistema a identidade do usuário. Normalmente, as máquinas de uma empresa estão no mesmo domínio.

Para fazer isso, existe uma ferramenta chamada Waffle. Ele faz uma autenticação segura do Windows entre máquinas no mesmo domínio. Se o seu cliente e servidor estiverem no mesmo domínio, é uma maneira fácil de executar um SSO (um único logon). Você pode encontrá-lo no GitHub: http://dblock.github.io/waffle/

Aqui está um exemplo simples de uma das minhas próprias perguntas há alguns meses atrás (veja aqui ):

 // 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()); 

Você pode usar o Waffle também para sites. No entanto, eu não fiz isso e não posso explicar o que fazer neste caso.

E uma observação importante: acho que você está um pouco confuso. Se você request.getRemoteHost() em seu servidor, você tenta obter a identidade do cliente que envia a solicitação (a propósito, não é seguro, um cliente poderia enviar qualquer coisa). No entanto, se você fizer System.getProperty("user.name") no seu servidor, você tenta obter o nome do próprio servidor. Esteja ciente de onde você está (no cliente ou no servidor) e o que você quer. E verifique se você pode confiar nessa informação ou não. Segurança é difícil.

código de class java para encontrar quem está logado em um computador remoto em um domínio

 package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import com.test.Pubfun; public class UserName { public static HashMap  hmun=new HashMap(); public String setUserFromIP(String arg1) { String m = arg1; StringBuilder user = new StringBuilder(); String u = ""; String user2 = null; try { Process p = Runtime.getRuntime().exec("query user /server:" + m); p.waitFor(); BufferedReader reader = new BufferedReader(new InputStreamReader( p.getInputStream())); String line = reader.readLine(); while (line != null) { line = reader.readLine(); user.append(line); line=null; } } catch (IOException e1) { } catch (InterruptedException e2) { } u = user.toString().replace("null", ""); try { user2 = this.getUserFromString(u); } catch (ArrayIndexOutOfBoundsException ae) { } u.replace("null", " "); System.out.println(user2); hmun.put("username",user2); return user2; } public static String gethmun() { String t=hmun.get("username"); return t; } public String getUserFromString(String u) { HashMap  hmun=new HashMap(); String input = u; int length, size; length = input.length(); size = length ; String strarray[] = new String[size]; strarray = input.split("\\s+"); for (int i = 0; i < strarray.length; i++) { if(strarray[i].equals("Active")){ hmun.put("username", strarray[i-3]); } } String user1=hmun.get("username"); return user1; } } 

HttpServletRequest.getRemoteUser() pode, opcionalmente, retornar o login do usuário que fez a solicitação (se autenticado), mas não é o nome de usuário do usuário que efetuou login na máquina remota.

Não há como consultar o nome de usuário da máquina remota. Os navegadores ou aplicativos que fazem as solicitações podem enviar essas informações voluntariamente, mas, se não, você não encontrará uma maneira de obtê-las. E por padrão eles não enviam isso, então não conte com isso.

Isto dá-lhe o atual nome de usuário logado do sistema local do Windows System.getProperty("user.name");

    Intereting Posts