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
相关推荐
6. **示例代码**:在“基于JAAS实现登录.htm”中,你可能找到一个实际的代码示例,展示如何集成JAAS到你的应用程序中。这可能包括如何创建登录模块,如何配置Jaas.conf,以及如何在代码中调用JAAS API进行登录尝试。...
### 基于JAAS的Java安全编程 #### JAAS概览 JAAS(Java Authentication and Authorization Service,Java认证与授权服务)是Sun Microsystems为Java 2平台开发的一套安全框架扩展,旨在加强Java应用程序的安全性。...
### 利用JAAS实现简单的页面验证与授权 #### JAAS简介 Java Authentication and Authorization Service (JAAS) 是 Java 平台提供的一种安全框架,它主要用于实现应用级别的身份验证和授权服务。JAAS 的出现是对 ...
### 基于JAAS和J2EE Web容器的验证与授权 #### 一、JAAS概述 Java Authentication and Authorization Service (JAAS) 是 Java 平台提供的一个强大的验证和授权框架,它允许开发者实现安全策略,从而确保应用程序...
与传统的基于容器的身份验证不同,JAAS提供了更为灵活和强大的机制来处理用户的身份验证。 #### 二、JAAS配置文件及设置 在JAAS中,配置文件是非常重要的组成部分之一,因为它包含了进行身份验证所必需的信息。...
本文将深入解析基于JAAS的用户验证和控制模型的一般设计,以及它如何帮助实现安全的用户登录和权限管理。 首先,JAAS的核心组件是`LoginContext`,它作为应用程序与JAAS框架之间的接口。`LoginContext`提供了一个...
描述中提到的“原代码”和“博文链接”意味着我们将看到一个实际的JAAS实现,这将帮助我们更好地理解JAAS的工作方式。JaasExample可能是这个实例的源代码文件,包含了登陆模块的实现和配置。 例如,一个简单的JAAS...
在本文的示例中,我们展示了一个基于Web的Java应用程序如何使用JAAS实现健壮而灵活的登录和身份验证模块。该示例中,关系数据库被用来保存用户的登录信息,通过JAAS的支持,我们能够轻松实现一个强大而灵活的身份...
下面将详细介绍JAAS的工作原理、主要组成部分以及如何通过示例代码实现它。 JAAS的设计是模块化的,这意味着它能够适应各种不同的认证机制,如密码、数字证书等。其工作流程通常包括以下几个步骤: 1. **配置**:...
Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全性的关键组件,它提供了一种框架,使得应用程序能够实现用户身份验证和权限管理。在这个教程中,我们将深入探讨JAAS的核心概念、工作...
登录模块可以是基于数据库的、LDAP目录的,甚至可以是kerberos等更复杂的身份验证机制。 **2. JAAS配置** - **jaas.conf文件**:这是JAAS的主要配置文件,定义了不同的安全领域( realms )和对应的登录模块。 - **...
在实际开发中,一些工具和库可以帮助简化JAAS的使用,例如使用Spring Security整合JAAS,或者利用开源的登录模块实现。这些工具通常提供更高级别的抽象,使得安全设置更加容易和灵活。 总结,Java Authentication ...
通过添加验证主题(即用户或其他实体)的能力以及基于验证标识的授权功能,JAAS极大地增强了Java的安全性。JAAS通过引入一个抽象层,使得应用程序能够独立于底层的具体验证和授权机制,从而简化了涉及Java Security...
- **登录模块(Login Modules)**:登录模块是实现认证的具体逻辑,是JAAS的核心组件。它们实现了 `javax.security.auth.spi.LoginModule` 接口,负责实际的用户验证工作。每个登录模块都有其特定的认证方式,如使用...
- **统一的API**:无论底层采用何种技术实现,JAAS都提供了一致的编程接口(SPI),便于应用程序调用。 - **灵活性与扩展性**:JAAS的设计理念强调灵活性和扩展性,支持各种复杂的认证场景。 #### 三、JAAS的核心...
通过编写自定义的LoginModule和配置JAAS,你可以实现特定的认证需求,确保只有授权用户才能访问敏感资源。记得在部署时,要仔细检查每个步骤,确保所有配置都正确无误,以保证系统的稳定性和安全性。
JAAS是Java平台中的安全框架,允许开发者为应用程序实现灵活的身份验证和授权机制。 首先,我们需要理解JAAS的基本概念。JAAS提供了一个框架,通过认证模块(LoginModule)来处理用户登录和验证。每个认证模块可以...
JAAS设计为可插拔的系统,意味着开发者或第三方可以通过实现特定的接口创建自定义的登录模块(LoginModule)以满足特定的认证需求。登录模块是JAAS的核心,它们负责验证用户的身份,并根据验证结果分配权限给Subject...