Pessoal estou tendo problemas em pegar o usuário logado na rede. Ocorre que estou utilizando a função: System.getProperty("user.name");Mas com esta função eu estou pegando o usuário logado na máquina e com isso me é retornado sempre o usuário logado na máquina servidora da aplicação. Agradeço se alguém tiver uma dica ou souber de alguma função que retorne o usuário da rede.
Pegar usuário logado na rede
13 Respostas
Douglas, a JVM é um processo, desta maneira você pega o dono do processo. Você quer o login de quem, afinal?
Só para deixar mais claro, temos uma rede nt aqui na empresa e eu tenho uma aplicação no servidor de aplicações Tomcat, rodando em uma máquina servidora. Acontece que preciso pegar o usuário da rede que da sua máquina cliente acessou a aplicação. Por exemplo na máquina servidora o usuário de rede por exemplo é o administrator e eu usuário douglas acessei a aplicação de minha máquina onde estou logado como douglas. preciso que a aplicação me retorne como usuário que está acessando a aplicação “douglas” e não “administrator” como está acontecendo no momento. Espero ter sido um pouco mais claro é que é meio difícil de explicar.
Tentando esclarecer um pouco mais, o que gostaria de ver com vocês é se alguém sabe se existe alguma função parecida com esta do ASP em JSP:Set NT = CreateObject("WScript.NetWork")
Usuario = nt.usernameEsta fução retorna o usuário logado na rede em ASP.
Usando o jCifs.jar (que está no link que lhe passei acima) e modificando o seu web.xml, dá para você chamar request.getRemoteUser() e obter o usuário (como por exemplo “NYC-USERS\MIALLEN” no caso de você ter um domínio NYC-USERS o usuário logado MIALLEN.) Se o usuário não estiver logado (Windows 98 por exemplo, onde o usuário simplesmente teclou ESC para pular a tela de login) getRemoteUser deve retornar null.
Valeu thingol, vou baixar o jar modificar o web.xml e testar. Depois posto aí o resultado, falou. :thumbup:
Helpdesk\WEB-INFGostria de que se possível desse uma olhada no conteúdo do arquivo web.xml que estou utilizando e verificasse se existe algo de errado:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
<!--
Esta é a DTD (Document Type Definition) para os deployments descriptors
da versão 2.3 da API Servlet. Os os deployments descriptors devem incluir
um DOCTYPE como abaixo:
-->
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<!--
A tag web-app é a raiz dos deployment descriptor para
as aplicações web. Nela, as tags devem obrigatoriamente
estar organizadas na seguinte ordem imposta pela DTD
inclusa acima:
web-app <(icon?, display-name?, description?, distributable?,
context-param*, filter*, filter-mapping*, listener*, servlet*,
servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?,
error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*,
login-config?, security-role*, env-entry*, ejb-ref*, ejb-local-ref*)>
Onde uma "?" indica que a tag pode aparecer 0 ou 1 vez
e o "*" indica 0 ou mais vezes.
-->
<!-- Descrições Gerais da sua aplicação -->
<!--
Define um nome a ser mostrado para a aplicação.
Não tem relação com o context-path, ou seja, essa
configuração não vai alterar a maneira como vc
acessa sua aplicação
-->
<display-name>Minha Aplicacao Web</display-name>
<!--
Descrição para a sua aplicação web.
-->
<description>
Esta eh a versão X.X de uma aplicacao web
que faz uso de servlet e jsp e serve para
automatizar coisa tal.
</description>
<!--
Parametro de inicializacao que serah utilizado
por toda a sua aplicacao. Valores definidos nessa
tag podem ser recuperados em um servlet ou uma jsp
pela chamada do seguinte metodo:
String param =
getServletContext().getInitParameter("name");
Onde "name" deve coincidir com o valor definido
na subtag <param-name>.
Vc pode definir qualquer numero de paramentros
de inicializacao que forem necessarios.
Inclusive zero.
-->
<context-param>
<!-- Nome do parametro de incializacao -->
<param-name>webmaster</param-name>
<!-- Valor do parametro -->
<param-value>[email removido]</param-value>
<description>
Endereco de email do adminstrador para quem questoes
e comentarios sobre a aplicacao devem ser enviados.
</description>
</context-param>
<!--
Definições para os servlets que fazem parte da
sua aplicação, incluindo parametros de inicializacao.
No Tomcat, vc pode tambem enviar requisicoes (requests)
para servlets não listados aqui da seguinte maneira:
[url]http://localhost:8080/{context-path}/servlet/{classname}[/url]
Entretanto, esse uso não é garantidamente portavel.
Isso tambem torna referencias relativas a recursos
usados por seu servlet mais complicadas. Então definir
todos os seus servlet é o mais recomendado.
Parametros de inicialização do servlet podem ser recuperados
em um servlet ou jsp da seguinte maneira:
String value =
getServletConfig().getInitParameter("nome");
Onde "nome" deve coincidir com o valor de <param-name>
para algum dos parametros.
Você pode definir qualquer quantidade de servlets incluindo
zero.
-->
<servlet>
<!--
Nome para o servlet. Essa tag é obrigatoria
quando se define um servlet
-->
<servlet-name>meuServlet</servlet-name>
<description>
Servlet usado para recupera algo em algum lugar.
</description>
<!--
Tag usada para indicar a classe (completamente qualificada)
que representa o servlet definido. Essa tag é obrigatoria
quando se define um servlet.
-->
<servlet-class>com.meu.pacote.ServletTal</servlet-class>
<!--
Lista de parametros de inicializacao referentes apenas
a esse servlet. Voce pode usar quantos <init-param>
quiser inclusive zero.
-->
<init-param>
<param-name>listOrders</param-name>
<param-value>com.mycompany.myactions.ListOrdersAction</param-value>
</init-param>
<!--
A tag load-on-startup indica que este servlet deve
ser carregado (loaded, ou seja, intanciado e ter seu
metodo init() chamado) quando a aplicação for iniciada.
O conteudo desse elemento deve ser um inteiro indicando
a ordem na qual os servlets serão carregados. Se o valor
um inteiro negativo, ou não é apresentado, o container
está livre para carregar o servlet a qualquer hora que
escolher. Se o valor é um inteiro positivo ou 0 (zero),
o container deve carregar e inicializar o servlet assim
que a aplicação é iniciada. O container deve garantir que
servlet marcados com inteiros MENORES devem ser carregados
ANTES de servlets marcados com inteiros com altos valores.
O Container pode escolher a ordem para carregar servlet
marcados com o mesmo valor em load-on-startup
-->
<load-on-startup>5</load-on-startup>
</servlet>
<!--
A tag <serlvet-mapping> define um mapeamento que é usado
pelo servlet container para traduzir um request URI para
um servlet em particular. Os exemplos abaixo corresponde
a descricao feita para o servlet acima (pelo uso da tag
<servlet>. Assim, o valor de servlet-name, para mapear
um determinado servlet, deve ser o mesmo usado para definir
o servlet como mostrado acima. Dessa forma, um request URI
como:
[url]http://localhost:8080/{contextpath}/meuServlet[/url]
Será mapeada para o servlet "meuSerlvet".
Voce pode definir qualquer numero de mapeamentos para
serlvets, incluindo zero. Tambem é permitido fazer mais
de um mapeamento para um mesmo servlet.
-->
<servlet-mapping>
<servlet-name>meuServlet</servlet-name>
<url-pattern>/meuServlet</url-pattern>
</servlet-mapping>
<!--
Define um timeout default para as sessions de sua
aplicacao, em minutos. A partir de um serlvet ou
JSP voce pode modificar manualmente o timeout para
uma session em particular usando dinamicamente os
metodos HttpSession.getMaxInactiveInterval() e
HttpSession.setMaxInactiveInterval(int interval).
-->
<session-config>
<!-- 30 minutos -->
<session-timeout>30</session-timeout>
</session-config>
<!--
Lista de arquivos que serao procurados quando
alguem acessar o diretorio virtual de sua aplicacao.
Os arquivos são listados em ordem de prioridade, de
modo que os primeiros serão procurados antes e, caso
não seja encontrado, o servlet container tentará
usar o proximo da lista.
-->
<filter>
<filter-name>NtlmHttpFilter</filter-name>
<filter-class>jcifs.http.NtlmHttpFilter</filter-class>
<init-param>
<param-name>jcifs.smb.client.domain</param-name>
<param-value>NYC-USERS</param-value>
</init-param>
<init-param>
<param-name>jcifs.netbios.wins</param-name>
<param-value>10.169.10.77,10.169.10.66</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>NtlmHttpFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>default2.jsp</welcome-file>
</welcome-file-list>
</web-app>
String usuario = request.getRemoteUser();
<init-param>
<param-name>jcifs.smb.client.domain</param-name>
<param-value>NYC-USERS</param-value>
</init-param>
<init-param>
<param-name>jcifs.netbios.wins</param-name>
<param-value>10.169.10.77,10.169.10.66</param-value>
</init-param>
Agora você precisa fazer duas coisas:
- Entender o parâmetro que você está passando (o exemplo não é para ser copiado literalmente, mas para ser adaptado para a sua rede)
No seu caso, qual é o nome do seu domínio da rede? Quais são os endereços do servidor WINS de sua rede?
Para saber qual o nome do seu domínio - acho que você sabe.
Para saber endereço do servidor WINS - use ipconfig /all. Exemplo:
Ethernet adapter Local Area Connection:
Connection-specific DNS Suffix . : xxxxx.com.br
Description . . . . . . . . . . . : Intel(R) PRO/100 VE Network Connection
Physical Address. . . . . . . . . : 00-0C-F1-99-CA-5B
DHCP Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
IP Address. . . . . . . . . . . . : 10.177.77.77
Subnet Mask . . . . . . . . . . . : 255.255.0.0
Default Gateway . . . . . . . . . : 10.177.0.1
DHCP Server . . . . . . . . . . . : 10.177.0.3
DNS Servers . . . . . . . . . . . : 200.177.9.177
200.177.9.178
Primary WINS Server . . . . . . . : 10.177.0.15
Lease Obtained. . . . . . . . . . : Monday, 06/13/segunda-feira, 13 de junho de 2005 09:50:
34
Lease Expires . . . . . . . . . . : terça-feira, 21 de junho de 2005 09:50:34
Veja o “Primary WINS Server” para ver o que aparece.
- E - acho que você precisa ligar a autenticação na sua web application,
Beleza thingol, mas onde devo colocar estes parâmetros. Desculpe minha ignorância, mas é que estou começando a mexer com JSP. Gostaria de que se possível me indicasse no arquivo web.xml onde eu faria estas configurações. Tipo onde eu precisaria colocar o “nome do domínio” e o “endereço do servidor WINS”. E só para entender melhor, gostaria que me explicasse esta parte de ligar a autenticação na minha web application. É porque pelo que entendi, você está querendo me dizer que deveria fazer um login em minha aplicação, e se for isto, gostaria de dizer que isto não acontece na aplicação. O que ocorre é que estou passando uma aplicação que inicialmente foi feita em ASP para JSP e nela bastava o usuário estar logado na rede nt do windows para que o mesmo fosse pego pela aplicação através do comando: Set NT = CreateObject("WScript.NetWork")
Usuario = nt.username
E gostaria de fazer o mesmo em JSP. Agradeço se puderes me ajudar.
É soh pegar o web.xml q vc postou e alterar conforme as descriçoes Mamao-com-Açucar que o thingol postou. 
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
<!--
Esta é a DTD (Document Type Definition) para os deployments descriptors
da versão 2.3 da API Servlet. Os os deployments descriptors devem incluir
um DOCTYPE como abaixo:
-->
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<!--
A tag web-app é a raiz dos deployment descriptor para
as aplicações web. Nela, as tags devem obrigatoriamente
estar organizadas na seguinte ordem imposta pela DTD
inclusa acima:
web-app <(icon?, display-name?, description?, distributable?,
context-param*, filter*, filter-mapping*, listener*, servlet*,
servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?,
error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*,
login-config?, security-role*, env-entry*, ejb-ref*, ejb-local-ref*)>
Onde uma "?" indica que a tag pode aparecer 0 ou 1 vez
e o "*" indica 0 ou mais vezes.
-->
<!-- Descrições Gerais da sua aplicação -->
<!--
Define um nome a ser mostrado para a aplicação.
Não tem relação com o context-path, ou seja, essa
configuração não vai alterar a maneira como vc
acessa sua aplicação
-->
<display-name>Minha Aplicacao Web</display-name>
<!--
Descrição para a sua aplicação web.
-->
<description>
Esta eh a versão X.X de uma aplicacao web
que faz uso de servlet e jsp e serve para
automatizar coisa tal.
</description>
<!--
Parametro de inicializacao que serah utilizado
por toda a sua aplicacao. Valores definidos nessa
tag podem ser recuperados em um servlet ou uma jsp
pela chamada do seguinte metodo:
String param =
getServletContext().getInitParameter("name");
Onde "name" deve coincidir com o valor definido
na subtag <param-name>.
Vc pode definir qualquer numero de paramentros
de inicializacao que forem necessarios.
Inclusive zero.
-->
<context-param>
<!-- Nome do parametro de incializacao -->
<param-name>webmaster</param-name>
<!-- Valor do parametro -->
<param-value>[email removido]</param-value>
<description>
Endereco de email do adminstrador para quem questoes
e comentarios sobre a aplicacao devem ser enviados.
</description>
</context-param>
<!--
Definições para os servlets que fazem parte da
sua aplicação, incluindo parametros de inicializacao.
No Tomcat, vc pode tambem enviar requisicoes (requests)
para servlets não listados aqui da seguinte maneira:
[url]http://localhost:8080/{context-path}/servlet/{classname}[/url]
Entretanto, esse uso não é garantidamente portavel.
Isso tambem torna referencias relativas a recursos
usados por seu servlet mais complicadas. Então definir
todos os seus servlet é o mais recomendado.
Parametros de inicialização do servlet podem ser recuperados
em um servlet ou jsp da seguinte maneira:
String value =
getServletConfig().getInitParameter("nome");
Onde "nome" deve coincidir com o valor de <param-name>
para algum dos parametros.
Você pode definir qualquer quantidade de servlets incluindo
zero.
-->
<servlet>
<!--
Nome para o servlet. Essa tag é obrigatoria
quando se define um servlet
-->
<servlet-name>meuServlet</servlet-name>
<description>
Servlet usado para recupera algo em algum lugar.
</description>
<!--
Tag usada para indicar a classe (completamente qualificada)
que representa o servlet definido. Essa tag é obrigatoria
quando se define um servlet.
-->
<servlet-class>com.meu.pacote.ServletTal</servlet-class>
<!--
Lista de parametros de inicializacao referentes apenas
a esse servlet. Voce pode usar quantos <init-param>
quiser inclusive zero.
-->
<init-param>
<param-name>listOrders</param-name>
<param-value>com.mycompany.myactions.ListOrdersAction</param-value>
</init-param>
<!--
A tag load-on-startup indica que este servlet deve
ser carregado (loaded, ou seja, intanciado e ter seu
metodo init() chamado) quando a aplicação for iniciada.
O conteudo desse elemento deve ser um inteiro indicando
a ordem na qual os servlets serão carregados. Se o valor
um inteiro negativo, ou não é apresentado, o container
está livre para carregar o servlet a qualquer hora que
escolher. Se o valor é um inteiro positivo ou 0 (zero),
o container deve carregar e inicializar o servlet assim
que a aplicação é iniciada. O container deve garantir que
servlet marcados com inteiros MENORES devem ser carregados
ANTES de servlets marcados com inteiros com altos valores.
O Container pode escolher a ordem para carregar servlet
marcados com o mesmo valor em load-on-startup
-->
<load-on-startup>5</load-on-startup>
</servlet>
<!--
A tag <serlvet-mapping> define um mapeamento que é usado
pelo servlet container para traduzir um request URI para
um servlet em particular. Os exemplos abaixo corresponde
a descricao feita para o servlet acima (pelo uso da tag
<servlet>. Assim, o valor de servlet-name, para mapear
um determinado servlet, deve ser o mesmo usado para definir
o servlet como mostrado acima. Dessa forma, um request URI
como:
[url]http://localhost:8080/{contextpath}/meuServlet[/url]
Será mapeada para o servlet "meuSerlvet".
Voce pode definir qualquer numero de mapeamentos para
serlvets, incluindo zero. Tambem é permitido fazer mais
de um mapeamento para um mesmo servlet.
-->
<servlet-mapping>
<servlet-name>meuServlet</servlet-name>
<url-pattern>/meuServlet</url-pattern>
</servlet-mapping>
<!--
Define um timeout default para as sessions de sua
aplicacao, em minutos. A partir de um serlvet ou
JSP voce pode modificar manualmente o timeout para
uma session em particular usando dinamicamente os
metodos HttpSession.getMaxInactiveInterval() e
HttpSession.setMaxInactiveInterval(int interval).
-->
<session-config>
<!-- 30 minutos -->
<session-timeout>30</session-timeout>
</session-config>
<!--
Lista de arquivos que serao procurados quando
alguem acessar o diretorio virtual de sua aplicacao.
Os arquivos são listados em ordem de prioridade, de
modo que os primeiros serão procurados antes e, caso
não seja encontrado, o servlet container tentará
usar o proximo da lista.
-->
<init-param>
<param-name>jcifs.smb.client.domain</param-name>
<param-value>premium.com.br</param-value>
</init-param>
<init-param>
<param-name>jcifs.netbios.wins</param-name>
<param-value>192.168.0.2</param-value>
</init-param>
<welcome-file-list>
<welcome-file>default2.jsp</welcome-file>
</welcome-file-list>
</web-app>
String usuario = request.getRemoteUser();
Usando o jCifs.jar (que está no link que lhe passei acima) e modificando o seu web.xml, dá para você chamar request.getRemoteUser() e obter o usuário (como por exemplo “NYC-USERS\MIALLEN” no caso de você ter um domínio NYC-USERS o usuário logado MIALLEN.) Se o usuário não estiver logado (Windows 98 por exemplo, onde o usuário simplesmente teclou ESC para pular a tela de login) getRemoteUser deve retornar null.
E se eu tiver mais de um dominio??
como eu vou está passando esses parametros fora do web.xml?
Pessoal, e seu possuir uma aplicação gernérica, que rode na web … e não conheça os DOMINIOS ??? Tem como obter o login de rede ? assim como o dominio e o nome do usuário que está logado rede ? Ou se eu informar uma lista de DOMINIOS tem como obter essas informações ? com o JCIFS, pelo que entendi … vc tem q passar UM DOMINIO… tava procurando pra ver se achava algo … mas até agora nada!