`

JAAS 认证

    博客分类:
  • j2ee
阅读更多

一 什么是JAAS

Java 认证和授权服务”(Java Authentication and Authorization Service,JAAS)是对 Java 2 SDK 的扩展。

JAAS 可分Authentication和Authorization 。

1)  Authentication:认证用户身份。看哪个用户在执行代码。通俗的来说就是哪个用户在执行操作。这个操作可能在某个application或bean或servlet上.

2) Authorization : 授权用户操作。也就是验证用户是否对指定资源有特定访问权限。好比某一用户是否有对指定文件的读取权限。

 

二 常用接口

CallbackHandler:用去用户信息,用于验证用户身份。

LoginModule:用于验证用户信息。

 

三 简单Demo

MyCallbackHandler.java

package authentication;
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 MyCallbackHandler implements CallbackHandler {

	@Override
	public void handle(Callback[] callbacks) throws IOException,
			UnsupportedCallbackException {
		for(Callback callback:callbacks){
			
			if(callback instanceof NameCallback){
				NameCallback nameCallback=(NameCallback)callback;
				
				String prompt=nameCallback.getPrompt();
				
				System.err.print(prompt);
				
				nameCallback.setName(new BufferedReader(new InputStreamReader(System.in)).readLine());
			}
			
			if(callback instanceof PasswordCallback){
				PasswordCallback passwordCallback=(PasswordCallback)callback;
				
				String prompt=passwordCallback.getPrompt();
				
				System.err.print(prompt);
				
				passwordCallback.setPassword(new BufferedReader(new InputStreamReader(System.in)).readLine().toCharArray());
			}
		}

	}
}

 

SampleLoginModule.java

package authentication;
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.login.LoginException;
import javax.security.auth.spi.LoginModule;
public class SampleLoginModule implements LoginModule {

    // initial state
    private Subject subject;
    private CallbackHandler callbackHandler;
    private Map sharedState;
    private Map options;

    // configurable option
    private boolean debug = false;

    // username and password
    private String username;
    private char[] password;

    public void initialize(Subject subject, CallbackHandler callbackHandler,
			Map sharedState, Map options) {
 
	this.subject = subject;
	this.callbackHandler = callbackHandler;
	this.sharedState = sharedState;
	this.options = options;

	// initialize any configured options
	debug = "true".equalsIgnoreCase((String)options.get("debug"));
    }

    public boolean login() throws LoginException {
		Callback[] callbacks = new Callback[2];
		callbacks[0] = new NameCallback("user name: ");
		callbacks[1] = new PasswordCallback("password: ", false);
	 
	    try {
			callbackHandler.handle(callbacks);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	    username = ((NameCallback)callbacks[0]).getName();
	    password = ((PasswordCallback)callbacks[1]).getPassword();
	   
	    if("admin".equals(username)&&"admin".equals(new String(password))){
	    	return true;
	    }
	    
	    return false;

    }

    public boolean commit() throws LoginException {
    	System.out.println(" =========== commit ==========");
	    return true;
    }

   
    public boolean abort() throws LoginException {
    	System.out.println(" =========== abort ==========");
    	return true;
    }


	@Override
	public boolean logout() throws LoginException {
		System.out.println(" =========== logout ==========");
		return true;
	}

   
}

 

SampleAcn.java

package authentication;
import javax.security.auth.login.LoginContext;
public class SampleAcn {
	public static void main(String[] args) throws Exception {
		LoginContext lc = new LoginContext("sample",new MyCallbackHandler());
		
		lc.login();
	}
}

 

sample_jaas.config

sample {
   authentication.SampleLoginModule required debug=true;
};

 

要设置的系统参数 -Djava.security.auth.login.config==src/authentication/sample_jaas.config

 

Demo认证执行流程:

LoginContext lc = new LoginContext("sample",new MyCallbackHandler());

构造LoginContext

lc.login();

 执行认证。因为系统参数设置

-Djava.security.auth.login.config==src/authentication/sample_jaas.config

所以认证配置文件是sample_jaas.config。因为构造LoginContext的时候传入的第一个参数是"sample".

所以在sample_jaas.config中查找名为sample的配置段。及

sample {
   authentication.SampleLoginModule required debug=true;
};

authentication.SampleLoginModule为指定的LoginModule实现。

因为构造LoginContext的时候传入的第二个参数是new MyCallbackHandler。所以MyCallbackHandler用于获取用户认证信息。

所以:在执行lc.login()时,会调用SampleLoginModule的login方法。而SampleLoginModule会通过MyCallbackHandler获取用户的认证信息。如果认证成功则返回true,否则返回false.

 

分享到:
评论

相关推荐

    JAAS 认证服务

    ### JAAS认证服务详解 #### 一、JAAS简介 JAAS(Java Authentication and Authorization Service)是Java平台提供的一种安全框架,用于实现客户端应用程序的安全认证和授权管理。它为Java应用提供了一种灵活的方式...

    JAAS认证与授权教程

    JAAS允许通过组合多个登录模块来支持多种认证机制,增强了系统的灵活性。 授权方面,JAAS不直接处理权限的分配,而是依赖于Java的访问控制机制,如Java Security Manager和Permissions。一旦用户通过了认证,应用...

    JAAS认证(mac版tomcat)

    **Java Authentication and Authorization Service (JAAS) 认证在Mac版Tomcat中的应用** Java Authentication and Authorization Service (JAAS) 是Java平台的核心组件,用于提供安全的用户认证和权限管理。在Mac版...

    JAAS Demo

    #### 六、JAAS认证流程 1. **初始化LoginContext**:创建LoginContext实例时需指定一个Configuration对象,该对象包含了LoginModule的配置信息。 2. **调用login()方法**:LoginContext的login()方法启动认证过程,...

    在JAAS基础上的Java安全编程

    公共类是由JAAS认证和授权部分共同使用的类,其中最重要的是`Subject`类。`Subject`类封装了一个主体的相关信息,包括标识、公有凭据、私有凭据等。 - **Subject 类** `Subject`类是JAAS的核心类之一,用于代表...

    JAAs验证机制.doc

    JaasAuthenticationProvider是Spring Security中处理JAAS认证请求的组件,其配置主要包括登录配置文件路径、登录上下文名称、回调处理器和权限授予器。在给定的示例中,`JaasAuthenticationProvider` 被配置为使用 `...

    JAAS两个可以运行的例子

    例如,可以通过Servlet过滤器来检查用户是否已经通过了JAAS认证,并具有执行特定操作的权限。 总结,这两个JAAS示例为我们展示了如何构建和配置自定义的登录模块,以及如何将它们集成到应用程序中进行用户认证和...

    Java JAAS安全认证 demo

    这个"Java JAAS安全认证 demo"是一个示例项目,旨在帮助开发者理解如何在Java应用中实施安全认证机制。JAAS是Java EE和Java SE应用程序进行安全控制的重要工具,它允许开发人员为不同的安全域定义灵活的身份验证策略...

    JAAS登录验证文档

    Java Authentication and Authorization Service(JAAS)是Java平台提供的一种安全框架,它允许开发者为应用程序添加认证和授权功能。与传统的基于容器的身份验证不同,JAAS提供了更为灵活和强大的机制来处理用户的...

    java JAAS登陆验证

    容器通常有自己的安全配置,但可以通过配置使其与JAAS交互,从而利用JAAS的认证和授权能力。 **总结** Java JAAS为Java开发者提供了强大的安全基础,允许他们灵活地处理用户认证和授权。理解并熟练使用JAAS对于...

    jaas规范实现代码

    3. **登录模块(Login Module)**:这是 JAAS 实现认证的核心部分,每个登录模块负责一种特定的认证方式。登录模块可以是本地系统账户验证,也可以是 LDAP、Kerberos 或其他外部认证服务。 4. **配置文件...

    JAAS简介及实例

    JAAS的核心理念是将认证(Authentication)和授权(Authorization)功能模块化,允许开发人员通过插件式的方式进行扩展。 标题“JAAS简介及实例”表明我们将探讨JAAS的基本概念、工作原理,以及如何通过一个实际的...

    JAAS In Action download

    - **配置(Configuration)**: JAAS配置文件定义了哪些登录模块将被用于特定的认证上下文,以及它们的执行顺序。 - **登录模块(Login Module)**: 登录模块是认证的核心,每个模块都有自己的认证策略。如果所有...

    基于JAAS的Java安全编程

    Java 2平台的安全框架主要关注代码来源的认证和控制,而JAAS则在此基础上增加了对代码执行者的认证和授权,从而实现了更加精细的访问控制。 随着互联网安全问题的日益凸显,JAAS作为一种强大的安全机制,在Java EE ...

    java软件包文件 jaas.jar

    Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全性的关键组件,它提供了一种框架,用于在Java应用程序中实现认证(Authentication)和授权(Authorization)。`jaas.jar` 文件是这个...

    acegi的详细配置实现

    JAAS认证提供者利用Java自带的JAAS(Java Authentication and Authorization Service)来实现认证逻辑。 ##### 8.2 配置 配置JAAS认证提供者涉及到创建回调处理器(CallbackHandler)和权限授予器(AuthorityGranter)...

    JAAS简介及实例.

    JAAS的主要目标是提供用户认证和授权服务,确保应用程序能根据用户的身份控制资源的访问。通过动态安全策略,JAAS允许开发者在不修改代码的情况下调整权限,提高了灵活性。 JAAS设计为可插拔的系统,意味着开发者或...

Global site tag (gtag.js) - Google Analytics