jdon 解惑授道,企业信息化解决之道
 

Jdon框架演示

JiveJdon3.0
源码下载

GoF设计模式

在线教程

社区精彩讨论

 





  《Java实用系统开发指南》 第六章

用户安全管理系统

  前面面的章节演示了一个简单的用户注册系统,但在中大型系统的分布式应用中,这个简单的用户注册系统已经完全不适用。同时,由于引入了复杂的资源权限控制访问机制,使得这样情况下的用户注册系统需要重新设计和架构。

                                                                                                                                                                                  J2EE提供了基于容器的用户安全管理框架,这个框架可以很方便地帮助解决在中大型分布式系统中的权限控制和验证问题。

6.1 需求分析

  在很多实际应用中,不只是简单地要求用户需要注册登录。还要求不同的用户对不同资源拥有不同的权限。某单位的新闻部门的某些人才拥有对外发布新闻的权限;每个部门只有对自己部门内部资源才拥有创建、修改权限,对于其他部门创建的资源如网页等只有浏览的权限。这些复杂的用户权限验证需要可以总结为如下几点:

  用户资料管理系统:对用户的注册资料进行管理。可进行用户资料的新增修改,能够查询获取丢失的密码。

  权限的验证和授权:拦截所有访问受保护资源的请求,检查该用户是否被授权访问该资源。

  可控制的资源限制访问:对于系统的资源,无论是数据或行为动作,对确定的一组用户都有限制访问。例如对于有的用户只允许读操作,不能进行写操作;有些资源只有创建者才可以访问和操作等。

                                                                                                                                                                  这3种需求适合大部分应用系统,通过它们的实现,可以形成一个用户安全管理方面的组件框架,并且能够重复地在不同的应用系统中使用。

6.2 架构设计

  实现一个完整的用户安全管理框架,可以有两种实现途径。在J2EE出现以前,大部分是由应用系统本身实现。因此,很多有经验的软件商都拥有自己成熟的用户安全管理系统,但是缺点也是比较明显,自己设计的用户安全管理系统可重用性低,有的和具体应用程序过分紧密地绑定在一起,无法移植到其他系统上。

                                                                                                                                                      但是,随着业务量上升,应用系统的不断增加,会出现不同应用系统拥有不同的用户登录验证体系,很显然,这给用户访问带来了不方便,用户不可能为每个系统注册一套用户和密码,定制一套用户角色。因此,整个服务器群中需要统一的用户权限验证体系。而J2EE容器的用户安全管理框架再辅助以LDAP或数据库系统,可以很方便地达到这个目标。


