电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

扩展JAAS


发布日期:2021/5/12
 

用户认证和访问控制是大多数java应用的重要安全尺度特别是JEE应用Java认证和权限服务(即JAAS)JSE的核心API描绘表达了新的安全标准其提供了一个可插拔的(pluggable)和富有弹性的(flexible)框架(framework)允许开发者混合不同的安全机制和丰富的已经存在各种安全方面的资源

伴随着即将来临的JSE版本的发布它包含了许多诸如加密技术XML安全性公钥机制(PKI)Kerberos (是一个网络附加系统/协议可以允许用户通过一个安全伺服器的服务来验证 自己象远端登陆远端拷贝系统间的相互档拷贝和另外高风险任务的服务将被变 得相当安全和可控制)和结盟认证(the federating identity)的增强!JAAS将会在JEE实现中扮演一个更加重要的角色

认证

认证就是校验一个用户拥有使用已经被企业用户注册机构证明了的身份鑒定的权限的处理过程JAAS的认证机制建立于一整套可插拔的模块(参看图)基础上JAAS允许不同的验证模型在运行时可被插拔客户应用总是通过登陆上下文对象和JAAS交互

认证处理过程典型的要经过下面的步骤

生成一个LoginContext对象这个LoginContext寻找配置文件以决定使用那个LoginModule同样可选择的有可能传递一个CallbackHandler给LoginContext

通过调用LoginContext的login方法执行认证它会加载预定义的LoginModule去检验是否用户可以被认证

如果用户被认证那么用规则和标识和其所属项进行关联

或者在登陆失败的情况下跑出一个LoginException

使用LoginContext的logout方法进行注销登陆

