Java Web应用需要集成域用户登陆问题
需求是这样的:
已经通过域帐号登陆的用户在登陆Web应用时,系统先会检验此用户所加入的域是不是跟Web系统中设置的系统参数“域名称”是否相同,如何相同就验证此用户名在web应用系统中是否存在,如何此用户名在web系统用户中存在,就直接登录到此用户的相应的业务首页,如何哪一个验证失败就直接返回Web系统的登录首页,输入用户名和密码验证;
【补充1:此系统都是在内网内使用,因为是业务系统,对信息的安全很高,所用才这样要求;
【补充2:现在不知道的具体问题就是不知道如何获得客户端用户所加入的域的名称】 上面就是需求了,我初次解决的方案是通过 JS ActiveXObject对象获得域名称和域用户名,可它会被IE 安全设置拦截,这样对用户的体检大大折扣,用户也很不满意,本人能力确实有现,努力了一天也没有结果,不过有如下几种思考方式:
1,如何去略过IE安全验证;(解决:此方法需要修改注册表,类似于黑客的手法,此方法被拒绝)
2,不知道能否通过jsp中什么方法可以获得此用户所加入的域的名称;(本人google了,也没有找到方案)
3,用第三方java类库能不能解决;(本人google了,好多都是类似与单点登录的,对于上面的需求好像也不太适合)
4,想到过也其他语言写一个小控件获得此用户所加入的域的名称,但经理不同意,本项目是比较大的系统而且纯java开发,不想有其他语言掺和;上面是我刚开始想解决问题的思路,但现在还是没有找到具体的方法,我在google了也有很多通知有过这样的问题,但没有任有具体的解决方案,在此希望各位大侠有类似的经验的勇敢出来共享一下,非常感谢,由于只有今天一天的时间了,我会一直在线等.......希望好心人事能参与进来......谢谢了......
需求是这样的:
已经通过域帐号登陆的用户在登陆Web应用时,系统先会检验此用户所加入的域是不是跟Web系统中设置的系统参数“域名称”是否相同,如何相同就验证此用户名在web应用系统中是否存在,如何此用户名在web系统用户中存在,就直接登录到此用户的相应的业务首页,如何哪一个验证失败就直接返回Web系统的登录首页,输入用户名和密码验证;
【补充1:此系统都是在内网内使用,因为是业务系统,对信息的安全很高,所用才这样要求;
【补充2:现在不知道的具体问题就是不知道如何获得客户端用户所加入的域的名称】 上面就是需求了,我初次解决的方案是通过 JS ActiveXObject对象获得域名称和域用户名,可它会被IE 安全设置拦截,这样对用户的体检大大折扣,用户也很不满意,本人能力确实有现,努力了一天也没有结果,不过有如下几种思考方式:
1,如何去略过IE安全验证;(解决:此方法需要修改注册表,类似于黑客的手法,此方法被拒绝)
2,不知道能否通过jsp中什么方法可以获得此用户所加入的域的名称;(本人google了,也没有找到方案)
3,用第三方java类库能不能解决;(本人google了,好多都是类似与单点登录的,对于上面的需求好像也不太适合)
4,想到过也其他语言写一个小控件获得此用户所加入的域的名称,但经理不同意,本项目是比较大的系统而且纯java开发,不想有其他语言掺和;上面是我刚开始想解决问题的思路,但现在还是没有找到具体的方法,我在google了也有很多通知有过这样的问题,但没有任有具体的解决方案,在此希望各位大侠有类似的经验的勇敢出来共享一下,非常感谢,由于只有今天一天的时间了,我会一直在线等.......希望好心人事能参与进来......谢谢了......
<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>sc</param-value>
</init-param>
<init-param>
<param-name>jcifs.http.domainController</param-name>
<param-value>172.16.1.236</param-value>
</init-param>
<init-param>
<param-name>jcifs.util.loglevel </param-name>
<param-value>0</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>NtlmHttpFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-name>NtlmHttpFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这个过滤器要放到应用程序过滤器的前面
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>");
}
}