Java Web 项目SSO实战

2014-11-24 02:50:17 · 作者: · 浏览: 0

前言

SSO 是什么应该就不用多说了- 单点登录。

现在有一个不大的web 项目, 使用域帐号来控制权限。 对应的功能就很简单。

在某台机器上使用浏览器访问,

如果这台机器是域帐号登录的,则直接进入页面;

如果不是使用域帐号登录的, 则使用用户名, 密码登录。


解法一: 比对帐号登录

这种解法不推荐使用, 但是本系统之前使用这种方式来解决的, 所以也提一下。

这种解法的思想是:

1. 系统有一套用户信息的表(用户名, 域帐号名, 密码)

2. 获取客户端登录机器的域用户名。

3. 比对域用户名是否存在系统的用户信息表中,如果存在则登录系统。


关于如何能获取到客户端登录机器的域用户名,可以参考:

java web 项目如何获取客户端机器信息

applet 可以获取登录的域用户, 但是使用applet 略显复杂。

使用NTLM 的方式的方式也可以获取, 但是如果是firefox 的话, 会弹出输入域帐号用户名,密码的对话框。但是这里如果输入其他人的帐号的话, 就存在很严重的安全问题的。

要使用对比帐号的方式,就不能让以用户输入帐号的方式, 因为这个压根就不会验证域帐号的密码。


解法二:jcifs 验证

要有较高的安全性, 就要真正的却验证域帐号、密码是否正确。

jcifs 这个开源包就可以实现。

1. 下载 jcifs

到 http://jcifs.samba.org/src/ 下载最新的jar 档, 目前的最新版是 jcifs-1.3.17.jar

2. 把 jar 档拷入项目的web-inf/lib 目录中

3. 修改web.xml

   
  
      
   
    NtlmHttpFilter
   
      
   
    jcifs.http.NtlmHttpFilter
   	
	    
    
    
     jcifs.http.domainController
     
    
     ADHost
     
   
	    
    
    
     jcifs.smb.client.username
     
    
     user
     
   
	    
    
    
     jcifs.smb.client.password
     
    
     password
     
   
	
	    
    
    
     jcifs.util.loglevel
     
    
     2
     
   
   
  
	
   
  
        
   
    NtlmHttpFilter
   
        
   
    /*
   
   
  

filter 是什么也不多说了。

jcifs.http.domainController -- 配置域的服务器

jcifs.smb.client.username - 查看域服务器的用户名

jcifs.smb.client.password- 查看域服务器的密码


其他

如果是使用域帐号登录客户端机器的话,

使用IE, Chrome 不会弹出输入域帐号,密码的对话框, 因为它会把这些信息自动传到服务端。

但是使用firefox 的话, 始终弹出输入域帐号,密码的对话框, 可以使用如下方式设置不弹出对话框。

1.在火狐(Firefox)地址栏中输入:about:config
2.然后在过滤器中输入:NTLM
3.双击network.automatic-ntlm-auth.trusted-uris,
4.在输入值中输入 localhost (根据实际状况设置)
5.然后关闭火狐(Firefox)浏览器,重新打开就可以了。