Java应用程序 身份认证与授权机制(一)

认证与授权

认证是用户或计算设备用来验证身份的过程。授权是根据请求用户的身份允许访问和操作一段敏感软件的过程。这两个概念密不可分。没有授权,就无需知道用户的身份。没能认证,就不可能区分可信和不可信用户,更不可能安全地授权访问许多系统部分。

不一定要标识或认证个别实体;在某些情况下,可以通过分组,对给定组中的所有实体授予某种权限来进行认证。在某些情况下,个别认证是系统安全性必不可少的环节。

认证与授权的另一个有趣方面是,一个实体在系统中可以有几个角色。例如,用户可以同时是公司职工(表示他需要对公司的电子邮件有访问权)和该公司的会计师(表示他需要对公司财务系统有访问权)。

认证元素

认证基于以下一个或多个元素:

  • 您知道什么。该类别包括个别人知道而其它人一般不知道的信息。示例包括 PIN、密码和个人信息(如母亲的婚前姓)。
  • 您有些什么。该类别包括使个人能够访问资源的物理项。示例包括 ATM 卡、Secure ID 令牌和信用卡。
  • 您是谁。该类别包括如指纹、视网膜剖面和面部照片等生物测定信息。

通常,对于授权只使用一种类别是不够的。例如,ATM 卡通常与 PIN 结合在一起使用。即使物理卡丢失,用户和系统也能够安然无恙,因为小偷还必须知道 PIN 才能访问任何资源。

授权元素

有两种控制访问敏感代码的基本方法:

  • 声明性授权可以由系统管理员执行,他配置系统的访问权(即,声明谁可以访问系统中的哪些应用程序)。通过声明性授权,可以添加、更改或取消用户访问特权,而不影响底层应用程序代码。
  • 程序性授权使用 Java 应用程序代码来做授权决定。当授权决定需要更复杂的逻辑和决定(超出了声明性授权的能力范围)时,程序性授权是必需的。因为程序性授权被构建到应用程序代码中,所以更改程序性授权时要求重写应用程序的部分代码。

您将在本教程中学习声明性和程序性授权技术。

保护用户和代码

根据用户在代码中的可信度,Java 平台允许对计算资源(如磁盘文件和网络连接)进行细颗粒度的访问控制。Java 平台的大多数基本安全性特性都是为保护用户免受潜在的恶意代码破坏而设计的。例如,第三方证书支持的数字签名代码确保代码来源的身份。根据用户对代码来源的了解,他可以选择授予或拒绝对该代码的执行权。同样,用户可以根据给定代码来源的下载 URL 授予或拒绝访问权。

基于 Java 的系统上的访问控制是通过策略文件实现的,该文件包含的语句如下:

grant signedBy "Brad", codeBase "http://www.bradrubin.com" {

permission java.io.FilePermission "/tmp/abc", "read";

};

该语句允许由“Brad”签署并从 http://www.bradrubin.com 装入的代码读取 /tmp/abc目录。

其它 Java 平台特性(如缺少指针)进一步保护用户免受潜在的恶意代码破坏。JAAS 的认证和授权服务一起工作,提供了补充功能:它们防止敏感的 Java 应用程序代码遭到潜在的恶意用户破坏。

可插入认证模块

JAAS 实现可插入认证模块(Pluggable Authentication Module(PAM)框架的 Java 版本。Sun Microsystems 为其 Solaris 操作系统创建了 PAM;通过 JAAS,现在可以以独立于平台的形式使用 PAM

PAM 的主要用途是允许应用程序开发人员在开发时写入标准认证接口,并将使用哪些认证技术(以及如何使用它们)的决策留给系统管理员。认证技术是在登录模块中实现的,这些登录模块是在编写了应用程序之后部署的,并且在称为登录配置文件(本教程中名为 login.config)的文本文件中指定。login.config 文件不仅可以指定要调用哪些模块,而且还可以指定总体认证成功的条件。

PAM 使新的认证技术或技巧能更方便地添加到现有应用程序中。同样,可以通过更新 login.config 文件来更改认证策略,而不是重写整个应用程序。

  • JDK 1.4 是与下列 PAM 模块一起提供的。稍后,我们将在本教程中使用其中一个模块,并还要练习编写我们自己的两个模块:
   

JAAS 示例和图

在本教程中,我们将逐一研究 JAAS 示例应用程序的代码。为了对总体情况有所了解,下图显示了所有这些代码是如何组合在一起的。正在运行的示例(主程序 JAASExample)先使用两种技术(即两个登录模块)来认证用户,然后根据认证步骤的结果允许或禁止(或授权)访问两段敏感代码。

下面是 JAASExample 程序的图。下一页将描述操作流。


 附件: 您所在的用户组无法下载或查看附件

JAASExample 操作流

下面是由 JAASExample 图说明的总体认证与授权流的简要描述。以下每个步骤将在本教程的其它地方进行更为详细的描述。

我们从认证的第一步开始,就是要创建登录环境并试图登录。LoginContext是一个 Java 类,它使用 login.config 文件中的信息来决定要调用哪些登录模块以及将使用什么标准来确定是否成功。对本示例,有两个登录模块。第一个登录模块是AlwaysLoginModule,它不需要密码,所以它总是成功的(这是不切实际的,但它足以说明 JAAS 是如何工作的)。该模块用关键字required标记,表示它是成功所必需的(它总是成功)。第二个登录模块是PasswordLoginModule,它需要密码,但该模块的成功与否是可选的,因为它用关键字optional标记。这表示即使PasswordLoginModule失败,但总体登录仍可成功。

初始化之后,选择的登录模块经历由LoginContext控制的两阶段提交过程。作为该过程的一部分,调用UsernamePasswordCallbackHandler以获取个人(用Subject对象表示)的用户名和密码。如果认证成功,则Principal被添加到Subject中。Subject可以有许多Principal(在该示例中,是“Brad”“joeuser”),每个Principal都授予用户对系统的不同级别的访问权。这样就完成了认证步骤。

一旦认证完成,通过使用程序认证技术和doAs方法,用Subject来尝试执行一些敏感的工资单操作代码。JAAS 检查是否授予Subject访问权。如果Subject有一个授权访问工资单代码的Principal,那么允许继续执行。否则,将拒绝执行。

接下来,我们尝试使用声明性授权技术和doAsPrivilaged方法来执行一些敏感的职员信息操作代码。这次,JAAS 部署用户定义的特权(PersonnelPermission)、Java 策略文件(jaas.policy)和 Java 访问控制器(AccessController)用来决定是否可以继续执行。
发布了109 篇原创文章 · 获赞 9 · 访问量 57万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览