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