posts - 23,comments - 12,trackbacks - 0
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 阅读(529) 评论(0)  编辑  收藏 所属分类: java身份认证转帖

只有注册用户登录后才能发表评论。


网站导航: