JAAS是对JCE安全框架的重要补充,通过提供认证用户和确定用户授权来增强JAVA解决方案的动态安全性,使得资源能够得到很好得到保护和控制(JAAS使用动态的安全策略来定义权限,而不是将其静态的嵌入到代码中)。
JAAS采用的是插件的运行方式,一开始就被设计成可插拔的(Pluggable),根据应用的需要,只要配置一下JAAS的配置文件,这些组件即可包含 在我们的应用程序中。使用JAAS包接口,开发者和第三方可以开发一些组件或者BEAN来实现登陆认证,或者通过与使用者或外部的系统的进行交互来访问认 证信息(当然我们可以设计更为稳妥安全的密码学协议)。JAAS提供了一组用于用户鉴别的类和接口,这意味着支持JAAS的应用会要求用户登陆,同时 JAAS提供了另一组用于用户授权的类和接口。在讨论例子之前,先对JAAS API中常用的一些类和接口做个简单的说明。
LoginModule :确认用户的合法性(使用CallbackHandler或者其他类方法),并分配访问权限principal给subject;
LoginContext:为了实现用户鉴别,建立相应的环境,从配置文件中导入规则;
CallbackHandler:回调处理器,负责与用户(代码拥有者和执行者)交互,确认其身份的合法性;
Subject:表示登陆处理的目标,即一个被鉴别的用户。并可关联一个或多个pirncipal;
Principal:表示具有访问权限的一个实体,可以看作是可以执行某种操作的证件。
理解这些类和接口的关系我给个生动的比方:一个军事学校,入学的时候校方(LoginModule)根据学生(Subject)的入学通知来确定其合法 性,这个过程交由某工作人员(CallbackHandler)执行,(CallbackHandler)确认后,(LoginModule)给不同 (Subject)根据其身份发给相关的证件(Principal),有了该证件就可以访问对应的资源,(Subject)根据自己的 (Principal)的级别可以使用和访问学校不同资源。
一个(Subject)的(Principal)如果是士官级,那么可以访问的资源就相对少些,如果是将军级那就多些。当然一个(Subject)可以拥有多个(Principal)。
通过分析我们会发现,JAAS采用的也是身份检查+权限分配模式。因此JAAS的应用也分成两个部分:(1)认证;(2)授权。过程是先认证后根据身份来授权(有歧视的嫌疑的东东,本人可是反歧视人士)。
那么JAAS是如何实现认证的呢?又是如何实现授权的呢?且听我慢慢分解,将其妙处展现给大家。
二 JAAS的认证原理
(1) 设置JAAS配置文件,关于配置非常有技巧,跟设置防火墙的过滤规则有得一拼;
(2) 根据JAAS配置文件的条目加载一个或者多个LoginModule(通常一个,也可以变态得使用多个);
(3) 为了管理用户认证的有关过程,将提供一个可选的LoginModule构造函数和一个回调处理器CallbackHandler。如果没有在构造函数中提供回调处理器,系统采用默认设置;
(4) 初始并实例化LoginContext(加载配置规则),如果成功,则调用LoginContext的login方法。无论是否需 要,LoginContext都会去首先读取JAAS配置文件,从中获得要加载的登陆模块信息,其initialize方法将按照配置文件中的相关内容提 供LoginModule运行所需要的信息;
(5) LoginContext的login方法将调用LoginModule的login方法,确定用户身份。该方法将设置相关的回调,并由回调处理器CallbackHandler来管理登陆处理回调;
(6) LoginModule的login方法将负责与用户进行交互(可能是人机交互,也可能是机机交互),如果用户输入信息无效,则该方 法返回FALSE,一次交互过程结束,如果用户输入信息有效,则该方法将设置Principal对象的Subject对象,并返回TRUE;当然 LoginModule也可以将与用户之间的所有交互过程全部委托给处理器CallbackHandler来处理。如果登陆成功, LoginContext将调用LoginModule的commit方法将结果提交给LoginModule实例的内部状态。
在应用程序中使用JAAS验证通常会涉及到以下几个步骤:
1. 创建一个LoginContext的实例。
2. 为了能够获得和处理验证信息,将一个CallBackHandler对象作为参数传送给LoginContext。
3. 通过调用LoginContext的login()方法来进行验证。
4. 通过使用login()方法返回的Subject对象实现一些特殊的功能(假设登录成功)。
下面是一个简单的例子:
SimpleLogin.java
- package com;
- import javax.security.auth.login.LoginContext;
- import javax.security.auth.login.LoginException;
- public class SimpleLogin {
- public static void main(String[] args) {
- // 建立登陆上下文,并通过配置文件初始化,在这里配置文件必须与程序同目录
- LoginContext loginContext = null;
- try {
- loginContext = new LoginContext("simple", new SimpleCallbackHandle());
- } catch (LoginException e) {
- System.out.println(e.getMessage());
- }
- try {
- // 如果不抛出异常表示验证成功
- loginContext.login();
- } catch (LoginException e) {
- }
- }
- }
SimpleCallbackHandle.java
- package com;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import javax.security.auth.callback.Callback;
- import javax.security.auth.callback.CallbackHandler;
- import javax.security.auth.callback.NameCallback;
- import javax.security.auth.callback.PasswordCallback;
- import javax.security.auth.callback.UnsupportedCallbackException;
- public class SimpleCallbackHandle implements CallbackHandler {
- public void handle(Callback[] callbacks) throws IOException,
- UnsupportedCallbackException {
- for (Callback callback : callbacks) {
- if (callback instanceof NameCallback) {
- NameCallback nc = (NameCallback) callback;
- System.out.print(nc.getPrompt());
- System.out.flush();
- nc.setName((new BufferedReader(new InputStreamReader(
- System.in))).readLine());
- } else if (callback instanceof PasswordCallback) {
- PasswordCallback pcb = (PasswordCallback) callback;
- System.out.print(pcb.getPrompt());
- System.out.flush();
- pcb.setPassword((new BufferedReader(new InputStreamReader(
- System.in))).readLine().toCharArray());
- }
- }
- }
- }
SimpleLoginModule.java
- package com;
- import java.io.IOException;
- import java.util.Map;
- import javax.security.auth.Subject;
- import javax.security.auth.callback.Callback;
- import javax.security.auth.callback.CallbackHandler;
- import javax.security.auth.callback.NameCallback;
- import javax.security.auth.callback.PasswordCallback;
- import javax.security.auth.callback.UnsupportedCallbackException;
- import javax.security.auth.login.LoginException;
- import javax.security.auth.spi.LoginModule;
- public class SimpleLoginModule implements LoginModule{
- private String userName;
- private char[] password;
- private Subject subject;
- private CallbackHandler callbackHandler;
- private Map sharedState;
- private Map options;
- private String debug;
- public boolean abort() throws LoginException {
- System.out.println("abort()");
- return false;
- }
- public boolean commit() throws LoginException {
- System.out.println("commit()");
- return false;
- }
- public void initialize(Subject subject, CallbackHandler callbackHandler,
- Map sharedState, Map options) {
- this.subject = subject;
- this.callbackHandler = callbackHandler;
- this.sharedState = sharedState;
- this.options = options;
- debug = (String)options.get("debug");
- }
- public boolean login() throws LoginException {
- Callback[] callbacks = new Callback[2];
- callbacks[0] = new NameCallback("用户名: ");
- callbacks[1] = new PasswordCallback("密码: ", false);
- try {
- callbackHandler.handle(callbacks);
- userName = ((NameCallback)callbacks[0]).getName();
- password = ((PasswordCallback)callbacks[1]).getPassword();
- if(debug.equals("true")){
- System.out.println("你输入的用户名为:" + userName);
- System.out.println("你输入的密码为:" + new String(password));
- }
- if(userName.equals("callan") && new String(password).equals("callanpass")){
- System.out.println("验证成功");
- return true;
- } else {
- System.out.println("验证失败");
- userName = null;
- password = null;
- }
- } catch (IOException e) {
- e.printStackTrace();
- } catch (UnsupportedCallbackException e) {
- e.printStackTrace();
- }
- return false;
- }
- public boolean logout() throws LoginException {
- System.out.println("logout()");
- return false;
- }
- }
jaas.config
- simple {
- com.SimpleLoginModule required debug=true;
- };
将代码编辑通过后执行以下命令:
java -Djava.security.auth.login.config==jaas.config com.SimpleLogin
相关推荐
Java 2 SDK 1.3引入了JAAS( Java Authentication and Authorization Service),增加了基于用户的访问控制能力,即根据谁在运行代码来进行授权。JAAS已经整合进了Java 2 SDK 1.4,作为标准的用户认证与授权模型。
关于Java单点登录虽然sun提供了SSO标准的JAAS实现方式,但是基于各应用服务器其配置方式不同而且完全不同,在使用上也会有出入,工程中web.xml配置方式基本相同,具体差别就在于应用服务器支持和配置。 在网上搜寻...
目前RBAC模型已得到广泛的认同,但传统的RBAC实现脱离了企业的组织架构,同时认证模块与...该文在大量研究已实现RBAC模型的基础上提出了基于Principal的认证与授权模型、算法的大致思想,并提供了基于J2EE的实现方案。
介绍了ejb的安全机制,以及提出一种安全的基于jaas的架构
该方案采用JAAS(Java Authentication Authorization Service)实现可插入式登录模块,采用X509数字证书作为用户身份认证,通过配置Web服务器,并利用服务器证书和客户端证书实现服务器与客户端之间的SSL双向认证;...
• 安全验证 - 一个可扩展的、基于JAAS的安全验证层,允许用户to authenticate against any security provider • 身份管理 - 用于管理Seam程序中所涉及的用户及角色的接口 • 权限验证 - 一个应用十分广泛的权限...
对通用访问控制框架(GFAC)进行了研究,提出了一种基于J2EE的通用访问控制框架(JGFAC),并给出了其基于Java技术的实现。采用代理机制实现了多种安全策略的共存;通过对URL请求过滤有效控制了对系统资源的访问,并...
第二部分详细讲解了jsf ri、jta、jndi、rmi、jms、javamail、ejb 3的session bean、message driven bean、jpa、jax-ws 2、jaas等java ee知识,这部分知识以jsf+ejb 3+jpa整合开发为重点,通过使用netbeans ide工具...
设计方案将Internet上的各种资源抽象成URI,采用JAAS 和Filter 技术集中管理,将开发阶段需要考虑的安全问题转移到了部署阶段,从而实现应用逻辑与安全逻辑分离的目的。归纳了面临的问题和解决办法,最后给出了典型...
ERP软件标准版技术平台是基于Java的高性能MVC框架,组件化的可扩展技术路线,符合JAAS的安全架构。系统基于当前主流J2EE多层架构,纯B/S模式,开发采用以安全和高性能所著称的JAVA语言,实现了动态的Web、Internet...
本书明确而详尽地阐述了Java平台安全性,探究了Java安全结构的内幕。本书首先概述了计算机和网络安全概念并解释了Java安全模型,并在此基础上,详细描述了Java 2平台...8.3.6 JAAS工具 149 8.4 小结 149 参考文献 151
这个是我在项目中实现的一个基于角色的权限管理系统;实现RBAC0级权限模型;绝对是精品代码; 欢迎交流;qq:158751041
" "安全性要求 "基于JAAS架构,实现基于容器的安全策略,提供基于数" " "据库和LDAP认证的Login Module, 支持用户增加Login " " "Module,支持单点登录 " " "必须支持标准的安全协议SSL(Secure Socket " " "Layer...
# 本书共分9章,主要内容如下: # 第一章 # 解决的主要问题 # 运行本书的程序需要哪些软件? # 主要内容 ...# 本章介绍Java验证和授权服务(JAAS),可以方便地更换验证模块,并实现基于身份的授权。
一个完整的门户平台可以有效支持以下的技术要求: 基于J2EE的开放式体系结构 支持国际主流标准Portlet、XML、WSRP、JAAS、JNDI、JCA等 客户端程序和服务端程序相结合,既保障系统的高效灵活扩展性,又降低服务器的...
4.2.3 配置一个可选Policy类的实现 72 4.2.4 缺省的策略文件格式 72 4.2.5 策略文件举例 75 4.2.6 策略文件中的属性扩展 76 4.3 数字证书 77 4.4 有用的安全工具 80 4.4.1 密钥数据库 80 4.4.2 keytool 82 4.4.3 ...
表单和基本登录选项 2.2.3. 使用其他认证提供器 2.2.3.1. 添加一个密码编码器 2.3. 高级web特性 2.3.1. Remember-Me认证 2.3.2. 添加HTTP/HTTPS信道安全 2.3.3. 会话管理 2.3.3.1. 检测超时 2.3....
表单和基本登录选项 2.2.3. 使用其他认证提供器 2.2.3.1. 添加一个密码编码器 2.3. 高级web特性 2.3.1. Remember-Me认证 2.3.2. 添加HTTP/HTTPS信道安全 2.3.3. 会话管理 2.3.3.1. 检测超时 2.3.3.2. 同步...
表单和基本登录选项 2.2.3. 使用其他认证提供器 2.2.3.1. 添加一个密码编码器 2.3. 高级web 特性 2.3.1. Remember-Me 认证 2.3.2. 添加HTTP/HTTPS 信道安全 2.3.3. 会话管理 2.3.3.1. 检测超时 2.3...
Java Authentication and Authorization Service (JAAS) JAAS配置教程 JASPI 安全模型(Secure Mode) 存储在文件中的安全密码以及编程教程 如何开启或禁止Jetty中的SSL功能 如何在Jetty中安全存储密码 如何安全终止...