简介
Java 验证和授权服务(Java Authentication Authorization Service,简称 JAAS)是 Java 在 JDK 1.4 引入的安全框架。JAAS 提供了一种灵活的、说明性机制,用于对用户进行身份验证和服务访问的授权。
JAAS 是一种可插拔的认证模块( Pluggable Authentication Module,PAM )的安全体系结构。这意味着可以通过改变模块,支持从一种安全协议组件无缝的切换到另一个协议组件。同时这种体系架构定义的接口可以无需修改代码实现加入多种认证技术和授权机制,因为 JAAS API 定义了应用程序代码与实际验证逻辑之间的抽象,这个抽象不用重新编译现有的应用程序代码就可以作为登录模块的运行时替代。这种实现方式是通过应用程序只调用 LoginContext 接口,而认证技术的实际提供程序则是基于 LoginModule 接口进行开发的,在运行时,LoginContext 通过读取配置文件确定使用哪些认证模块来对应用程序进行认证。
JAAS 认证中最重要的实体对象是:principal 和 subject,subject 表示一个验证通过的主体,这个主体保存着一系列的相关信息,包含此实体的 principal,公开 Credential 以及私有 Credential。
使用
使用步骤
在应用程序中使用 JAAS 的步骤为:
- 实例化一个
LoginContext对象,LoginContext通过查询一个配置文件确定所使用的认证技术 - 调用
LoginContext的login()方法来进行认证 - 认证通过,可通过
getSubject()获取 subject 对象
简单示例:
String applicationName="app";
LoginContext logincontext = new LoginContext(applicationName); // ①
try {
logincontext.login(); // ②
} catch (LoginException e) {
// Authentication failed.
}
// Authentication successful, we can now continue.
// We can use the returned Subject if we like.
Subject subject = logincontext.getSubject(); // ③
Subject.doAs(subject, new MyPrivilegedAction());
代码分析:
- 代码 ① 是在构建一个
LoginContext对象,这个对象内部首先会通过传入的 Application 参数在 JAAS 的配置文件中找到对应的配置,然后根据这个配置加载实际的LoginModule - 代码 ② 是应用程序中执行登录验证,
LoginContext内部会调用每个加载的LoginModule的login()方法。如果登录失败,会抛出LoginException异常,如果登录成功,则继续向下执行 - 登录成功后,可通过代码 ③ 获取验证通过的 subject 对象,可通过这个对象发起服务授权等请求操作
配置文件
在上面的使用过程中,可以发现 JAAS 的实际认证机制是通过配置文件来配置的,一般配置文件是保存在文本中的。文本文件中由很多配置块构成,通常把这些配置块称作申请(Application)。每个申请对应了一个或多个特定的 LoginModule 对象。
在代码中构造一个 LoginContext 对象时,需要把配置文件中申请的名称传递给它,LoginContext 将会根据申请中的信息决定激活哪些 LoginModule 对象,按照什么顺序激活以及使用什么规则激活。
配置文件的结构如下所示:
Application{
ModuleClass Flag ModuleOptions;
ModuleClass Flag ModuleOptions;
...
};
Application2{
ModuleClass Flag ModuleOptions;
...
}
ModuleClass:指定使用的实际LoginModuleFlag:控制当申请中包含了多个LoginModule时进行登录时的行为,一般有以下几个选项:- Required:最常用的选项,该选项意味着对应的
LoginModule对象必须被调用,并且还必须要通过所有的验证 - Sufficient
- Requistite
- Optional
- Required:最常用的选项,该选项意味着对应的
ModuleOption:允许有多个参数
简单示例:
Sample {
com.sun.security.auth.module.NTLoginModule Rquired debug=true;
}
示例中的申请指定了 LoginContext 对象应该使用 NTLoginModule 进行验证,并设置了一个调试参数 debug=true,这样诊断输出将被输出到 System.out 中。
配置文件可以被任意命名,并且可以被放在任何位置。JAAS 框架通过使用 java.securty.auth.long.config 属性来确定配置文件的位置,可通过以下几种方式设置这个属性:
- 环境变量进行配置,客户端代码基本不怎么用,局限性太大了
- 命令启动程序,可进行参数设置属性:
java -Djava.security.auth.login.config=jass.config JAASTest - 代码中设置此属性:
System.setProperty("java.security.auth.login.config","D:\xxx\jass.config");
本文由博客一文多发平台 OpenWrite 发布!