`
andylu521
  • 浏览: 17107 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
阅读更多
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



Java代码 JAAS简介及实例 - skyeywolf - SKYEYWOLF......

   1. package com;  
   2.  
   3. import javax.security.auth.login.LoginContext;  
   4. import javax.security.auth.login.LoginException;  
   5.  
   6. public class SimpleLogin {  
   7.       
   8.     public static void main(String[] args) {  
   9.           
  10.         // 建立登陆上下文,并通过配置文件初始化,在这里配置文件必须与程序同目录  
  11.         LoginContext loginContext = null;  
  12.         try {  
  13.                                              
  14.             loginContext = new LoginContext("simple", new SimpleCallbackHandle());  
  15.         } catch (LoginException e) {  
  16.               
  17.             System.out.println(e.getMessage());  
  18.         }  
  19.           
  20.         try {  
  21.               
  22.             // 如果不抛出异常表示验证成功  
  23.             loginContext.login();  
  24.         } catch (LoginException e) {  
  25.               
  26.         }  
  27.     }  
  28.       
  29. } 



   SimpleCallbackHandle.java



Java代码 JAAS简介及实例 - skyeywolf - SKYEYWOLF......

   1. package com;  
   2.  
   3. import java.io.BufferedReader;  
   4. import java.io.IOException;  
   5. import java.io.InputStreamReader;  
   6. import javax.security.auth.callback.Callback;  
   7. import javax.security.auth.callback.CallbackHandler;  
   8. import javax.security.auth.callback.NameCallback;  
   9. import javax.security.auth.callback.PasswordCallback;  
  10. import javax.security.auth.callback.UnsupportedCallbackException;  
  11.  
  12. public class SimpleCallbackHandle implements CallbackHandler {  
  13.  
  14.     public void handle(Callback[] callbacks) throws IOException,  
  15.             UnsupportedCallbackException {  
  16.  
  17.         for (Callback callback : callbacks) {  
  18.  
  19.             if (callback instanceof NameCallback) {  
  20.                 NameCallback nc = (NameCallback) callback;  
  21.                   
  22.                 System.out.print(nc.getPrompt());  
  23.                 System.out.flush();  
  24.                   
  25.                 nc.setName((new BufferedReader(new InputStreamReader(  
  26.                                 System.in))).readLine());  
  27.             } else if (callback instanceof PasswordCallback) {  
  28.                 PasswordCallback pcb = (PasswordCallback) callback;  
  29.                   
  30.                 System.out.print(pcb.getPrompt());  
  31.                 System.out.flush();  
  32.                 pcb.setPassword((new BufferedReader(new InputStreamReader(  
  33.                         System.in))).readLine().toCharArray());  
  34.             }  
  35.         }  
  36.     }  
  37. } 

SimpleLoginModule.java





Java代码 JAAS简介及实例 - skyeywolf - SKYEYWOLF......

   1. package com;  
   2.  
   3. import java.io.IOException;  
   4. import java.util.Map;  
   5.  
   6. import javax.security.auth.Subject;  
   7. import javax.security.auth.callback.Callback;  
   8. import javax.security.auth.callback.CallbackHandler;  
   9. import javax.security.auth.callback.NameCallback;  
  10. import javax.security.auth.callback.PasswordCallback;  
  11. import javax.security.auth.callback.UnsupportedCallbackException;  
  12. import javax.security.auth.login.LoginException;  
  13. import javax.security.auth.spi.LoginModule;  
  14.  
  15. public class SimpleLoginModule implements LoginModule{  
  16.  
  17.     private String userName;  
  18.       
  19.     private char[] password;  
  20.       
  21.     private Subject subject;  
  22.       
  23.     private CallbackHandler callbackHandler;  
  24.       
  25.     private Map sharedState;  
  26.       
  27.     private Map options;  
  28.       
  29.     private String debug;  
  30.       
  31.     public boolean abort() throws LoginException {  
  32.         System.out.println("abort()");  
  33.         return false;  
  34.     }  
  35.  
  36.     public boolean commit() throws LoginException {  
  37.         System.out.println("commit()");  
  38.         return false;  
  39.     }  
  40.  
  41.     public void initialize(Subject subject, CallbackHandler callbackHandler,  
  42.             Map sharedState, Map options) {  
  43.           
  44.         this.subject = subject;  
  45.         this.callbackHandler = callbackHandler;  
  46.         this.sharedState = sharedState;  
  47.         this.options = options;  
  48.           
  49.         debug = (String)options.get("debug");  
  50.     }  
  51.  
  52.     public boolean login() throws LoginException {  
  53.           
  54.         Callback[] callbacks = new Callback[2];  
  55.         callbacks[0] = new NameCallback("用户名: ");  
  56.         callbacks[1] = new PasswordCallback("密码: ", false);  
  57.           
  58.         try {  
  59.               
  60.             callbackHandler.handle(callbacks);  
  61.             userName = ((NameCallback)callbacks[0]).getName();  
  62.             password = ((PasswordCallback)callbacks[1]).getPassword();  
  63.               
  64.             if(debug.equals("true")){  
  65.                 System.out.println("你输入的用户名为:" + userName);  
  66.                 System.out.println("你输入的密码为:" + new String(password));  
  67.             }  
  68.               
  69.             if(userName.equals("callan") && new String(password).equals("callanpass")){  
  70.                 System.out.println("验证成功");  
  71.                 return true;  
  72.             } else {  
  73.                 System.out.println("验证失败");  
  74.                 userName = null;  
  75.                 password = null;  
  76.             }  
  77.         } catch (IOException e) {  
  78.             e.printStackTrace();  
  79.         } catch (UnsupportedCallbackException e) {  
  80.             e.printStackTrace();  
  81.         }  
  82.           
  83.         return false;  
  84.     }  
  85.  
  86.     public boolean logout() throws LoginException {  
  87.         System.out.println("logout()");  
  88.         return false;  
  89.     }  
  90.  
  91. }   

jaas.config



Java代码 JAAS简介及实例 - skyeywolf - SKYEYWOLF......

   1. simple {  
   2.    com.SimpleLoginModule required debug=true;  
   3. }; 

simple { com.SimpleLoginModule required debug=true;};





将代码编辑通过后执行以下命令:

java -Djava.security.auth.login.config==jaas.config com.SimpleLogin
分享到:
评论

相关推荐

    JAAS简介及实例.

    JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.

    JAAS 认证服务

    jaas 入门经典实例,jaas 入门经典实例,jaas 入门经典实例jaas 入门经典实例,jaas 入门经典实例

    安全认证JAASDemo

    学习jaas入门经典实例,学习jaas入门经典实例,学习jaas入门经典实例,学习jaas入门经典实例,学习jaas入门经典实例

    tomcat_jaas_demo

    tomcat下jaas配置实例(文档有不完善的地方) 1、需要修改 bin\startup.bat(根据自己的环境修改) SET JAVA_HOME=C:\programs\Java\jdk1.8.0_211 SET TOMCAT_HOME=C:\programs\apache-tomcat-5.5.20 2、需要修改 bin...

    JAVA安全性编程实例.doc及源码

    消息摘要,消息验证码,数字签名,口令保护,数字证书和证书链的生成、签发、检验和维护,SSL和HTTPS客户及服务器程序、基于代码位置和签发者的授权,签名Java Applet以及基于身份的验证和授权(JAAS)等。...

    AuxeanneRealmDB:AuxeanneRealmAPI 为 JAAS 实现数据库配置的测试和参考项目

    作为 JAAS 委托实现数据库配置的 AuxeanneRealmAPI 的测试和参考项目。 AuxeanneRealmAPI 以 Glassfish 应用程序服务器为目标,以轻松扩展 Java 身份验证和授权服务 (JAAS)。 此 API 将这些任务委托给部署在 ...

    Tomcat Basic Form认证实例!

    Tomcat Basic Form 2认证实例! 含有配置文件,

    <Java安全性编程实例>书和代码

    安全性编程实例&gt;书和代码,内容涉及Java加密和解密,反编译和反反编译,对类、成员变量、方法的攻击和保护,消息摘要,消息验证码,数字签名,口令保护,数字证书和证书链的生成、签发、检验和维护,SSL和HTTPS客户及...

    spring-hibernate-dwr实例

    spring-hibernate-dwr做的AJAX操作CRUD实例 环境:myeclipse6.0+jdk1.6 所需lib列表,请自行加入 mysql-connector-java-3.1.7-bin.jar antlr-2.7.6rc1.jar asm-attrs.jar cglib-2.1.3.jar ...

    java_安全性编程实例

    为主要考虑因素之一,随着 Java 的发展,更多的安全机制加入到 Java 中,在 Java 2中更是集成了 JCE、JSSE、JAAS 等 Java 安全扩展平台。这些安全机制是开发基于企业级 Java 2 应用平台(J2EE)上安全的应用程序的...

    从Java走向Java+EE+.rar

    22.1 利用JAAS进行验证和授权 315 22.2 利用JSSE进行安全传输 317 22.3 小结 317 第23章 Java EE的测试 319 23.1 开发者为什么需要学习测试 319 23.2 测试的基本概念 320 23.3 利用JUnit进行单元测试 ...

    AuxeanneRealm:AuxeanneRealmAPI的目标是Glassfish应用服务器,以轻松扩展Java身份验证和授权服务(JAAS)

    AuxeanneRealmAPI AuxeanneRealmAPI的目标是Glassfish应用服务器,以轻松扩展Java身份验证和授权服务(JAAS)。 该API将这些任务委托给部署在Glassfish实例(WAR,EAR)中的本地EJB Bean,从而允许: 充分利用容器...

    Java安全性编程实例(徐迎晓)

    # 本书共分9章,主要内容如下: # 第一章 # 解决的主要问题 # 运行本书的程序需要哪些软件? # 主要内容 ...# 本章介绍Java验证和授权服务(JAAS),可以方便地更换验证模块,并实现基于身份的授权。

    spring+struts+hibernate+dwr+jstl做的实例

    以用户管理为例,结合spring struts hibernate dwr jstl做的实例,struts hibernate dwr 与Spring完全结合,实现用户列表、信息增、删、改、查、维护时用户重名提示等功能,还包括页面自动转码设置(web.xml),...

    (2.0版本)自己写的struts2+hibernate+spring实例

    spring-plugin-2.0.11.1 antlr-2.7.5H3.jar asm.jar asm-attrs.jar cglib-2.1.3.jar commons-collections-2.1.1.jar dom4j-1.6.1.jar ehcache-1.1.jar hibernate3.jar jaas.jar...

    精通java核心技术电子书(2-2)

    本书力图用深刻的理论和丰富的实例揭示Java企业版中的最新核心技术,全面扫除Java领域的学习障碍。全书分为两篇,共21章,包括GUI程序设计、线程、本地方法调用、远程方法调用、命名与目录服务、JavaBeans 技术、JSP...

    精通java核心技术电子书(2-1)

    本书力图用深刻的理论和丰富的实例揭示Java企业版中的最新核心技术,全面扫除Java领域的学习障碍。全书分为两篇,共21章,包括GUI程序设计、线程、本地方法调用、远程方法调用、命名与目录服务、JavaBeans 技术、JSP...

Global site tag (gtag.js) - Google Analytics