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”
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()
}
}
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.
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.
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]
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.
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.