JAAS简介及实例

通过实例介绍JAAS的执行流程 JAAS,Java Authentication and Authorization Service,Java认证和授权服务。“认证”部分主要负责确定程序使用者的身份,而“授权”将各个用户映射到相应的权限。下面通过java核心技术上的例子来记录JAAS的执行流程 阅读详情

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/GSS-API/SASL/Kerberos简介 # JAAS/GSS-API/SASL/Kerberos简介 如果将Kerberos引入到一个分布式系统中提供身份认证与服务授权时,还涉及到一系列与安全有关的框架技术与接口协议,包括:如何对认证的对象或访问的资源进行抽象?应用通过什么样的接口进行Kerberos认证?如何保障跨节点通信时的安全传输?Java Security中均提供了现成的实现。 JAAS JAAS是Java Aut... 阅读详情

相关推荐

vivado 编译ADI AD9361 TCL脚本生成hdl工程

(4)输入"source ../../scripts/adi_make.tcl"命令(仅双引号内部命令,不包含双引号),个人理解:该命令用来加载当前所需要编译工程所需要各功能模块的信息,因为每个工程需要不同的功能模块,比如有的需要gpio模块,有的不需要gpio模块,这些模块上前面路径的library也同样以TCL脚本形式存在,当有需要时才进行编译,怎么知道当前工程需要什么模块呢就是通过"source ../../scripts/adi_make.tcl"(仅双引号内部命令,不包含双引号)命令实现。

weixin_40586423的博客 808

JAAS基础认证和授权机制(转载)

安全性是所有可以用来对资源进行保护和验证的机制。有很多种安全模型都可以用来对数据提供保护。这些安全模型可以使用加密、访问控制或其他安全方法。授权(Authorization),或称为访问控制,可以使用不同的安全服务来对资源进行保护:一种方法是Java认证和授权服务(Java Authentication and Authorization Service,JAAS),另外一种方法是Windows ...

sui102的专栏 577

virtualbox虚拟机里面最顶部没有控制、设置和帮助等选项

无意中操作,导致virtualbox虚拟机里面最顶部没有控制,设置和帮助选项  virtualbox虚拟机窗口显示如下如: 如何设置,窗口显示如下图所示呢: virtualbox虚拟机窗口模式显示设置,切换可以通过如下图所示操作进行切换: PS:一定要是右边的Ctrl+C

WEL测试 8780

JAASJ简介与实例(转)

JAAS简介及实例 关键字: jaas 实例JAAS是对JCE安全框架的重要补充,通过提供认证用户和确定用户授权来增强JAVA解决方案的动态安全性,使得资源能够得到很好得到保护和控制(JAAS使用动态的安全策略来定义权限,而不是将其静态的嵌入到代码中)。 JAAS采用的是插件的运行方式,一开始就被设计成可插拔的(Pluggable),根据应用的需要,只要配置一下JAA

CYHJRX的专栏 932

Windows下Python调用D435i相机避坑指南:从SDK版本选择到RealSense Viewer报错解决

本文详细介绍了在Windows环境下使用Python调用Intel D435i相机的完整避坑指南。重点解决了SDK版本选择问题,推荐使用稳定的Intel RealSense SDK 2.54.2版本,并提供了从环境配置、常见报错解决到实际应用案例的全流程实践指导,帮助开发者高效完成相机部署与开发。

palm99的专栏 923

解锁Jetbrains AI助手:中国开发者实战配置与效率跃迁指南

本文为中国开发者提供了一份详细的Jetbrains AI助手实战配置指南。针对服务地域限制,核心解决方案是通过修改Jetbrains账户区域信息并配置网络代理,实现插件的稳定启用。文章进一步分享了AI助手在解读遗留代码、生成中文提交信息、智能问答等场景下的具体应用,旨在帮助开发者深度集成这一工具,实现编码生产力的显著提升。

weixin_28832121的博客 573

JAAS:灵活的Java安全机制

  Java Authentication Authorization Service(JAAS,Java验证和授权API)提供了灵活和可伸缩的机制来保证客户端或服务器端的Java程序。Java早期的安全框架强调的是通过验证代码的来源和作者,保护用户避免受到下载下来的代码的攻击。JAAS强调的是通过验证谁在运行代码以及他/她的权限来保护系统面受用户的攻击。它让你能够将一些标准的安全机制,例如S

oicqren的专栏 1722

基于STM32的智能手环心率血氧体温监测系统(完整设计)

本文设计了一款基于STM32单片机的多功能智能手环系统,集成心率、血氧、体温实时监测功能,并支持运动数据管理与健康预警。系统采用MAX30102传感器实现心率血氧监测,DS18B20检测体温,ADXL345进行步数统计,通过OLED屏幕显示数据。研究通过低功耗硬件选型与模块化软件架构设计,实现了多参数同步采集、阈值预警及蓝牙数据传输功能。测试结果表明,系统在健康监测精度、续航能力及用户交互体验上均达到预期目标,为个人健康管理提供了实用解决方案。

3254968421的博客 701

