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

17 respostas
R

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?

17 Respostas

V

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”

rodrigo.ferreira

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,

R

rodrior e victor,

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

R

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í…

R

Pessoal,

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

L

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?

R

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” .

joaosouza

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.

R

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!

L

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.

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.

joaosouza

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.

R

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?

L

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…

R

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.

L

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…

R

Não entendi!

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

R

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!

Criado 20 de maio de 2011
Ultima resposta 3 de jun. de 2011
Respostas 17
Participantes 5