上一级 首页 下一级
6 调试配置和运行
采用J2EE容器的安全机制实现本项目的安全框架。虽然代码编程工作减少,但带来的是详细而复杂的J2EE配置,在前面章节已经分别介绍在Web容器和EJB容器下如何实现角色的访问权限限制。在Web容器中,可以指定角色对路径模式(path pattern)的访问权限;在EJB容器中,可以指定角色对具体EJB类及其方法的访问权限。
而基于数据库系统实现的用户资料管理系统则是实现与角色相关用户存储、编辑等功能,这是需要代码编程实现的。
以上容器配置和代码实现这两者之间的联系是以角色为中间纽带。在实际操作中,是通过LoginModule的配置将两者联系在一起的。
J2EE应用系统的配置分两大部分:一个是开发时的配置,如ejb-jar.xml、jboss.xml和web.xml配置等;另外一个是部署时的配置,主要完成开发配置中实现对容器资源的JNDI或其他资源调用,例如CMP对容器的数据库源JNDI调用。在开发配置中,只配置到JNDI名称,那么JNDI名称到底对应哪个具体资源,这些都需要在部署时配置J2EE服务器。
本项目中主要使用了J2EE容器的安全框架,在开发配置中,只配置到security-domain 为java:/jaas/ JdonSecurity,但是java:/jaas/ JdonSecurity具体是怎样实现的,还需要在部署再配置J2EE服务器。
根据前面的架构分析知道,LoginModule是容器JAAS实现的关键,通过LoginModule,容器可以查询用户资料系统中的数据库,从而获得该用户名和密码是否与数据库中是否一致。如果一致,从数据库中获得角色名。当然这也使用于基于LDAP实现的LoginModule。
首先,要配置JBoss能够访问MySQL数据库,配置JBoss下server/default/deploy目录下的mysql-ds.xml文件,加入如下语句:
<local-tx-datasource>
<jndi-name>SSODS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/ssodb</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>banq</user-name>
<password>1234</password>
</local-tx-datasource>
</datasources>
其中jdbc:mysql://localhost:3306/ssodb表示localhost主机上的数据库名为ssodb,访问用户名和密码分别是banq和1234。这样,JBoss容器就可以访问数据库服务器了。
下面需要定制自己的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文件:
<application-policy name = "SecurityRealm">
<authentication>
<login-module
code="org.JBoss.security.auth.spi.DatabaseServerLoginModule"
flag = "required">
<module-option
name = "dsJndiName">java:/SSODS</module-option>
<module-option
name = "principalsQuery">
select
password from user where userId=?
</module-option>
<module-option
name = "rolesQuery">
select
role, 'Roles' from role where userId=?
</module-option>
</login-module>
</authentication>
</application-policy>
在dsJndiName配置中,已经连接数据库ssodb。
principalsQuery配置是实现逻辑表Principals,“select password from user where
userId=?”是直接操作user数据表的SQL语句。userid和password对应ssodb数据表User中的两个字段,同时userid又对应Principals表的principalID,而password对应Principals表的password。这是逻辑表的一个约定规定,所谓逻辑表就是要提供的SQL查询语句满足逻辑表中的字段要求。这样就将用户资料的数据库系统和容器的JAAS联系了起来,这里类似是一个钩子(HOOK)。
rolesQuery配置是实现逻辑表Roles,在其SQL语句中,也提供了与逻辑表Roles一致的字段。这样,LoginModule就可以通过这条SQL语句直接访问保存在数据库ssodb中的数据了。
配置完成JAAS,就可以在EJB容器和Web容器中使用JdonSecurity这个realm,如在jboss-web.xml或jboss.xml中加入:
<security-domain>java:/jaas/SecurityRealm</security-domain>
这样,整个容器的安全管理框架就可以有机地联系在一起。
2 邮件服务的配置
本项目中使用了邮件发送组件来发送用户丢失的密码,在开发配置中,需要3个配置在部署时配置J2EE服务器。前两个是QueueConnectionFactory和Queue,在JBoss中通过配置文件jbossmq-service.xml和jbossmq-destinations-service.xml(依JBoss具体版本有所区别)设置,这些可以参考JBoss手册配置自己的设置。在本项目中,这两个设置使用了现成的JBoss配置java:/ConnectionFactory和testQueue。
因此,邮件发送组件需要在部署时配置的是Mail Service资源。在开发配置的jboss.xml中,将Mail Service以JNDI名为java:/Mail调用,那么需要在JBoss配置Mail Service,编辑JBoss/server/default/deploy下的mail-service.xml,将其中mail.smtp.host指定为一个SMTP 服务器。如果SMTP服务器需要验证,那么必须加入用户名和密码,如下:
<attribute name="User">xxxx</attribute>
<attribute name="Password">xxxx</attribute>
<property name="mail.smtp.auth" value="true"/>
SMTP 服务器是属于操作系统方面的系统设置,在Linux可以使用SendMail作为SMTP服务器,在Windows平台上可以通过管理工具配置SMTP服务器。
3 部署和发布
建立.ear项目文件,将需要的组件如邮件发送组件打包进来,复制到JBoss/server/default/deploy目录下,如果没有任何错误即表示发布成功。
本项目相当多地使用了容器特性,因此整合测试显得很重要,而且可能比较麻烦,但是只要依据框架标准准确地完成本项目各个部件,运行调试时的问题还是可以基本克服。
上一级 首页 下一级
|