Java认证与授权服务JAAS基础概念

JAAS是”Java Authentication and Authorization Service“的缩写,它提供了认证与授权的基础框架与接口定义,而且提供了良好的插件化机制。本文主要探讨JAAS的基础概念,这些概念也是认证与授权技术中的常用概念。

Subject

如果要授权访问一些资源,需要先对资源请求主体进行认证。JAAS框架中,使用Subject来描述这个资源请求主体与安全访问相关的信息,因此,一个Subject通常是指一个对象实体,或者一个服务。
Subject中所关联的信息,主要涉及:

  • 身份信息
  • 密码信息
  • 加密密钥/凭据信息

一个Subject可能拥有一个或多个身份,一个身份被称之为Principal,也就是说,一个Subject可能关联一个或多个Principals。
一个Subject可能涉及与安全有关的凭据信息(密钥/票据),称之为Credentials。敏感的Credentials需要特别的保护措施,例如,私有密钥信息,被保存在一个私钥集合中。而关于公有秘钥信息,则被保存在另外一个公钥集合中。

如下示例代码给出了如何为一个Subject添加Principal以及公钥信息:

Subject subject;
Principal principal;
Object credential;

// 获取所有的Principals列表,并且加入新的Principal。
subject.getPrincipals().add(principal);
// 获取公钥列表信息,并加入新的公钥列表。
subject.getPublicCredentials().add(credential);

LoginContext

认证上下文信息。LoginContext中提供了针对Subject对象进行认证的基础方法,每一个LoginContext都关联一个Context Name。LoginContext的关键方法如下:

  • login 登录/认证,该过程由具体的LoginModule代理完成。
  • logout 登出
  • getSubject 获取认证之后所创建的Subject对象信息

初始化一个LoginContext对象时,可以传入如下一些参数:

  • Context Name[必选]
  • Subject[可选]
  • CallbackHandler[可选]
  • Configuration[可选]

LoginModule

LoginModule提供了登录/认证的基础接口定义,所有的认证服务都需要实现该接口。一些典型的实现模块包括:

  • Krb5LoginModule 基于Kerberos的登录/认证服务模块
  • JndiLoginModule 基于用户名和密码的登录/认证服务模块
  • KeyStoreLoginModule 基于KeyStore的登录/认证服务模块

LoginModule中涉及到两个主要方法为login与’commit’:

login

对Subject进行认证。

这个过程中主要涉及到用户名和密码信息提示,校验用户密码。认证结果将会在LoginModule层面暂时保存。

commit

Commit过程首先确认LoginModule中保存的认证结果。认证成功之后,Commit方法将Subject内对应的Principals以及Credentials关联起来。如果Login方法认证失败的话,则该方法将会清理在LoginModule中保存的认证结果信息。

总结

本文主要介绍了JAAS中的三个基础概念:

  • Subject 描述要进行认证的对象实体/服务,以及与之有关的安全信息。
  • LoginContext 认证上下文,提供了登录/认证相关的基础方法。LoginContext的认证由具体的LoginModule实现。
  • LoginModule 认证服务接口类,不同的认证服务均需要实现该接口。

References

  1. Java Authentication and Authorization Service (JAAS) Reference Guide

本文源自:NoSQL漫谈(nosqlnotes.com)
除非特别注明,本站文章均为原创,转载请注明出处和链接。

One comment

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注