- 浏览: 209540 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
xiaokang1582830:
这有涉及到跨域?
ajax跨域调用webservice -
337240552:
...
web.xml中<security-constraint>和四种认证类型 -
pythoner126com:
写得不错,国内对perl热情不是很高,我最近也有翻译,请多多指 ...
Perl Hash 用法 -
an_yeblack:
你好,我想问一下,一般是什么愿因导致这种错误的呢?先谢谢了!! ...
WAS7 无法在控制台启动 Node Agent -
linzixiao:
感谢分享
冻结table的行和列
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
SimpleCallbackHandle.java
SimpleLoginModule.java
jaas.config
Java代码
将代码编辑通过后执行以下命令:
java -Djava.security.auth.login.config==jaas.config com.SimpleLogin
转自:http://callan.iteye.com/blog/158392
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) { } } }
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
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()); } } } }
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; } }
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
Java代码
simple { com.SimpleLoginModule required debug=true; }; simple { com.SimpleLoginModule required debug=true; };
将代码编辑通过后执行以下命令:
java -Djava.security.auth.login.config==jaas.config com.SimpleLogin
转自:http://callan.iteye.com/blog/158392
- core.rar (5.1 KB)
- 下载次数: 16
发表评论
-
SECJ0306E
2012-01-16 09:55 1632当前环境场景:was 6集群,控制台的登录密码失效中,然后 ... -
Can’t find bundle for base name xxx, locale en_US
2012-01-11 13:27 2027当报这个错误的时候Can’t find bundle f ... -
Java Errors: “UnsupportedClassVersionError…bad major version at offset=x”
2012-01-06 10:23 6421问题描述 当项目中加载一个jar包或者其中一个类的时候 ... -
Java compiler level does not match the version of the installed Java project fac
2012-01-06 10:03 1271问题描述: 编译完项目后报错误: Java comp ... -
SECJ0306E
2011-04-02 11:27 1357错误日志信息: SECJ0306E: No received ... -
websphere中的Single Sign-on 单点登录
2011-03-03 13:55 14821 SSO简介 SSO(Single Sign-O ... -
javax.net.ssl.SSLHandshakeException: com.ibm.jsse2.util.h: No trusted certificat
2011-02-12 18:02 5086an error occur when i log in my ... -
web.xml中<security-constraint>和四种认证类型
2011-02-12 13:29 10450<security-constraint> 的子元 ... -
WebSphere下应用程序更新,安装war,ear包以及添加单独模块
2011-02-12 13:23 2546from: http://www.hashei.me/2009 ... -
Error 404: SRVE0190E: File not found: /login.action
2011-02-12 13:21 6578发生这样问题有两种情况。 (1)第一种,我的was是6.1, ... -
关于websphere中配置 j_security_check 的配置
2010-12-31 13:19 2044系统登录的submit提交的action是j_secu ... -
WAS7 无法在控制台启动 Node Agent
2010-12-28 09:14 7427错误信息:无法在控制台启动Node Agent 解决方法: ... -
fails to startServer return code = -1
2010-12-23 15:56 2918转自:http://www-01.ibm.com/suppor ... -
转:Websphere 优化技巧
2010-12-23 15:51 1322转自:http://www.webspherechina.ne ...
相关推荐
下面将详细介绍JAAS的工作原理、主要组成部分以及如何通过示例代码实现它。 JAAS的设计是模块化的,这意味着它能够适应各种不同的认证机制,如密码、数字证书等。其工作流程通常包括以下几个步骤: 1. **配置**:...
在本次演示中,我们将详细介绍JAAS的认证流程,以及如何利用Java 2 Policy文件来增强安全性。 #### 六、JAAS认证流程 1. **初始化LoginContext**:创建LoginContext实例时需指定一个Configuration对象,该对象包含...
### JAAS登录验证知识点 #### 一、JAAS概述 Java Authentication and Authorization Service(JAAS)是Java平台...以上介绍的是JAAS登录验证的基本流程和技术要点,实际应用中可能还需要根据具体需求进行扩展和定制。
- `jaas-in-action_chapter01-05.pdf`: 可能介绍了JAAS的基础概念和架构。 - `jaas-in-action_chapter02-05.pdf`: 可能深入解析了登录模块和配置文件。 - `jaas-in-action_chapter03-02.pdf` 和 `jaas-in-action_...
#### 三、JAAS的核心类介绍 ##### 1. 公共类 公共类是由JAAS认证和授权部分共同使用的类,其中最重要的是`Subject`类。`Subject`类封装了一个主体的相关信息,包括标识、公有凭据、私有凭据等。 - **Subject 类**...
书中可能详细介绍了Subject的使用以及如何从Subject中获取和管理认证信息。 第五,JAAS的跨域认证也是重要的主题,例如,如何在不同应用之间共享用户认证状态,实现单点登录(SSO)。这可能涉及到票证验证协议,如...
描述:Java认证和授权服务(JAAS)供应器JAAs验证机制,探讨了Spring Security如何代理JAAS的认证请求,并详细介绍了JAAS登录配置文件、JaasAuthenticationProvider的配置以及JAAS Callback Handler和JAAS Authority...
JAAS:灵活的Java安全机制 Java Authentication Authorization Service(JAAS,Java验证和授权API)提供了灵活和可伸缩的机制来...本文首先向你介绍JAAS验证中的一些核心部分,然后通过例子向你展示如何开发登录模块。
- **《Java Security》**: 本书深入介绍了Java平台的安全模型和机制,包括JAAS在内的多个安全框架。 - **Java.net**: 官方网站提供了丰富的JAAS相关文档和技术文章,是学习JAAS的好地方。 - **Oracle官方文档**: ...
1. **基础理论**:书中可能首先介绍了JAAS的基本概念,如认证主体(principal)、认证模块(login module)、授权策略(authorization policy)等,这些都是理解JAAS运作的基础。 2. **JAAS架构**:JAAS的模块化...
JAAS In Action,这是一本没有公开发表的书,但是里面介绍JAAS的基本概念还是很精彩的。 1. Introducing JAAS JAAS, the Java Authentication and Authorization Service, has been a standard part of the Java ...
一本介绍JAAS体系架构的好书,本书开始详细阐述了JAAS的体系架构和相关概念,后半部分用了大量的例子教读者如何配置并实现自己的JAAS模块,尤其最后详细介绍了JAAS在WEB应用中如何配置实现,对当前大量的B/S开发人员...
这份材料似乎是一份教学幻灯片的摘要,重点介绍了JAAS的基本概念、登录上下文(LoginContext)、回调处理器(CallbackHandler)、以及登录模块(LoginModule)等内容。 ### JAAS简介 JAAS是Java平台提供的一个认证...
博主可能在博客中详细介绍了如何配置和使用JAAS来保护应用程序,包括设置用户认证模块、定义安全角色、实现登录界面和处理权限控制等。 标签“源码”和“工具”暗示了压缩包可能包含了源代码文件和可能用到的一些...
在"JAASDemo.pdf"文件中,可能详细介绍了如何创建一个简单的LoginModule,如何配置jaas.conf文件,以及如何在Java代码中集成JAAS进行用户登录和权限控制。文件可能会提供一个示例程序,演示了从用户输入读取凭证,...
第10章介绍Java安全体系结构、密钥、消息摘要、数字签名、访问控制、安全套接口SSL、主体身份认证JAAS和公共密钥构架PKI技术。第11章简明地介绍移动代理编程技术。, 本书可作为高校计算机应用、网络信息、电子商务...
第10章介绍Java安全体系结构、密钥、消息摘要、数字签名、访问控制、安全套接口SSL、主体身份认证JAAS和公共密钥构架PKI技术。第11章简明地介绍移动代理编程技术。 本书可作为高校计算机应用、网络信息、电子商务...