Pegando o login do usuario no windows e passando para outra aplicação

19 respostas
E

Boa tarde a todos meus caros amigos, eu estou precisando fazer uma aplicação que é o seguinte: Pegar o usuario logado pelo windows, e quando a pessoa abrir o site, já tem seus dados no sistema, sem ela precisar logar dentro do sistema. Com isso, vi que posso fazer um applet usando um comando:

String usuario = System.getProperty("user.name");

Tudo bem, Dae posso fazer assinatura e talz beleza.

Só tenho uma dúvida, tem como eu passar os paramentros da applet para um arquivo PHP ? Alguém saberia me dizer ? Além de um html, utilizando a TAG , que tipo de arquivos eu posso utiliza-lo ?

19 Respostas

T

Se eu bem entendi, você quer fazer um esquema de autenticação usando o usuário do SO, é isso? bom com o System.getProperty(“user.name”) você tem o nome do usuário logado, nunca mexi com PHP mas como é web, até por post você passa o parâmetro se quiser, no entanto, se você quer fazer o que disse que entendi, dê uma olhada em LDAP, o spring framework tem soluções para isso: http://www.springsource.org/ldap

J

LDAP na cabeça. O detalhe que eu não sei como o PHP se comporta com LDAP, mas se tratando de Java, o procedimento não é tão complicado.

E

Massa. Vou da uma pesquisada agora a noite, mas antes só para lembrar, se eu não me engano, corrijam me se eu estiver errado, LDAP, é acessar ao Active Directory, e nesse meu caso específico eu não vou precisar. Apenas quero pegar o usuário logado pelo windows, e ir em um banco de dados e fazer um select, e depois puxar as informações deles. Me parece que , o complicado é pessar para o php, não sei se é realmente. Vou tentar fazer isso agora a noite. O que eu obtiver de sucesso ou não, eu passo pra vocês. Agradeço a ajuda. Abraços

T

quanto ao Ldap = http://pt.wikipedia.org/wiki/Ldap, mas concordo que para usar da maneira que voce quer pode ser um tiro de canhao para matar uma mosca, mas se puder de uma olhada mesmo assim, e muito interessante, ate mesmo para que voce entenda que o ldap e usado para acessar o ad mas tambem nao so para isso.
Quanto a passar dados para o PHP, como te disse a cima, nao conheço PHP, mas de uma olhada em restful = http://pt.wikipedia.org/wiki/RESTful para isso, deve resolver de maneira bem simples seu problema.

E

To entendendo. Da uma olhada nisso moçada.

eu criei meu applet e assinei conforme o tutorial a seguir: http://insonix.blogspot.com.

dae eu fiz.

esse é o meu applet:

import java.applet.Applet;

public class AppletTeste extends Applet {

    private String xmlPath;

    @Override
    public void init() {
	String usuario = System.getProperty("user.name");
	String usuarioHome = System.getProperty("user.home");

	System.out.println("Usuario Home " + usuarioHome);
	System.out.println("Usuario " + usuario);

    }

    public String getUsuario() {
	String usuario = System.getProperty("user.name");
	return usuario;
    }
}

… esse é o meu html:

<html>
<head>
<title>Login User</title>
</head>
<body>
<APPLET CODE="AppletTeste.class" archive="AppletTeste.jar" WIDTH=300 HEIGHT=250>
</APPLET> 

</body>
</html>

e qndo eu tento utilizar, acontece o seguinte erro:

java.security.AccessControlException: access denied (java.util.PropertyPermission user.name read)  
     at java.security.AccessControlContext.checkPermission(Unknown Source)  
     at java.security.AccessController.checkPermission(Unknown Source)  
     at java.lang.SecurityManager.checkPermission(Unknown Source)  
     at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)  
     at java.lang.System.getProperty(Unknown Source)  
     at AppletTeste.init(AppletTeste.java:9)  
     at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)  
     at java.lang.Thread.run(Unknown Source)  
 Exception: java.security.AccessControlException: access denied (java.util.PropertyPermission user.name read)

Alguem saberia me dizer o porquê ?

T

um applet tem restrições de acesso, mesmo rodando na máquina local, dá para alterar isso, mas daí, todo mundo que for usar o sistema teria que alterar isso e não é nada simples, nem um pouco seguro e totalmente desendicado. Nunca precisei fazer nada assim, mas deve dar para pegar o nome do usuário pelo browser, é assim que os proxys funcionam. Achei esse link, mas não sei se funciona, dá uma olhada ai:

mas, voltando ao que ja disse, usando LDAP voce poderia exigir uma autenticação… me parece a melhor alternativa.

E

Parece que funcionou, mas ae será que isso vai funcionar na minha idéia ? Terei vários usuarios acessando ao mesmo tempo. E eu preciso entender esse código, ele ta mo coisa.

