前言

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

也可以到下面地址下载:

https://skydrive.live.com/redir?resid=5B4EDBCD9EF1AB6B!189&authkey=!AJQZjxtiRSPJ0_c&ithint=file%2c.zip

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

3.  修改web.xml

<filter>
      <filter-name>NtlmHttpFilter</filter-name>
      <filter-class>jcifs.http.NtlmHttpFilter</filter-class>	
	    <init-param>
	       <param-name>jcifs.http.domainController</param-name>
	        <param-value>ADHost</param-value>
	    </init-param>
	    <init-param>
	        <param-name>jcifs.smb.client.username</param-name>
	        <param-value>user</param-value>
	    </init-param>
	    <init-param>
	        <param-name>jcifs.smb.client.password</param-name>
	        <param-value>password</param-value>
	    </init-param>
	
	    <init-param>
	        <param-name>jcifs.util.loglevel</param-name>
	        <param-value>2</param-value>
	    </init-param>
   </filter>
	
   <filter-mapping>
        <filter-name>NtlmHttpFilter</filter-name>
        <url-pattern>/*</url-pattern>
   </filter-mapping>



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)浏览器,重新打开就可以了。