Java drama (part 2)
Ois. Os dramas não me largam...ou se calhar não são dramas, eu é que ando particularmente melodramático com esta história toda porque, tal como o disse, estou fartinho do Java. Deveras...!! Chego a pensar em estupidezes só para desanuviar... Hoje uma simples frase dita por alguém no departamento despertou em mim uma súbita vontade de aprofundar o meu interesse pela filosofia...porque estava farto do Java. "Faz o que quiseres!!" . Hmmmm...é interessante porque, se fizermos o que nos apetece estamos a fazer a vontade à outra pessoa...No entanto, se não fizermos o que queremos, estamos a tomar a liberdade de a contrariar, fazendo o que nos dá na gana...portanto mais uma vez estamos a ceder à vontade dessa pessoa. Confesso que a reflexão sobre este tema me deu uma enorme cólica. Mas não era sobre isto que eu queria blogar. Hoje resolvi mais um Java drama...inútil. O objectivo era fazer com que a aplicação (que está a correr no JBoss, que por sua vez usa o Tomcat como webserver) suportasse NTLM Authentication. Basicamente, caso um user (logado num determinado NT Domain) fizesse um http request à aplicação, não seriam pedidas quaisquer credenciais. Ora, isto é tudo muito bonito quando se usa o IIS + m$ technologies (ASP, ou whatever...). Em Java começou por se revelar uma PITA até ter descoberto o jCIFS. O jCIFS não é mais do que uma biblioteca que suporta o protocolo SMB/CIFS e é 100% Java. Lindo, ahm? Poderão estar a perguntar-se "Mas porque é que esta besta não se limita a ver o resultado retornado ao invocarmos o método getRemoteUser() ao objecto request (HttpServletRequest) ? ". Pois...porque sem esta treta, será sempre null. Então, a solução passa por ir ao ficheiro web.xml da nossa aplicação, adicionar lá um pequeno filtro, adicionar o jcifs-versiongoeshere.jar à classpath do nosso projecto e voilá! O filtro é algo deste género:
<filter> <filter-name>NtlmHttpFilter</filter-name> <filter-class>jcifs.http.NtlmHttpFilter</filter-class> <init-param> <param-name>jcifs.netbios.wins</param-name> <param-value>10.169.10.77,10.169.10.66</param-value> </init-param> <init-param> <param-name>jcifs.smb.client.domain</param-name> <param-value>NYC-USERS</param-value> </init-param> <init-param> <param-name>jcifs.smb.client.username</param-name> <param-value>somenycuser</param-value> </init-param> <init-param> <param-name>jcifs.smb.client.password</param-name> <param-value>AReallyLoooongRandomPassword</param-value> </init-param> </filter> <filter-mapping> <filter-name>NtlmHttpFilter</filter-name> <url-pattern>/*</url-pattern>
</filter-mapping>
Podem omitir os parametros "username" e"password". Ora, caso o request venha de uma máquina que esteja logada no domínio que consta no filtro, o HttpServletRequest já contém informação necessária para ser processada, mais precisamente informação correspondente à nossa continha do Windows. Lindo!! Adeus.
Epá, eu só tenho a dizer: bem-vindo ao mundo real! :|