JAAS ( Java Authentication and Authorization Service ) 在 JDK 1.4 正式加入 Java 标准的 Security 模块, 简单来说, JAAS 就是让我们把身份验证与权限管控使用标准的方法来开发, 由于大家对 JAAS 的陌生度非常的高, 也不太了解 Application Server 的安全性架构, 所以这一部分往往会被忽略 ..
这期先介绍有关 Authentication 的部分, JAAS 提供了 PAM ( Pluggable Authentication Module ) 的模块, 可 以通过标准的 API 建立属于自己的 LoginModule, 根据 stackable 原理, 进而相关相关的身份验证程序, 达到 SSO ( Single Sign-On ) 的 目的.
SECTION 02 JAAS 中几个比较常见的 classes
本节详细解说请参考
http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASRefGuide.html 普通对象
- Subject
- Principals
- Credentials
身份验证相关的对象
- LoginContext
- LoginModule
- CallbackHandler
- Callback
权限管控相关的对象
- Policy
- AuthPermission
- PrivateCredentialPermission
SECTION 03 Tagish.net 的 LoginModules
现在地点
http://free.tagish.net/jaas/ 最新版本 1.0.3
目前 tagish.net 提供了几种 LoginModules, 包含了
- com.tagish.auth.DBLogin
- com.tagish.auth.FileLogin
- com.tagish.auth.win32.NTSystemLogin
一般人大多比较熟悉数据库操作, 首先先建立一个 login.config, 內容为
JAASLogin
{
com.tagish.auth.DBLogin required
dbDriver="sun.jdbc.odbc.JdbcOdbcDriver" dbURL="jdbc:odbc:DBLogin";
};
将 Principal 设置为 com.tagish.auth.TypedPrincipal ( 如果是 NTSystemLogin 则设置为 com.tagish.auth.win32.NTPrincipal ). 接着, 你的数据库需要一些表,
分别在数据库內设置完成. 当你启动你的程序的时候, 你需要在 classpath 中设置相关的 JDBC Driver, 让 SecurityManager 参考 login.config, 去调用 DBLogin api, 取得合法或不合法的状态.
SECTION 04 关于 PAM stack
Login2 {
sample.SampleLoginModule required;
com.sun.security.auth.module.NTLoginModule sufficient;
com.foo.SmartCard requisite debug=true;
com.foo.Kerberos optional debug=true;
};
假如我们用 Login2 的这种登陆stack, 可以设置 required, sufficient, requisite, optional 四种状态.
- required : 验证必须成功, 但是不论成功或失败都继续执行下面的登陆模块, 执行所有之后才丟出验证失败.
- requisite : 验证必须成功, 但是失败就马上回去不做其他验证, 必须成功才继续执行下面的登陆模块.
- sufficient : 验证可以不要成功, 但是成功了就马上回去不做其他验证, 失败可以继续执行其他的登陆模块.
- optional : 验证可以不要成功, 但是不论成功或失败都继续执行下面的登陆模块.
所以, Login2 的登陆, 首先我们会先使用 sample.SampleLoginModule 来验证,
不论成功或失败都会执行 com.sun.security.auth.module.NTLoginModule,
如果 NTLoginModule 验证成功, 因为是 sufficient, 系统就认定这个人是合法的使用者,
当 NTLoginModule 验证失败, 就会进行 com.foo.SmartCard 的验证,
如果 SmartCard 验证失败, 就直接宣告你不是合法的使用者,
如果 SmartCard 验证成功, 就继续到 Kerberos 的验证模块,
因为 Kerberos 是属于 optional, 所以根本对身份验证的结果没有影响.
Login2 验证的各种状况列表 |
SampleLoginModule |
required |
pass |
pass |
pass |
pass |
fail |
fail |
fail |
fail |
NTLoginModule |
sufficient |
pass |
fail |
fail |
fail |
pass |
fail |
fail |
fail |
SmartCard |
requisite |
* |
pass |
pass |
fail |
* |
pass |
pass |
fail |
Kerberos |
optional |
* |
pass |
fail |
* |
* |
pass |
fail |
* |
Overall Authentication |
pass |
pass |
pass |
fail |
fail |
fail |
fail |
fail |
* = 不会被执行. 直接回应验证成或失败
SECTION 05 套用 Tomcat 4/5 的 JAASRealm
建立 login.config 放到 $CATALINA_HOME/conf/ 之中, 范例采用 MS SQLServer, jTds.sf.net 的 jdbc driver
JAASLoginModule
{
com.tagish.auth.DBLogin required dbDriver="net.sourceforge.jtds.jdbc.Driver"
dbURL="jdbc:jtds:sqlserver://localhost:1433/JAASDB"
dbUser="sa"
dbPassword="sa_password"
userTable="Users"
roleTable="Roles"
roleMapTable="RoleMap";
};
在 tomcat 启动脚本中加入
JAVA_OPTS=-Djava.security.auth.login.config==C:\tomcat4\conf\login.config 并且修改 server.xml, 让 appName 去对应 login.config 中的 JAASLoginModule, 以及设置 User/Group 相关的 Principal
<Realm className="org.apache.catalina.realm.JAASRealm"
appName="JAASLoginModule"
userClassNames="com.tagish.auth.TypedPrincipal"
roleClassNames="com.tagish.auth.TypedPrincipal"
debug="99"/>
最后设置 web.xml 中的 login-config 以及要保护的数据, 例如
<security-constraint>
<web-resource-collection>
<web-resource-name>User Protected</web-resource-name>
<url-pattern>/protected/*</url-pattern>
<url-pattern>/protected.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>MyJAASRealm</realm-name>
</login-config>
SECTION 06 结论
JAAS 除了在一般 Desktop Application 应用之外, 对 J2EE 支持将会是一个主流, 无论是
JSR 196: Java Authentication Service Provider Interface for Containers 还 是
JSR 115: Java Authorization Contract for Containers ( 已经纳入 J2EE 1.4 之中 ) 都是对 container 提供者要求标准的 provider 界面, 因此, 将来开发相关的程序最好能够遵循 JAAS, 在异构平台的整合 上, 才能具备完整的相容性.
posted on 2005-08-17 15:48
my java 阅读(540)
评论(0) 编辑 收藏 所属分类:
java身份认证转帖