`

基于JAAS实现登录

阅读更多

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 ;
} ;

此文件定义了一个“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  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  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.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();
  }

}
分享到:
评论

相关推荐

    JAAS登录验证文档,里面有详细步骤及例子

    6. **示例代码**:在“基于JAAS实现登录.htm”中,你可能找到一个实际的代码示例,展示如何集成JAAS到你的应用程序中。这可能包括如何创建登录模块,如何配置Jaas.conf,以及如何在代码中调用JAAS API进行登录尝试。...

    基于JAAS的Java安全编程

    ### 基于JAAS的Java安全编程 #### JAAS概览 JAAS(Java Authentication and Authorization Service,Java认证与授权服务)是Sun Microsystems为Java 2平台开发的一套安全框架扩展,旨在加强Java应用程序的安全性。...

    利用JAAS实现简单的页面验证与授权

    ### 利用JAAS实现简单的页面验证与授权 #### JAAS简介 Java Authentication and Authorization Service (JAAS) 是 Java 平台提供的一种安全框架,它主要用于实现应用级别的身份验证和授权服务。JAAS 的出现是对 ...

    jaas资料 基于JAAS和J2EE Web容器的验证与授权

    ### 基于JAAS和J2EE Web容器的验证与授权 #### 一、JAAS概述 Java Authentication and Authorization Service (JAAS) 是 Java 平台提供的一个强大的验证和授权框架,它允许开发者实现安全策略,从而确保应用程序...

    JAAS登录验证文档

    与传统的基于容器的身份验证不同,JAAS提供了更为灵活和强大的机制来处理用户的身份验证。 #### 二、JAAS配置文件及设置 在JAAS中,配置文件是非常重要的组成部分之一,因为它包含了进行身份验证所必需的信息。...

    基于JAAS的用户验证和控制模型的一般设计.doc

    本文将深入解析基于JAAS的用户验证和控制模型的一般设计,以及它如何帮助实现安全的用户登录和权限管理。 首先,JAAS的核心组件是`LoginContext`,它作为应用程序与JAAS框架之间的接口。`LoginContext`提供了一个...

    JAAS简介及实例

    描述中提到的“原代码”和“博文链接”意味着我们将看到一个实际的JAAS实现,这将帮助我们更好地理解JAAS的工作方式。JaasExample可能是这个实例的源代码文件,包含了登陆模块的实现和配置。 例如,一个简单的JAAS...

    JAAS简介及示例代码

    下面将详细介绍JAAS的工作原理、主要组成部分以及如何通过示例代码实现它。 JAAS的设计是模块化的,这意味着它能够适应各种不同的认证机制,如密码、数字证书等。其工作流程通常包括以下几个步骤: 1. **配置**:...

    JAAS认证与授权教程

    Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全性的关键组件,它提供了一种框架,使得应用程序能够实现用户身份验证和权限管理。在这个教程中,我们将深入探讨JAAS的核心概念、工作...

    JAAS in Web Applications

    登录模块可以是基于数据库的、LDAP目录的,甚至可以是kerberos等更复杂的身份验证机制。 **2. JAAS配置** - **jaas.conf文件**:这是JAAS的主要配置文件,定义了不同的安全领域( realms )和对应的登录模块。 - **...

    JAAS In Action download

    在实际开发中,一些工具和库可以帮助简化JAAS的使用,例如使用Spring Security整合JAAS,或者利用开源的登录模块实现。这些工具通常提供更高级别的抽象,使得安全设置更加容易和灵活。 总结,Java Authentication ...

    JAAS:灵活的Java安全机制

    通过添加验证主题(即用户或其他实体)的能力以及基于验证标识的授权功能,JAAS极大地增强了Java的安全性。JAAS通过引入一个抽象层,使得应用程序能够独立于底层的具体验证和授权机制,从而简化了涉及Java Security...

    java软件包文件 jaas.jar

    - **登录模块(Login Modules)**:登录模块是实现认证的具体逻辑,是JAAS的核心组件。它们实现了 `javax.security.auth.spi.LoginModule` 接口,负责实际的用户验证工作。每个登录模块都有其特定的认证方式,如使用...

    JAAS Demo

    - **统一的API**:无论底层采用何种技术实现,JAAS都提供了一致的编程接口(SPI),便于应用程序调用。 - **灵活性与扩展性**:JAAS的设计理念强调灵活性和扩展性,支持各种复杂的认证场景。 #### 三、JAAS的核心...

    JAAS认证(mac版tomcat)

    通过编写自定义的LoginModule和配置JAAS,你可以实现特定的认证需求,确保只有授权用户才能访问敏感资源。记得在部署时,要仔细检查每个步骤,确保所有配置都正确无误,以保证系统的稳定性和安全性。

    Weblogic扩展JAAS身份验证案例

    JAAS是Java平台中的安全框架,允许开发者为应用程序实现灵活的身份验证和授权机制。 首先,我们需要理解JAAS的基本概念。JAAS提供了一个框架,通过认证模块(LoginModule)来处理用户登录和验证。每个认证模块可以...

    JAAS简介及实例.

    JAAS设计为可插拔的系统,意味着开发者或第三方可以通过实现特定的接口创建自定义的登录模块(LoginModule)以满足特定的认证需求。登录模块是JAAS的核心,它们负责验证用户的身份,并根据验证结果分配权限给Subject...

Global site tag (gtag.js) - Google Analytics