JAAS 认证过程

本文通过一个示例说明 JAAS Authentication 过程。 运行示例 运行示例分三步: 获取代码,编译代码,运行示例 获取代码 $ git clone git@github.com:kylinsoong/security-examples.git 编译代码 $ cd security-examples/jaas-authentication-tutorial $ mvn...

atarik@163.com 995

华为OD机试新系统真题 【查找最佳充电策略】

华为OD机试 新系统真题【查找最佳充电策略】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【查找最佳充电策略】多语言题解。

qq_45776114的博客 431

文末含资料链接和视频讲解!YOLOv8集成CoordAtt注意力机制详细教程

本文详细介绍了如何在YOLOv8目标检测框架中集成CoordAtt注意力机制。首先解析了CoordAtt的工作原理,它通过分解式池化将位置信息嵌入到通道注意力中,相比传统注意力机制具有更好的空间信息保持能力。然后提供了PyTorch实现代码解析,包括自适应平均池化、Hard-Swish激活函数等关键实现细节。最后概述了YOLOv8架构,为后续集成CoordAtt提供基础。该教程适合具备深度学习基础的开发者,将理论与实践结合,帮助读者掌握这一目标检测优化技术。

FJN110的博客 266

JAAS

JAAS编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! Java Authentication Authorization Service(JAAS,Java验证和授权API)提供了灵活和可伸缩的机制来保证客户端或服务器端的Java程序。Java早期的安全框架强调的是通过验证代码的来源和作者,保护用户避免受到下载下来的代码的攻击。JAAS强调

evilcry2012的专栏 662

第10章 shellcode实战:18 神级开源shellcode工具:donut

Donut是一款shellcode生成器,可将C/C++、C#生成的PE文件转换为shellcode文件,同时支持JS、XSL、VBS脚本转换为shellcode。以下“原生”EXE/DLL指非托管PE文件(包括并不限于C/C++、delphie等编写生成的可执行文件),可以直接由系统加载运行,区别于.Net生成的托管文件。被处理exe/dll为32位程序,则需要用32为的shellcode加载器启用,exe/dll为64位的就用64位shellcode加载器启用。

李小咖·网安技术库 2796

jaas之登录实例

JAAS:Java Authentication and Authorization Service,提供了认证和授权框架。 本例是认证的实现,JAAS定义了可插拔的认证机制,使认证逻辑独立开来,可通过修改配置文件切换认证模块。 一、配置文件及设置 1. 配置文件(假设为D:/jaas.conf): Sample{   com.fastunit.samples.jaas.Sa

AI开源工具分享 2731

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

扩展 jaas 实现类实例级授权

类 .ibm.resource.security.auth.xmlpolicyfile,来从 xml 文件。的 .ibm.resource.security.auth.principalexample 主体的。javax.security.auth.policy 被用于代表 jaas 安全性策略。bid.class 实例也是一样,除了相应 auction.class 实例的。缺省实现是由 .sun.security.auth.policyfile 类提供。设计 jaas 使得 jaas 可以扩展。

hhappy0123456789的博客 1088

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

JAAS使用

简介 Java 验证和授权服务(Java Authentication Authorization Service,简称 JAAS)是 Java 在 JDK 1.4 引入的安全框架。JAAS 提供了一种灵活的、说明性机制,用于对用户进行身份验证和服务访问的授权。 JAAS 是一种可插拔的认证模块( Pluggable Authentication Module,PAM )的安全体系结构。这意味着可...

zc0565的博客 4947

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Jaas原理及实现

JAAS是对JCE安全框架的重要补充,通过提供认证用户和确定用户授权来增强JAVA解决方案的动态安全性,使得资源能够得到很好得到保护和控制(JAAS使用动态的安全策略来定义权限,而不是将其静态的嵌入到代码中)。 JAAS采用的是插件的运行方式,一开始就被设计成可插拔的(Pluggable),根据应用的需要,只要配置一下JAAS的配置文件,这些组件即可包含 在我们的应用程序中。使用JAAS包接

老毕专栏 5361

tomcat下jaas配置实例

声明:以下方式只能帮忙理解知识,如果希望通过步骤跑起来,有一些坑。 1、采用的JDK 1.8 一、首先参考tomcate下文档的jaasRealm的配置,注意文档中的两个地方: Quick Start To set up Tomcat to use JAASRealm with your own JAAS login module, you will need to follow these steps: 1. Write your own LoginModule, User and ...

newbei5862的博客 955

JAAS介绍

JAAS介绍 1、JAAS是什么? JAAS---Java Authentication Authorization Service(JAAS,Java验证和授权服务)。 2、JAAS背景 从早期所谓的 Java 沙箱到 JDK 1.4 引入的健壮的、全功能的安全体系结构,安全性一直是 Java 平台的基本组件。从那时到现在,Java 语言的设计者收到了来自团体的大量关于安全的

成长是一个持续的过程 4161
上一篇: Linux启动过程剖析
下一篇: Flex 4的十大变化
jackoo
博客等级 码龄18年 5粉丝 32原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值