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”
R
rodrigo.ferreira1 like
rfogo, boa noite!
Tente isto:
packagecom.teste;importcom.sun.security.auth.module.NTSystem;publicclassTeste{publicTeste(){}publicstaticvoidmain(String[]args){// WindowsNTSysteminfoSystem=newNTSystem();System.out.println(infoSystem.getName());// username logado no windows/domínioSystem.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
rfogo
rodrior e victor,
Obrigado pelas repostas, porém o infoSystem.getName() está retornando o mesmo usuário “SYSTEM”.
R
rfogo
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
rfogo
Pessoal,
Nada ainda, é impossível que não tenha uma solução para isso!
L
leo.andven
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
rfogo
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” .
J
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
rfogo
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
leo.andven
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.
J
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
rfogo
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
leo.andven
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
rfogo
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
leo.andven
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
rfogo
Não entendi!
Esse applet seria chamado em um método interno da aplicação?
R
rfogo
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!