`
Gavin.Chen
  • 浏览: 325859 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

基于JAAS实现登录

阅读更多

本例是认证的实现,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

 

二、客户端调用

package javaapplication3;

import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;

/**
 *
 * @author Dao
 */
public class LoginManager 
{
  

  public LoginManager()
  {
    
  }
  
  public static void main(String[] args)
  {
    try
    {
      String username = "username";
      String password = "password";
      
      //此处指定了使用配置文件的“Sample"验证模块,对应的实现类为SampleLoginModule
      LoginContext lc = new LoginContext("Sample", new SampleCallbackHandler(username, password));
      
      //进行登录操作,如果验证失败会抛出异常
      lc.login();
    }
    catch (LoginException e)
    {
      e.printStackTrace();
    }
    catch (SecurityException e)
    {
      e.printStackTrace();
    }
  }
}

 

 

package javaapplication3;

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;

/**
 *
 * @author Dao
 */
public class SampleCallbackHandler implements CallbackHandler
{
  private String username;
  private String password;

  public SampleCallbackHandler(String username, String password)
  {
    this.username = username;
    this.password = password;
  }

  public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException
  {
    for (int i = 0; i < callbacks.length; i++)
    {
      if (callbacks[i] instanceof NameCallback)
      {
        NameCallback ncb = (NameCallback) callbacks[i];
        ncb.setName(this.username);
      }
      else if (callbacks[i] instanceof PasswordCallback)
      {
        PasswordCallback pcb = (PasswordCallback) callbacks[i];
        pcb.setPassword(this.password.toCharArray());
      }
    }
  }
}

 

三、验证实现

 

package javaapplication3;

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;

/**
 *
 * @author Dao
 */
public class SampleLoginModule implements LoginModule
{
  private boolean isAuthenticated = false;
  private CallbackHandler callbackHandler;
  private Subject subject;
  private SamplePrincipal principal;

  public SampleLoginModule()
  {
    
  }

  public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options)
  {
    this.subject = subject;
    this.callbackHandler = callbackHandler;
  }

  public boolean login() throws LoginException
  {
    try
    {
      NameCallback nameCallback = new NameCallback("username");
      PasswordCallback passwordCallback = new PasswordCallback("password", false);
      
      Callback[] calls = new Callback[]{nameCallback, passwordCallback};
      
      this.callbackHandler.handle(calls);
      
      //获得用户数据
      String username = nameCallback.getName();
      String password = String.valueOf(passwordCallback.getPassword());
      
      //TODO验证,如:查询数据库、LDAP。。。
      if (true)  //此处省去了实际的验证逻辑,在此假设验证通过
      {
        this.principal = new SamplePrincipal(username);
        
        this.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 this.isAuthenticated;
  }

  /**
   * 验证后处理,在Subject中加入用户对象
   * @return
   * @throws javax.security.auth.login.LoginException
   */
  public boolean commit() throws LoginException
  {
    if (this.isAuthenticated)
    {
      this.subject.getPrincipals().add(this.principal);
    }
    else
    {
      throw new LoginException("Authentication failure");
    }
    
    return this.isAuthenticated;
  }

  public boolean abort() throws LoginException
  {
    return false;
  }

  public boolean logout() throws LoginException
  {
    this.subject.getPrincipals().remove(this.principal);
    
    this.principal = null;
    
    return true;
  }
}

 

package javaapplication3;

import java.security.Principal;

/**
 *
 * @author Dao
 */
public class SamplePrincipal implements Principal
{
  private String name;

  public SamplePrincipal(String name)
  {
    this.name = name;
  }

  public String getName()
  {
    return name;
  }
  
  public boolean equals(Object ob)
  {
    if (ob instanceof SamplePrincipal)
    {
      SamplePrincipal principal = (SamplePrincipal) ob;
      
      return this.name.equalsIgnoreCase(principal.getName());
    }
    
    return false;
  }
  
  public int hashCode()
  {
    return name.toUpperCase().hashCode();
  }
}

 

分享到:
评论
3 楼 wby001 2010-03-26  
请问,那个启动配置文件是放在哪里,怎么启动?
2 楼 beyondtom 2009-09-26  
不错啊,刚刚配置了一下,可以运行
对了,在LoginManager.java的main的方法加入如下代码,就可以直接运行:
String username = "username";  
      String password = "password";  
      String jaasConfigFilePath = "d:/jaas.conf";
      System.setProperty("java.security.auth.login.config", jaasConfigFilePath);
      //此处指定了使用配置文件的“Sample"验证模块,对应的实现类为SampleLoginModule  
      LoginContext lc = new LoginContext("Sample", new SampleCallbackHandler(username, password));   
1 楼 niyong 2009-02-10  
你好;那个配置文件放那里?怎么放?

相关推荐

    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