- 浏览: 864026 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (280)
- java相关 (29)
- linux系统 (55)
- ipsec (0)
- ssl (3)
- 信息安全 (13)
- web相关 (35)
- windows (9)
- c,c++ (14)
- log4j (3)
- hibernate (8)
- sqlite (1)
- 程序人生 (2)
- js (2)
- 生活点滴 (3)
- 网络相关 (14)
- 问题积累 (15)
- 数据库相关 (27)
- 软件测试 (2)
- PKI相关 (2)
- 程序设计 (7)
- 犄角旮旯 (0)
- 杂七杂八 (0)
- 硬件相关 (14)
- 防火墙 (2)
- 电子商务 (2)
- 多媒体相关 (1)
- 内存管理 (4)
- 面向对象 (1)
- csp (1)
- 驱动开发 (3)
- 移动开发 (2)
- openssl多线程实例 (1)
最新评论
-
xiaoyao3857:
博主很有探索精神嘛,学习了
Linux主机名Hostname详解 -
hiskyrisa:
言简意赅,好文章。
Flex是什么 -
layznet:
犯了类似错误。使用的是derby数据库。driverClass ...
java.sql.SQLException: No suitable driver -
idision:
你好,文章有一句createSubjectKeyId(keyT ...
bouncycastle 产生证书 -
zheng12tian:
代码有全的不?只贴一部分,,,,
在LOG4J中把日志写入远程数据库
JAAS:Java Authentication and Authorization Service,提供了认证和授权框架。
本例是认证的实现,JAAS定义了可插拔的认证机制,使认证逻辑独立开来,可通过修改配置文件切换认证模块。
官方参考:
http://java.sun.com/products/archive/jaas/
http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASRefGuide.html
security.pdf
一、配置文件及设置
1. 配置文件(假设为D:/jaas.conf):
Sample{
com.fastunit.samples.jaas.SampleLoginModule required debug = false ;
} ;
com.fastunit.samples.jaas.SampleLoginModule required debug = false ;
} ;
此文件定义了一个“Sample”验证模块,使用SampleLoginModule来进行验证。
2. 启用配置文件:
-Djava.security.auth.login.config=D:/jaas.conf
二、客户端调用
import
javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import javax.servlet.http.HttpServletRequest;
public class LoginManager {
public static boolean login(HttpServletRequest request) {
try {
String username = request.getParameter( " username " );
String password = request.getParameter( " password " );
// 此处指定了使用配置文件的“Sample”验证模块,对应的实现类为 SampleLoginModule
LoginContext lc = new LoginContext( " Sample " , new SampleCallbackHandler(
username, password));
lc.login(); // 如果验证失败会抛出异常
return true ;
} catch (LoginException e) {
e.printStackTrace();
return false ;
} catch (SecurityException e) {
e.printStackTrace();
return false ;
}
}
}
import javax.security.auth.login.LoginException;
import javax.servlet.http.HttpServletRequest;
public class LoginManager {
public static boolean login(HttpServletRequest request) {
try {
String username = request.getParameter( " username " );
String password = request.getParameter( " password " );
// 此处指定了使用配置文件的“Sample”验证模块,对应的实现类为 SampleLoginModule
LoginContext lc = new LoginContext( " Sample " , new SampleCallbackHandler(
username, password));
lc.login(); // 如果验证失败会抛出异常
return true ;
} catch (LoginException e) {
e.printStackTrace();
return false ;
} catch (SecurityException e) {
e.printStackTrace();
return false ;
}
}
}
import
java.io.IOException;
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 SampleCallbackHandler implements CallbackHandler {
private String username;
private String password;
public SampleCallbackHandler( final String username, final String password) {
this .username = username;
this .password = password;
}
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
for ( int index = 0 ; index < callbacks.length; index ++ ) {
if (callbacks[index] instanceof NameCallback) {
NameCallback ncb = (NameCallback) callbacks[index];
ncb.setName(username);
}
if (callbacks[index] instanceof PasswordCallback) {
PasswordCallback pcb = (PasswordCallback) callbacks[index];
pcb.setPassword(password.toCharArray());
}
}
}
}
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 SampleCallbackHandler implements CallbackHandler {
private String username;
private String password;
public SampleCallbackHandler( final String username, final String password) {
this .username = username;
this .password = password;
}
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
for ( int index = 0 ; index < callbacks.length; index ++ ) {
if (callbacks[index] instanceof NameCallback) {
NameCallback ncb = (NameCallback) callbacks[index];
ncb.setName(username);
}
if (callbacks[index] instanceof PasswordCallback) {
PasswordCallback pcb = (PasswordCallback) callbacks[index];
pcb.setPassword(password.toCharArray());
}
}
}
}
三、验证实现
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 SampleLoginModule implements LoginModule {
private boolean isAuthenticated = false ;
private CallbackHandler callbackHandler;
private Subject subject;
private SamplePrincipal principal;
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options) {
this .subject = subject;
this .callbackHandler = callbackHandler;
}
public boolean login() throws LoginException {
try {
NameCallback nameCallback = new NameCallback( " username " );
PasswordCallback passwordCallback = new PasswordCallback( " password " ,
false );
final Callback[] calls = new Callback[] { nameCallback, passwordCallback };
// 获取用户数据
callbackHandler.handle(calls);
String username = nameCallback.getName();
String password = String.valueOf(passwordCallback.getPassword());
// TODO 验证,如:查询数据库、LDAP。。。
if ( true ) { // 验证通过
principal = new SamplePrincipal(username);
isAuthenticated = true ;
} else {
throw new LoginException( " user or password is wrong " );
}
} catch (IOException e) {
throw new LoginException( " no such user " );
} catch (UnsupportedCallbackException e) {
throw new LoginException( " login failure " );
}
return isAuthenticated;
}
/**
* 验证后的处理,在Subject中加入用户对象
*/
public boolean commit() throws LoginException {
if (isAuthenticated) {
subject.getPrincipals().add(principal);
} else {
throw new LoginException( " Authentication failure " );
}
return isAuthenticated;
}
public boolean abort() throws LoginException {
return false ;
}
public boolean logout() throws LoginException {
subject.getPrincipals().remove(principal);
principal = null ;
return true ;
}
}
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 SampleLoginModule implements LoginModule {
private boolean isAuthenticated = false ;
private CallbackHandler callbackHandler;
private Subject subject;
private SamplePrincipal principal;
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options) {
this .subject = subject;
this .callbackHandler = callbackHandler;
}
public boolean login() throws LoginException {
try {
NameCallback nameCallback = new NameCallback( " username " );
PasswordCallback passwordCallback = new PasswordCallback( " password " ,
false );
final Callback[] calls = new Callback[] { nameCallback, passwordCallback };
// 获取用户数据
callbackHandler.handle(calls);
String username = nameCallback.getName();
String password = String.valueOf(passwordCallback.getPassword());
// TODO 验证,如:查询数据库、LDAP。。。
if ( true ) { // 验证通过
principal = new SamplePrincipal(username);
isAuthenticated = true ;
} else {
throw new LoginException( " user or password is wrong " );
}
} catch (IOException e) {
throw new LoginException( " no such user " );
} catch (UnsupportedCallbackException e) {
throw new LoginException( " login failure " );
}
return isAuthenticated;
}
/**
* 验证后的处理,在Subject中加入用户对象
*/
public boolean commit() throws LoginException {
if (isAuthenticated) {
subject.getPrincipals().add(principal);
} else {
throw new LoginException( " Authentication failure " );
}
return isAuthenticated;
}
public boolean abort() throws LoginException {
return false ;
}
public boolean logout() throws LoginException {
subject.getPrincipals().remove(principal);
principal = null ;
return true ;
}
}
import java.security.Principal;
public final class SamplePrincipal implements Principal {
private String name;
public SamplePrincipal(String name) {
this .name = name;
}
public String getName() {
return name;
}
public boolean equals(Object o) {
return (o instanceof SamplePrincipal)
&& this .name.equalsIgnoreCase(((SamplePrincipal) o).name);
}
public int hashCode() {
return name.toUpperCase().hashCode();
}
}
发表评论
-
关于Bad version number in .class file的问题
2010-11-15 14:20 999关于Bad version number in .class ... -
一个获取文件crc32校验码的简洁的java类
2010-05-12 19:48 3273从jdk1.4开始,java核心包里已经提供对crc计算的支持 ... -
Windows下Apache与Tomcat的整合
2010-05-12 13:52 1077为了完成这个任务,在 ... -
SSL双向认证java实现
2010-05-09 11:35 1795本文通过模拟场景,介 ... -
java.util.ResourceBundle 使用详解
2010-04-28 19:39 853一、认识国际化资源文件 这个类提供软件国际化的捷 ... -
什么是JAAS,以及灵活的Java安全机制
2010-04-25 22:05 1888今天在论坛上看到JASS,不清楚是什么呢,网上找了一下,受益良 ... -
Java插件技术
2010-04-25 21:31 21451.Java插件技术 Java插件技术(Java Plu ... -
java RMI的例子(转)
2010-04-25 21:11 948参考别人的程序后写了个自己的RMI 程序RMI ,远程方法 ... -
Java安全通信、数字证书及应用实践(转)
2010-04-21 21:05 1673摘要 : 在本文 ... -
Eclips 内存溢出
2010-04-13 16:26 1039在Eclipse 根目录下找到eclipse .ini ... -
Eclipse 启动不起来异常:JVM terminated. Exit code=-1
2010-04-11 10:09 7458Eclipse 启动不起来,出现以下错误: ... -
Java程序员需要了解的几个开源协议介绍
2009-12-21 21:32 1117介绍几个比较常见的开 ... -
apache lucene介绍
2009-12-15 09:16 1948什么是lucene Apache Lucene是一个开放源程序 ... -
Java基础:Java中堆内存与栈内存分配浅析
2009-08-11 20:19 1346Java 把内存划分成两种:一种是栈内存,另一种是堆内存 ... -
对synchronized(this)的一些理解
2009-07-23 10:21 1173一、当两个并发线程访问同一个对象object中的这个synch ... -
Linux下JNI调用
2009-07-09 12:43 1458整个实现过程可以分为五步来完成: 1)写一个声明了nativ ... -
如何在Java中执行其它程序
2009-07-09 12:42 2305在编写Java程序时,有时 ... -
linux下jdk的安装与卸载
2009-07-06 10:46 2103下面是卸载步骤: 用ro ... -
JNI技术小试
2009-06-23 14:28 1231目前 java 与 dll 交互的技术主要有 ... -
java.util.Date和java.sql.Date的区别及应用
2009-06-21 14:35 1135java.util.Date 就是在除了SQL语句的情况下面使 ...
相关推荐
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...
下面将详细介绍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...