在JAAS中登陆是一个两阶段(twophase)的处理过程第一阶段是登陆(login)阶段(就像上面所描述的)这个阶段唯一的任务是认证只要处理过程成功通过这个阶段认证处理过程就进入了提交(commit)阶段(如上步骤这一阶段LoginModule的commit方法被调用去关联所属子项相关的规则和标识

在JAAS中一个所属子项表示一个认证实体比如一个人或者一台设备它包含了一整套法则和安全相关的属性诸如密码和加密密钥在JAAS体系结构中所属子项和其所附属的相关权限扮演了重要的角色在认证过程当中所有的认证模块当中LoginModule是事实上的认证机制的借口虽然LoginModule决没有得到直接调用客户应用的机会但是他经由一个可插拔的模块提供了一个认证的具体类型其实现了认证的算法并且决定实际的认证过程是怎样被执行的

SUN提供了几个默认的LoginModule 实现securityauthmodule包里有诸如JndiLoginModuleKrbLoginModuleUnixLoginModule和NTLoginModule等几个LoginModule实现因为JAAS登录结构体系是可扩展的所以你只要在配置文件中指定使用哪个LoginModule模块就可以几乎全部插入任何LoginModule模块

如下即为一个配置文件的例子

MySample {

comsamplemoduleMyLoginModule required debug=true;

};

这里MySample是登录上下文环境(login context)的名字当你生成一个新的LoginContext开始认证过程时它会被传入LoginContex的构造函数中依据配置块提示那个文本块提醒JAAS有关LoginModule在登录过程中应该被用来执行认证另外对于LoginModule任何关于他的选项也可以在这里被指定在执行登录这一步骤的过程中CallbackHandler类被LoginModule类用来跟用户通信已便于取得认证信息CallbackHandler类处理三种类型的回调(Callback)NameCallback提示用户输入一个用户名PasswordCallcack提示输入密码TextOutputCallback报告错误警告或则发送给用户一些其他信息

授权是决定是否认证的用户可以执行一些动作的工作例如访问一处资源因为JAAS建立于已经存在的Java安全模型的基础上故这个过程时基于策略的策略配置文件实质上包含了一系列的入口诸如Keystore和/或grant

grant入口包含了所有的权限他是通过认证的代码或则法则被授予可以进行安全敏感的操作例如访问一个具体的Web页面或则本地的文件JAAS支持基于法则的策略入口赋权入口基本格式如下

grant Codebase codebase_URL Signedby signer_name

Principal principal_class_name principal_name

Principal principal_class_name principal_name

… {

permission permission_class_name target_name action

permission permission_class_name target_name action

}

上面格式中动作(action)可能是必需的或则可能被忽略依赖于权限类型在JAAS体系结构中策略对象表达了一个Java应用环境的系统安全策略和在任何时间事实上只有一个策略对象依据Java SDK文档默认的策略实现是sunsecurityproviderPolicyFile其中策略被指定在一个或多个策略配置文件里

只要用户被认证授权经由SubjectdoAs方法发生或者从Subject类的静态方法doAsPrivilegeddoAS方法用当前的AccessControlContext动态和子项并且同时调用run方法去执行动作他导致安全验证权限验证过程通过下面的步骤在图:

就像LoginModule策略也是可插拔的模型你可以挂上其它的策略实现通过在javasecurity的属性文件中改变policyprovider=sunsecurityproviderPolicyFile

到一个你项使用的策略类

Extend JAAS

JAAS建立于已经存在的Java安全模型的顶端其基于CodeSource和平面文本格式策略文件实现这可能对企业应用是不够用的你可能想使用可定制的安全仓库对于JAAS的其它实现诸如LDAP(轻型目录访问协议)数据库或者其他文件系统它可以通过编写你自己的可定制模块被完成感谢JAAS的可插拔的特性然而这需要对模块和JAAS中的处理过程有完善的理解同时你必须做许多编码去覆写相关的类并且处理好配置和策略两种文件

理想情况下我们愿意能够扩展JAAS以一个更加容易的方式以便于无论何时一个可定制的安全知识库或者不同的访问控制机制改变或者必须去增加时你能够只开发和插入这些不同的小模块(即适配器)去适应这些新的变化和需求并且在最好的情况下不必去理解和熟悉JAAS处理过程的细节同样我们也愿意能够去做这些变化仅仅通过改变一个配置文件另一个目标是我们的JAAS扩展组件能够被使用在不同的JEE应用中—独立的或者Web上的描述了JAAS扩展组件的设计意图我们的JAAS扩展组在实现可定制的LoginModule和策略模块时充分件利用了JAAS插拔式的体系结构这些模块中我们委派数据请求到适配器这些适配器的每个对于诸如数据取回的简单任务是隔离的所以你可以快速地使用不同的安全知识或者算法开发不同的适配器而不是尝试去实现不同的LoginModule或者策略模块它们更加复杂并且需要更多的努力

你可以从/java/sourceccfm下在完整的源玛

实现的AuthLoginModule类

AuthLoginModule类是我们定制的LoginModule实现LoginModule类是在JAAS中是一个可插拔组件并且服务于两个目的

鑒定认证用户

如果认证成公则用相关的负责人信息或者证书更新主题

LoginModule有个方法去实现功能让我们关注一下login()方法这个方法被调用以认证主题并且主要作两件事情

包含用户名和密码典型地LoginModule要调用CallbackHandler类的handle方法去得到用户名和密码

通过和数据源中的比较校验密码LoginModule从Callbacks取回用户名和密码(其默认期望用户接口的某种排序)这一点对于一个简单的演示程序或者就在命令行可是他对于一个JEE应用来说不太实用例如对于大多数的Web应用用户名和密码将比较典型的从一个form中读出在这种情况下使用JAAS认证会比较困难考虑我们不直接使用LoginModule解决方案是实现一个可定制的CallbackHandler类他会接收用户名和密码然后递交它们给LoginModule所以他没有必要提示用户输入信息

以下示例説明用户信息如何从JSP或者Servlet中传递

String userName = requestgetParameter (user);

String password = requestgetParameter(password);

LoginContext context = new LoginContext (MySample

new AuthCallbackHandler (userName password));

一旦拥有了用户名和密码在手AuthLoginModule类我们的LoginModule类的定制实现会经由LoginSourceAdapterFactory实例化LoginSourceAdapter并同时委派实际的认证过程到资源适配器适配器只不过是一个简单的类其从一个具体的数据适配器(比如数据库或者LDAP或者一些别的系统)领取用户信息提交阶段AuthLoginModule类从LoginSourceAdapter类取回相关的信息并且把他们和主题相关联

LoginSourceAdapter类

LoginSourceAdapter类是一个认证目的的资源适配器的接口它有个需要实现的方法

void initialize(Hashtable parameters):initialized方法被调用来以相关的参数初始化适配器此方法在对象生成后立即被调用并且优先于任何对其他方法的调用

boolean authenticate(String usernamechar[] password):此认证方法被调用来认证用户

String[] getGroupNames (String userName):getGroupNames方法被调用来在认证成功后得到相关的主要信息

void terminate ():这个方法在LoginModule类的logout方法被执行后调用它给适配器做一些清理工作的机会

AuthPoli

上一篇:线程中断(interrupt)使用方法

下一篇:设计模