Usuário logado no Windows usando System.getProperty("user.name") + TomCat

Pessoal,

Estou utilizando a seguinte propriedade para pegar o usuário logado no Windows:

public String usuario_sessao = System.getProperty(“user.name”);

Quando estou rodando a aplicação no eclipse ele retorna o login corretamente. Quando populo o .war no Tomcat ele retorna uma string chamada: SYSTEM.

Algém sabe como fazer isso funcionar direito?

Olá,

O que está acontecendo é o seguinte. Quando você roda a aplicação no eclipse, o usuário ao qual a VM fica associada é o seu usuário. Mas quando ela é rodada pelo tomcat, o usuário que inicia o tomcat e a VM(do ponto de vista do Windows) é um usuário interno do windows chamdo SYSTEM( se você abrir o gerenciador de tarefas, você verá que vários processos são rodados por esse usuário), quando você faz uma requisição de um computador qualquer para o seu servidor a VM( que está rodando no servidor), consulta o SO do servidor descobre quem é o usuário que instanciou ela, e devolve para você. Ou seja sempre que você tentar fazer System.getProperty(“user.name”) em um container j2ee rodando no windows, você vai obter a resposta “SYSTEM”

rfogo, boa noite!

Tente isto:

package com.teste;

import com.sun.security.auth.module.NTSystem;

public class Teste {
	
	public Teste() {}
	
	public static void main(String[] args) {
		
		// Windows
		NTSystem infoSystem = new NTSystem();
		System.out.println(infoSystem.getName()); // username logado no windows/domínio
		System.out.println(infoSystem.getDomain()); // nome do dominio do sistema windows
		
		// Outras plataformas: 
		
		// Linux/Unix:
		// new com.sun.security.auth.module.UnixSystem().getUsername()

		// Solaris
		// new com.sun.security.auth.module.SolarisSystem().getUsername()
	   
	}

}

Abraço,

1 curtida

rodrior e victor,

Obrigado pelas repostas, porém o infoSystem.getName() está retornando o mesmo usuário “SYSTEM”.

Pessoal,

Sigo na busca por solução. Voltei meus esforços para o jcifs, parece que o mesmo funciona bem porém na nossa rede não tem compatibilidade pois o domínio solicita “security policy requires NTLMv2” que não é compatível mesmo com as versões mais recentes do jcifs.

Se alguém tiver alguma solução, estamos aí…

Pessoal,

Nada ainda, é impossível que não tenha uma solução para isso!

O que você, “de verdade”? Verificar o usuário que está acessando sua página, ou o usuário que está executando o processo do TOMCAT?

Tenho que identificar o usuario que acessou a pagina para que assim o mesmo possa logar na aplicacao! Quando uso o infoSystem.getName() ou System.getProperty(“user.name”); rodando via o eclipse funciona porem quando faco o deploy no tomcat a aplicacao nao loga pois retorna o usuario “SYSTEM” .

Acredito que você possa adicionar uma página de Login, com campos de Login/Senha para preenchimento por parte do usuário da aplicação. Após isso vcoê armazena essas informações na sessão do usuário… Pois como o victorrseloy falou, a VM associada ao Container sempre terá o user SYSTEM no caso do Windows.

João,

A minha intenção é que a aplicação não tenha essa tela de login. Porém se eu não encontrar solução para esse problema não vou ter como fugir disso!

Como o joaosouza respondeu, você vai precisar de uma página de login ou outro mecanismo para o usuário se identificar.

O System.getProperty(“user.name”) identifica o usuário do sistema que executa a máquina virtual. E não quem acessou a página.

Se você quer fazer integração entre o browser e o usuário logado do windows, sugiro tentar a biblioteca SPNEGO. Isso faz a integração entre o browser e o Windows.

[quote]The intent of this project is to provide an alternative library (.jar file) that application servers (like Tomcat) can use as the means for authenticating clients (like web browsers).

However, if your organization uses java based web/application servers, and you prefer Kerberos/SPNEGO instead of NTLM as the authentication protocol, and you would rather have a Java Servlet Filter (JSR-53) based implementation instead of a container specific authentication module (JSR-196), and you want SSO
(no username/password prompt), then this project may be of some interest to you.[/quote]

Olá rfogo, blz ?

Entendi sua necessidade, porém do jeito que vocês está tentando implementar acredito que não dê certo…Uma alteranatica é tentar implementar uma solução como o leo.andven passou. Outra alternativa é tentar fazer esse tipo de integração integrada com o AD (Active Directory), pois ai você terá como recuperar pela sua aplicação o user logado no Domínio através do AD.

Na hora que o usuário acessa a aplicação ele dispara um método que verifica o usuário logado no windows. Com isso ele pega o usuário e verifica se existe esse usuário no banco. Se existir ele loga na aplicação se não gera uma mensagem de erro.

Esse SPNEGO faz isso?

SPNEGO faz mais que isso, ele (parece que) tenta autenticar contra um Kerberos também.

Eu nunca usei, mas o código dele mostra que ele cria um novo ServletRequest (SpnegoHttpServletRequest) que tem um método getRemoteUser() que retorna o usuário logado.

Eu diria que o que você quer está nesse pacote, tem só de configurar/adaptar para o que você quer…

Será que não tem uma outra forma mais simples de fazer isso? Pesquisei um pouco sobre o SPNEGO e para eu chegar a usar o getRemoteUser() vai se uma longa caminhada até porque os exemplos que estudei trata a Autenticação com Kerberos.

Talvez, MUITO talvez, você consiga fazer isso com um applet… O applet roda no cliente e informa qual é o System.getProperty(“user.name”) remoto?!

Não sei se funcionaria, só uma idéia bem louca…

Não entendi!

Esse applet seria chamado em um método interno da aplicação?

Vocês poderia me ajudar a criar esse applet ou usar Jcifs?

Por que o pessoal aqui não quer essa tela de login na aplicação!