java 认证和授权(jaas Java Authentication and Authorization Service)

     Java的认证部分主要负责确定程序使用者的身份。而授权则是将各个用户映射到相应的权限。例如,我们登陆的时候会进行用户名密码的校验这个过程可以理解为认证的过程。当校验通过之后,将会根据事先配置好的数据(数据库中存储的或者配置文件中配置的等)进行权限的分配,这个过程可以理解为授权。

 Java认证:


  认证的步骤:

  • 应用初始化一个LoginContext。
  • LoginContext咨询一个login配置,并加载指定入口配置的所有LoginModules。
  • 应用调用LoginContext的login方法。
  • LoginContext的login方法触发所有加载的LoginModules的login方法,每一个LoginModule尝试认证该用户,如果认证成功就将一个相关的身份和凭证关联到该Subject上。
  • LoginContext将认证状态返回给应用。
  • 如果认证成功,应用可以通过LoginContext获得用户(Subject)信息。

为了让JAAS授权生效,提供不仅基于代码来源,还基于谁在运行它的访问控制许可,需要以下几步:


  • 用户必须已经被认证
  • 认证后的用户信息(Subject)必须与安全控制上下文关联起来,通过Subject.runAs和Subject.runAsPrivileged
  • 必须配置基于用户身份的安全规则

  涉及到的类和方法:

  javax.security.auth.login.LogingContext类

  • LoginContext(String name) 创建一个登录上下文。name对应于jaas配置文件中的登录描述。
  • void login() 建立一个登录操作,如果登陆失败,则抛出一个LoginException异常。它会调用jaas配置文件中的管理器上的login方法。
  • void logout() Subject退出登陆。它会调用jaas配置文件中的管理器上的logout方法。
  • Subject getSubject() 返回认证过的Subject。

 javax.security.auth.Subject类          

  • Set<Principal>     getPrincipals() 获取该Subject的各个Principal。
  • static Object doAs(Subject subject,PrivilegedAction action)
  • static Object dosAs(Subject subject,PrivilegedExceptionAction action)
  • static Object doAsPrivileged(Subject subject,PrivilegedAction action,AccessControlContext context)以subject的身份执行特许的操作。它将返回run方法的返回值。doAsPrivileged方法在给定的访问控制上下文中执行该操作。你可以提供一个在前面调用静态方法AccessController.getContext()时所获得的“上下文快照”,或者指定为null,以便使其在一个新的上下文中执行该代码。说明doAs和doAsPrivileged方法之间的区别主要在于doAsPrivileged的方法开始于一个新的上下文,允许将登录代码和“业务逻辑”的权限相分离。

java.security.privilegedAction     

  • Object run 必须定义该方法,以执行你想要代表某个主体去执行的代码。

java.security.PrivilegedExceptionAction

  • Object run() 必须定义该方法,以执行你想要代表某个主体去执行的代码。本方法可以抛出任何受

java.security.Principal

  • String getName() 返回该特征的身份标识。 

当用户通过认证,就可以附加一组权限。如:

grant principal com.sun.security.auth.NTUserPrincipal "harry"
{
   permission java.util.PropertyPermission "user.*", "read";
};

一个登陆策略由一个登录模块序列组成,每个模块被标记为required、sufficient、requisite或optional。以下是对这些关键字算法的描述:

  • 各个模块依次执行,直到有一个sufficient的模块认证成功,或者有一个requisite的模块认证失败,或者已经执行到最后一个模块时才停止。
  • 当标记为required和requisite的所有模块都认证成功,或者它们都没有被执行,但至少有一个sufficient或optional的模块认证成功时,这次认证就成功了。

类说明

    Principal:特征,特征描述了主体的某些属性,比如用户名、组ID或角色等。

    Subject:登录的主体,在登录时要进行认证,主体可以拥有多个特征。

自定义认证模块

说明:登录模块的工作之一是组装被认证的主体的特征集。如果一个登录模块支持某些角色,该模块就会添加Principal对象来描述这些角色。

官方文档:

Java认证  Java授权