E

É, me parece que funciona, mas só para o I.E. No Firefox não funciona. :frowning:

T

eu testei aqui, e funcionou tanto no IE quanto no FireFox, só que no Firefox, ele parece não ter ligação com o windows enquanto o IE tem…

E

pois no firefox, ele pede autenticação, dessa autenticação é que ele pega o usuário. Isso não é viavel para mim. =( . Mas eu consegui fazer um applet assinado, e deu certo. Mas tem 1 problema, para todos os clientes eu terei que assinar o applet não é ? E para todos os clientes, eu terei que modificar a permissão java.policy … existe algum outro meio melhor ?

I

Ele também pega o usuário logoda em uma rede com domínio?

T

pega o usuario logado na maquina seja local ou na rede.

E

Ae, meu applet estava resolvendo tudo normal, tava funcionando beleza. Depois de eu mexer muito, agora ta dando esse erro:

Exception in thread "main" java.lang.NoClassDefFoundError: sun/security/tools/Ja
rSigner
Caused by: java.lang.ClassNotFoundException: sun.security.tools.JarSigner
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: sun.security.tools.JarSigner.  Program will exit.

q p**** é essa ?

tava todo configurando, tava funfando beelza, eu tava testando…

ae dpois… qndo fui tentar de novo… diz isso … como é q pode ? … fooodaaa !!

… alguem pra ajudar ??? … pls !!

I

Na rede com domínio aqui está aparecendo como usuário o SYSTEM, não está pegando, agora na máquina sem domínio está pegando o usuário do Windows.
Alguém sabe como eu pegar o usuário da rede com domínio?

E

Eu estou em uma rede com domínio, e pega meu usuário normal !

E

O problema está resolvido pessoal. Aqui está minha applet

import java.applet.Applet;

import javax.swing.JTextField;

public class AppletTeste extends Applet {

    private String xmlPath;

    @Override
    public void init() {
	String usuario = System.getProperty("user.name");
	String usuarioHome = System.getProperty("user.home");

	JTextField campoTexto = new JTextField("[" + usuario + "] - [" + usuarioHome + "]");
	this.add(campoTexto);
	setSize(640, 480);
	setVisible(true);
    }

}

aqui está meu html

<html>

<head>

<title>Login User</title>

</head>

<body>

<APPLET CODE="AppletTeste.class" WIDTH=300 HEIGHT=250 archive="AppletTeste.jar">

</APPLET>



</body>

</html>

Porém, tem 1 problema. como eu vou pegar a string do usuário ? Se ele está jogando a partir de um JText ?

T

eu já falei disso nuns 4 posts a cima, o Jair Rillo Junior concordou assim como muitos te indicariam… LDAP.

E

LDAP é acesso a Active Directory, eu não vou poder acessa-lo. Não posso fazer por LDAP.

F

Estava com o mesmo dilema aqui e resolvi de uma maneira que ficou muito boa.

Meus problemas com isso:

Problema 1: Applets dependem de configuração local de brownser, versão de jre, configurações de permissionamento de acesso e por aí vai, ainda mais quando a necessidade de acesso é relativa a propriedades restritas do SO.

Problema 2: Como obter isso sem usar applet ?

Problema 3: Obtido, como permissionar os acessos dentro da aplicação ?

Bom, a partir do código do link postado aqui neste tópico - http://www.rgagnon.com/javadetails/java-0441.html -, fiz um servlet para obter o login de rede. Já que já está logado na rede, não preciso mais pedir senha, menos 1 problema.

Para acesso às funcionalidades do sistema, cadastrei o permissionamento interno do usuário, passo para o sistema o usuário e “shazam!” abre o sistema sem necessidade de login.

No cadastro deste usuário tenho um flag que diz se ele é de rede ou não e se o login deste é automático, para que possa dar acesso ao sistema a outro tipo de usuários (fora de rede, administrador, etc)

Para obter mais informações do usuário na rede, como displayname, memberof, email, etc, criei no AD da empresa uma conta de serviço, esta fica configurada no server.xml de maneira fixa, e só serve para leitura. Com essa conta faço minhas pesquisas e trago os dados adicionais do usuário de rede logado, mole-mole… Me dando ao luxo de vincular grupos do AD (LDAP) com permissionamento destes grupos dentro do sistema, quando necessário, como informações restritas a diretores ou membros de grupos de auditoria e outros. Neste caso, tomei como base para meu código, outro post aqui do guj - http://www.guj.com.br/posts/list/125807.java - e no filtro coloco (&(objectClass=user)(anr=)).

Ficou uma solução muito bacana, elegante e bem funcional. Espero que te ajude ou a qualquer outro que precise disto no futuro.

Abs.

Criado 14 de julho de 2009
Ultima resposta 24 de jul. de 2009
Respostas 19
Participantes 5