首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

Java Web应用集成域用户登陆有关问题

2012-10-24 
Java Web应用集成域用户登陆问题最近在项目中遇到Java Web应用需要集成域用户登陆问题,初看很简单,分析一

Java Web应用集成域用户登陆问题
最近在项目中遇到Java Web应用需要集成域用户登陆问题,
初看很简单,分析一下要解决的问题还是很多的,特拿出来讨论,听听大家的思路
不知道是否有成熟的方案可以直接借鉴,最好是开源社区的东西。

补充业务需求:
已经通过域帐号登陆的用户在登陆Web应用时不需要验证直接进入系统,否则提示输入用户名和密码

我现在从以下几个问题考虑
问题1:
客户端如何获取域用户信息?
AtiveX, applet, js, flash都可以拿到当前登陆的用户,好像密码拿不到

问题2:
服务器用户如何验证?
LDAP验证是一种方式,或者Jaas的NTLoginModule,还未测试过

问题3:
用户信息如何同步
只需要单向同步,从域服务器同步过来,如果发现有新的登陆名则在系统中建立新用户

问题4:
如果应用服务器在外网而域控制器有什么解决方案?
(这种方案中客户端和域控制服务器必然在一个子网中)



try {UniAddress dc = UniAddress.getByName(DomainIP2);jcifs.smb.NtlmPasswordAuthentication auth = new jcifs.smb.NtlmPasswordAuthentication(DomainIP2, userId, password);// jcifs.smb.SmbSession.getChallengeForDomain().jcifs.smb.SmbSession.logon(dc, auth);} catch (jcifs.smb.SmbAuthException e) {url = "domainlogin.jsp";msg = e.toString();// request.setAttribute("errMsg", "密码或用户名错误");// request.getRequestDispatcher(url).forward(request, response);// json="{result:0}";return 0;} catch (jcifs.smb.SmbException e) {// ip2 无法访问, 转 ip1 ... }String auth = request.getHeader("Authorization");if (auth == null){ response.setStatus(response.SC_UNAUTHORIZED); response.setHeader("WWW-Authenticate", "NTLM"); response.flushBuffer(); return;}if (auth.startsWith("NTLM ")){ byte[] msg = new sun.misc.BASE64Decoder().decodeBuffer(auth.substring(5)); int off = 0, length, offset; if (msg[8] == 1) { byte z = 0; byte[] msg1 = {(byte)'N', (byte)'T', (byte)'L', (byte)'M', (byte)'S', (byte)'S', (byte)'P', z,(byte)2, z, z, z, z, z, z, z,(byte)40, z, z, z, (byte)1, (byte)130, z, z,z, (byte)2, (byte)2, (byte)2, z, z, z, z, z, z, z, z, z, z, z, z}; response.setHeader("WWW-Authenticate", "NTLM " + new sun.misc.BASE64Encoder().encodeBuffer(msg1)); response.sendError(response.SC_UNAUTHORIZED); return; } else if (msg[8] == 3) { off = 30; length = msg[off+17]*256 + msg[off+16]; offset = msg[off+19]*256 + msg[off+18]; String remoteHost = new String(msg, offset, length); length = msg[off+1]*256 + msg[off]; offset = msg[off+3]*256 + msg[off+2]; String domain = new String(msg, offset, length); length = msg[off+9]*256 + msg[off+8]; offset = msg[off+11]*256 + msg[off+10]; String username = new String(msg, offset, length); out.println("Username:"+username+"<BR>"); out.println("RemoteHost:"+remoteHost+"<BR>"); out.println("Domain:"+domain+"<BR>"); }} 14 楼 infante_yin 2009-09-22   楼主,可以共享你的解决方法吗?目前我做的集成,采用CAS做单点登录,传过去的也就一个UserName,子系统还是要根据UserName重新加载用户信息..... 15 楼 san586 2009-11-14   JAAS com.sun.security.auth.module.NTLoginModule 这个类可以解决你的问题

热点排行