6.2.1 
角色

  J2EE容器的用户安全框架是基于RBAC(Roled-Based Access Control,相关网址:http://csrc.nist.gov/rbac/)设计模型建立的,这是一个基于角色的访问权限控制模型。

  首先必须了解角色的含义,在RBAC中角色Role的定义是:Role是明确表达访问控制(Aceess Control)策略的一种语义构建词。

  角色可以是指做某些事情的资格,比如医生或物理学家;也可以包含权力和责任的意思,如部门经理或局长等。角色和组(groups)是有区别的。组就是纯粹代表一群用户;角色一方面代表一系列用户,另外一方面可以代表一系列权限,因此可以说是用户和权限的结合体。

引入角色的概念主要是为了分离用户和访问权限的直接联系。用户与访问权限的直接组合可能是短暂的,而角色则可以相对稳定,因为一个系统中和角色相关的权限变化是有限的。


6.2.2  J2EE
JAAS

  通过使用J2EE容器提供的JAAS (Java Authentication Authorization Service,Java验证和授权API),JAAS是J2EE服务器用来帮助应用系统实现安全功能的。当应用系统的开发者具体实现了LoginModule API,那么J2EE容器就执行LoginModule接口,通过接口和具体实现之间的关系,J2EE容器将结合具体应用系统实现特定的JAAS功能。


6.2.3 
单点登陆

  单点登录(SSO,single sign on)是指在分布式环境下,整个系统只有一个可以登录进入的点,它对所有的请求(Request)都是通用的。单点登录可以保证用户能够访问到可以访问的资源,如果有一个未被授权的请求要求访问被保护的资源,这个请求将自动被导向到相应的验证点进行登录验证。

                                                                                                                              J2EE容器支持单点登录模式的实现。通过使用J2EE Web层安全机制,可以保护Web层的一些资源如URL、URL模型以及HTTP的提交方式(POST或GET等)。当未被授权的用户访问这些受保护的资源时,J2EE容器会自动将用户导向到规定的登录界面,要求用户输入用户名和密码。


6.2.4 
邮件发送组件

  在本项目用户管理的需求中,需要对丢失的密码进行查询。输入用户的信箱,系统将查询后的密码发往用户的信箱。这将使用JavaMail连接专门的SMTP服务器进行信件发送,这个信件的发送过程有可能因为网络原因或其他未知原因导致处理时间延长,如果系统中的其他处理事务都要等待这个过程的完成,显然是没有效率而且问题会很多。

                                                                                                          采用JMS的邮件发送组件是基于一个异步消息机制的可重用系统,该组件系统采取session bean作为Queue的消息生产者,而MDB作为Queue的消息使用者,作为EJB的一个实现,可以重复使用在需要邮件发送功能的应用系统中,如图6-4所示。

6.3 详细设计和实现
6.3.1 
业务对象建模
6.3.2 
数据库设计
6.3.3 
实体Bean实现
6.3.4  Session Bean
实现
6.3.5  EJB
容器安全配置

  J2EE容器的安全管理框架以角色为联系纽带,分两个方向。一个是用户资料系统;另外一个是访问权限系统。后者是通过web.xml或ejb-jar.xml配置实现的。

  在本项目中,为了限制角色对某些类或方法的访问权限,可以在ejb-jar.xml中设置。

<assembly-descriptor>

<security-role>

<description>the role is super user </description>

<role-name>Admin</role-name>

</security-role>

<security-role>

<description>register user</description>

<role-name>User</role-name>

</security-role>

<method-permission>

<role-name>User</role-name>

<method>

<ejb-name>RoleManager</ejb-name>

<method-name>*</method-name>

</method>

</method-permission>

</assembly-descriptor>

                                                                                          在本EJB中定义了两个角色:Admin和User(当然可以根据实际情况定义角色)。具体的权限是在method-permission中设置,可以指定某个类的具体方法,“*”表示所有的方法。

6.4 JMS邮件发送组件

  JMS中的消息类型有两种:Topic和Queue。Topic的操作是使用发布/订阅(publish/subscribe)的方式;Queue的操作是点对点(ponit to point)的方式。

  publish/subscribe:发布者(publisher)发布消息到Topic,订阅者(subsribe)从Topic订阅消息,订阅者的数量是不受限制的。

  ponit to point:点对点传输消息,建立在消息队列Queue的基础上,每个消息使用者只对应一个消息队列,不像publish/subscribe那样可以有很多消息使用者。

                                                                              本项目中,可以由单个独立的程序来实现邮件发送,这个程序作为一个消息使用者,只需一个就可以了,因此使用Queue来实现。


6.4.1 
消息发送器

  AsyncSender属于消息生产者,它是具体应用系统直接调用的,可以使用无状态Session Bean来实现。

  在AsyncSender中,首先要通过JNDI获得一个ConnectionFactory,创建一个QueueConnection实例,这样就获得与JMS Provider的一个连接。再由这个QueueConnection创建一个QueueSession,这样就启动了一个和JMS Provider连接相关的线程,这个线程可以是发送或接收消息。


6.4.2  MDB

  在Queue的另外一端是消息的使用者。MDB(Message-Driven Beans)专门处理JMS异步消息,Session Bean和Entity Bean只允许同步地去发送消息和接收消息,不支持异步。MDB是一个message listener,它能够从一个Queue或一个durable subscription中可靠地接收消息。

  MDB与一个普通的消息使用者客户端的区别是,EJB容器将自动做下面的事情,无需应用者再自己编程实现:

  创建一个消息接受者(QueueReceiver/TopicSubscriber)接收消息。在部署时,将destination和ConnectionFactory与MDB联合起来。在JBoss中通过指定destination-jndi-name来实现。

  自动实现message listener接口(无需调用setMessageListener方法)。

  容器自动指定了消息签收模式。

                                            因此,使用MDB作为消息的使用者就非常简单,而且没有home和remote接口,只有一个bean类。

6.5 WEB层的实现

6.5.1  用户资料管理
6.5.2  WEB
容器安全配置
6.6
调试 配置和运行

  采用J2EE容器的安全机制实现本项目的安全框架。虽然代码编程工作减少,但带来的是详细而复杂的J2EE配置,在前面章节已经分别介绍在Web容器和EJB容器下如何实现角色的访问权限限制。在Web容器中,可以指定角色对路径模式(path pattern)的访问权限;在EJB容器中,可以指定角色对具体EJB类及其方法的访问权限。


6.6.1  JAAS
配置

  下面需要定制自己的LoginModule,在JBoss中已经绑定提供两个LoginModule。

  org.JBoss.security.plugins.samples.LdapLoginModule 是通过JNDI访问LDAP 服务器的LoginModule,详细用法参考JBoss使用手册。

  org.JBoss.security.plugins.samples.DatabaseServerLoginModule是基于数据库JDBC的LoginModule,基于两个基本逻辑表:Principals 和 Roles,在Principals表中有两个字段principalID和有效的password;而Roles表中有字段principalID和Role以及RoleGroup。

                          本项目可以直接使用DatabaseServerLoginModule作为LoginModule,配置JBoss/server/default/conf下的login-config.xml文件


6.6.2 
邮件服务的配置

  本项目中使用了邮件发送组件来发送用户丢失的密码,在开发配置中,需要3个配置在部署时配置J2EE服务器。前两个是QueueConnectionFactory和Queue,在JBoss中通过配置文件jbossmq-service.xml和jbossmq-destinations-service.xml(依JBoss具体版本有所区别)设置,这些可以参考JBoss手册配置自己的设置。在本项目中,这两个设置使用了现成的JBoss配置java:/ConnectionFactory和testQueue。


6.6.3  
部署和发布

6.7 小结

  本章主要是讨论如何利用J2EE容器的安全框架来实现应用系统的安全管理功能,这些操作实现原理可以应用于任何需要安全机制的系统。

  相比前面章节讨论的“简单的用户注册系统”,本章部分操作显得过于复杂,但是这些技术的选用都是依据不同应用要求作出的。

  使用J2EE容器的安全框架比较适合一些中大型项目,在这些项目中,数据量以及访问量都比较大,运行的J2EE服务器可能达到几十台甚至几百台,而且运行内容都千差万别。如何在这样一个复杂的分布式系统中实现一个统一的用户安全管理机制?使用J2EE的JAAS以及LDAP支持的单点登录才能满足这样的大型应用。

 





联系我们 | 关于我们 | RSS订阅 | 广告联系 | 网站地图 | 加入收藏夹
Copyright (C) 2006 Jdon.com, All Rights Reserved 版权所有 上海解道计算机技术有限公司
沪ICP备05018152号 如有意见请与我们联系 Powered by JdonFramework