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的认证原理
(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代码
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代码
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代码
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代码
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
**简单明了地说明了java验证、授权机制(看到好的文章,就情不自禁的转到自己的空间里了)
分享到:
相关推荐
在本文中,我们将深入探讨 JAAS 的核心概念、工作原理以及如何通过代码实现来理解这个规范。 首先,让我们了解一下 JAAS 的基本概念: 1. **身份验证(Authentication)**:这是确定用户身份的过程,通常通过...
标题“JAAS简介及实例”表明我们将探讨JAAS的基本概念、工作原理,以及如何通过一个实际的示例来应用它。JAAS主要由以下几个组件组成: 1. **登陆模块(Login Module)**:这是JAAS的核心,负责进行用户身份验证。...
jaas.jar jaas.jar jaas.jar
下面将详细介绍JAAS的工作原理、主要组成部分以及如何通过示例代码实现它。 JAAS的设计是模块化的,这意味着它能够适应各种不同的认证机制,如密码、数字证书等。其工作流程通常包括以下几个步骤: 1. **配置**:...
在这个教程中,我们将深入探讨JAAS的核心概念、工作原理以及如何在实际项目中应用。 首先,我们要理解认证(Authentication)和授权(Authorization)的基本概念。认证是确定用户身份的过程,而授权则是决定已认证...
通过本篇介绍,我们了解了JAAS的基本原理和使用方式,以及如何通过Java 2 Policy文件来增强安全性。JAAS的强大之处在于其灵活性和可扩展性,开发者可以根据具体应用场景选择合适的身份验证模块和技术。未来随着安全...
Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全性的框架,主要用于用户身份验证和权限授权。在Java应用程序中,尤其是服务器端应用,确保只有合法的用户能够访问资源是至关重要的。...
通过阅读这些章节,你可以更深入地理解JAAS的工作原理,如何集成到你的应用程序中,以及如何定制和扩展它的功能。 ### 五、工具支持 在实际开发中,一些工具和库可以帮助简化JAAS的使用,例如使用Spring Security...
Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全性的关键组件,它提供了一种标准框架来实现用户身份验证和授权。在Web应用程序中,JAAS被用来控制对资源的访问,确保只有经过验证的用户...
这篇博客文章将通过一个实际的样例,帮助我们深入理解JAAS的工作原理和用法。 1. **配置文件(sample_jaas.config)** JAAS 配置文件定义了认证机制和策略。`sample_jaas.config` 文件中可能包含了一个或多个配置...
为了更好地理解JAAS的工作原理和应用方法,我们可以考虑一个简单的示例。假设我们需要开发一个企业级应用,该应用需要支持多种认证方式(如用户名/密码、LDAP认证等),并且能够根据不同用户的角色分配不同的权限。 ...
### JAAS登录验证知识点 #### 一、JAAS概述 Java Authentication and Authorization Service(JAAS)是Java平台提供的一种安全框架,它允许开发者为应用程序添加认证和授权功能。与传统的基于容器的身份验证不同,...
标题 "websphere 6 JAAS登陆例子" 描述了一个在Websphere 6版本中集成LDAP用户和实现Single Sign-On (SSO)的实践案例。这个主题涉及到Java Authentication and Authorization Service (JAAS)的安全框架,以及它如何...
Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全管理的框架,它是Java Cryptography ...通过理解和掌握JAAS的工作原理,开发者可以更好地控制应用程序的访问控制,提高系统的安全性。
Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全认证和授权的核心组件。它为开发者提供了一种标准的方式来管理用户的身份验证和访问控制,从而确保应用程序的安全性。在本精讲中,我们...
为了充分利用这些资源,开发者应该首先了解JAAS的基本原理和工作流程,然后研究示例代码,了解它们是如何实现认证和授权的。此外,还可以通过调试和修改示例来加深对JAAS的理解,以适应自己的应用场景。最后,将这些...
Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全性的关键组件,它提供了一种框架,用于在Java应用程序中实现认证(Authentication)和授权(Authorization)。`jaas.jar` 文件是这个...
### JAAS基础教程详解 #### 一、JAAS概述与背景 Java Authentication and Authorization Service (JAAS) 是Java平台提供的一种灵活且可扩展的安全机制,用于确保Java应用程序的安全性。JAAS的设计理念在于通过验证...