`
bobo
  • 浏览: 87197 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

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

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

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

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

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

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



分享到:
评论
15 楼 san586 2009-11-14  
JAAS com.sun.security.auth.module.NTLoginModule 这个类可以解决你的问题
14 楼 infante_yin 2009-09-22  
楼主,可以共享你的解决方法吗?目前我做的集成,采用CAS做单点登录,传过去的也就一个UserName,子系统还是要根据UserName重新加载用户信息.....
13 楼 bobo 2009-07-31  
项目环境有点复杂,在外网的web应用要集成局域网内的window验证,和单纯的SSO还是有点差别。


12 楼 KimShen 2009-07-31  
谢谢LZ和各位的贡献,此方法验证可行.
基础的NT登陆完全没有问题.
如果方便的话能不能共享下jcifs文档?官网的例子不知所云
11 楼 grandboy 2009-07-30  
如果要做sso,可不只是拿到用户名那么简单。拿到用户名和密码摘要有多种方法,但是想和操作系统集成,好像只有一种方法。
10 楼 shenjianwangyi 2009-07-30  
楼主要的功能就是sso 哇哈哈 建议去看看吧
9 楼 lcllcl987 2009-07-30  
传说有个东西叫sso
8 楼 luocolor 2009-07-28  
不明白的是,lz的应用不是sso擅长的么?
7 楼 bobo 2009-07-27  
谢谢prosong提供帮助找到Java验证NTLM的代码
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>");
  }
}
6 楼 bobo 2009-07-27  
考虑比较理想的方案

本地ntml(如kerboros方式)认证通过将认证结果传给服务器,这样避免无法拿到密码以及应用服务器可能无法访问局域网内的域控制服务器等问题
5 楼 bobo 2009-07-27  
谢谢xieke的帮助,jcifs实现了服务器端通过Java来调用NTDomain验证

“已经通过域帐号登陆的用户在登陆Web应用时不需要验证直接进入系统,否则提示输入用户名和密码”,可以解决输入用户名和密码后通过NTDomain验证,但是如何让已经登陆的用户不用输入用户名和密码就完成验证呢?
4 楼 xieke 2009-07-27  
		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
 ...
 }


3 楼 bobo 2009-07-25  
通过IE可以实现功能,但是遇到activex的权限问题,还得另外找路

2 楼 bobo 2009-07-24  
找到一个IE only的方案,用Javascript在本地判断是否为登陆域的用户以及是否特定域服务器,是则直接用该用户进入系统
1 楼 bobo 2009-07-23  
问题1找到NTLM做身份验证,但只IE支持,还未做测试
问题2找到开源产品JCIFS做单点登陆,计划移植到cas中去

相关推荐

    java连接AD进行用户登陆

    综上所述,使用 Java 实现与 Active Directory 的连接及用户登录验证不仅是一项实用的技术,也是现代企业级应用程序中不可或缺的一部分。通过对关键概念的理解和具体实现细节的掌握,开发者可以更好地利用这项技术来...

    基于JAVA的WEB应用开发实训教程

    在本《基于JAVA的WEB应用开发实训教程》中,我们将深入探讨如何利用Java技术进行Web应用程序的开发。JavaWeb是Java技术在Web领域的应用,它包括了Servlet、JSP(JavaServer Pages)、JSTL(JavaServer Pages ...

    java web 开发实战宝典源代码

    Java Web开发是构建基于互联网应用程序的关键技术,...通过深入研究这些源代码,你可以更好地理解Java Web开发的全貌,学习到如何组织代码、如何处理用户请求、如何与数据库交互,以及如何构建高效、可维护的Web应用。

    Weblogic 8.1 + MyEclipse的配置及其Java Web应用的部署和测试.doc

    5. **部署Java Web应用**:在MyEclipse中,你可以创建一个新的动态Web项目。包含Servlet、JSP、JavaBean等组件。完成编码后,右键点击项目,选择`Export` -&gt; `Web` -&gt; `WAR file`,将项目打包成WAR文件。 6. **将...

    深入体验Java Web开发内幕

    6.7 获取请求消息的实体内容  6.8 利用请求域属性传递信息  6.9 请求参数的中文读取问题  6.10 思考与实践 第7章 会话与状态管理  7.1 Web应用中的会话与会话状态  7.2 Cookie  7.3 在...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    1.4.1 Web应用服务工作原理 1.4.2 web应用服务器汇总 1.4.3 获取Tomcat 1.4.4 熟悉Tomcat的五脏六腑 1.5 JavaWeb开发利器之Eclipse 1.5.1 获取Eciipse 1.5.2 运行Eclipse 1.5.3 打造中文版Eclipse 1.6 做好项日开发...

    cas集成AD域

    4. **配置SSO集成**:修改CAS服务器的Web应用配置,以接受AD验证的票据。在客户端应用中,需要配置CAS客户端库,以处理CAS的登录流程,包括重定向用户到CAS服务器进行登录,以及解析返回的票据。 5. **测试和调试**...

    《Java.Web开发详解》的源代码

    在Web应用中,Session对象用于在多个相关请求之间保持用户状态。源代码可能包含如何创建和使用JavaBean,以及如何在Session中存储和检索数据的实例。 5. **过滤器与监听器**:Filter和Listener是Java Web的重要组成...

    Java Web开发常用的API_chm

    它简化了用户界面的开发,并与CDI、EJB等其他Java EE技术无缝集成。 6. **JPA (Java Persistence API)**: 用于对象关系映射,如`javax.persistence.EntityManager`和`javax.persistence.Query`,JPA允许开发者将...

    Java Web系列课程教学网站

    6. **监听器(Listener)**:监听器是实现特定Servlet接口的Java类,它们在特定事件发生时被调用,例如用户的登录/登出、session的创建/销毁等,用于扩展Web应用的功能。 7. **MVC(Model-View-Controller)设计...

    AD域单点登陆NTLM

    下面我们将详细探讨如何在Java环境中利用NTLM协议集成AD域进行登录,并了解相关文件的作用。 首先,让我们理解NTLM协议。NTLM是基于挑战-响应机制的身份验证协议,它不依赖于开放的密钥基础设施,而是依靠服务器和...

    JAVA与TUXEDO环境集成.pdf

    TUXEDO是一个成熟的分布式应用中间件,常用于大型主机系统,而Java作为广泛应用的编程语言,广泛应用于Web应用程序。将这两者集成,可以充分利用TUXEDO的高性能和Java的跨平台特性,满足企业级系统的扩展性和稳定性...

    一个用Java开发的Web邮局

    这个Java开发的Web邮局项目展示了Java EE技术在构建复杂Web应用方面的强大能力,同时也体现了Web开发中的最佳实践,包括模块化设计、面向对象编程、以及对用户体验的关注。通过深入理解这些知识点,开发者可以构建出...

    Java开发的Web邮局.

    Java开发的Web邮局是一种基于Web的电子邮件服务系统,它允许用户通过Web浏览器与POP(Post Office Protocol)和SMTP(Simple Mail Transfer Protocol)服务器交互,处理邮件收发事务。这样的设计使得用户无需安装...

    Java Web开发实例大全.提高卷

    7. **JTA(Java Transaction API)**:介绍分布式事务处理,理解事务的ACID特性,并学习如何在Java Web应用中管理事务。 8. **EJB(Enterprise JavaBeans)**:虽然现代Web开发更多倾向于轻量级框架,但EJB作为传统...

    java+web自定义标签的开发与应用源码整理

    Java Web自定义标签是Java Servlet和JSP技术中的一项重要特性,它允许开发者创建可重用的、封装的UI组件,...通过深入学习和实践,你将能够更好地理解和运用这一强大的功能,打造出更加高效、易维护的Java Web应用。

    Java Tutorial: Creating Web Services

    为了向 Web 用户提供动态内容,随着通用网关接口(Common Gateway Interface,CGI)的引入,实现了两层架构的 Web 应用程序。CGI 脚本可以从外部数据资源(如数据库)检索内容,并将结果返回给 Web 服务器,服务器再...

    域登陆(通过jcifs.http.NtlmHttpFilter实现)

    标题中的“域登陆(通过jcifs.http.NtlmHttpFilter实现)”是指在Java环境中,使用jcifs库的一个组件NtlmHttpFilter来处理Windows域的身份验证。jcifs是一个开源库,它提供了对SMB(Server Message Block)协议的支持...

    java应用系统单点登录

    Java 应用系统中的单点登录(Single Sign-On,简称SSO)是一种用户身份验证机制,允许用户在多个相互关联的应用系统中只需登录一次,即可访问所有系统,无需再次进行身份验证。这种技术大大提升了用户体验,同时减少...

Global site tag (gtag.js) - Google Analytics