posts - 23,comments - 12,trackbacks - 0

摘要
  Realm是一个用户数据库的概念,类似于Unix中的用户群组,它通过用户名和密码来标识一个用户,这个用户属于一定的角色(role)。而一个特殊的web应用资源,可以限定某个角色的用户才被许可访问。这种许可策略,使得web应用的整体权限控制与应用细节相剥离,从而获得更好的可配置性。下面我们通过比较常见的基于数据库,使用直接JDBC连接的Realm的配置使用情况,看看它是如何实现粗粒度的ACL的。(2004-03-13 11:21:34)

--------------------------------------------------------------------------------
By lanf

应用TOMCAT基于JDBC的的Realm (1)
作(译)者:Lanf From LinuxAID

Realm是一个用户数据库的概念,类似于Unix中的用户群组,它通过用户名和密码来标识一个用户,这个用户属于一定的角色(role)。而一个特殊的web应用资源,可以限定某个角色的用户才被许可访问。这种许可策略,使得web应用的整体权限控制与应用细节相剥离,从而获得更好的可配置性。下面我们通过比较常见的基于数据库,使用直接JDBC连接的Realm的配置使用情况,看看它是如何实现粗粒度的ACL的。

JDBCRealm

JDBCRealm是使用JDBC连接关系数据库的一个Tomcat 4 Realm接口的实现。它可以直接使用你现有的用户数据库表,来获取角色用户的信息,完成验证。你必须满足以下条件:

必须有个有效的数据表,里面有所有你需要通过Realm来认证的用户。这张表必须至少有两个字段,可以用来标示用户名和密码。
需要有一张表来标明用户与角色的对应关系,用户可以有任意个角色,没有角色也是合法的,这是和UNIX用户群组的不同之处。同样这个表也需要两个字段,来映射用户名与角色名的对应关系。
数据库准备

在我们的例子中,我们建两张新表来处理realm的认证。
create table users (
  user_name         varchar(15) not null primary key,
  user_pass         varchar(15) not null
);

create table user_roles (
  user_name         varchar(15) not null,
  role_name         varchar(15) not null,
  primary key (user_name, role_name)
);
 


JDBC驱动

你需要将你的JDBC启动包放在 $CATALINA_HOME/server/lib 目录或者 $CATALINA_HOME/common/lib 目录下,确保Tomcat能通过CLASSPATH找到它。使用mysql数据库的话,你可以使用类似 mm.mysql-2.0.4-bin.jar 的驱动包;Oracle 9i你可以使用ojdbc14.jar等Oracle自带的驱动;PostgreSQL可以在http://jdbc.postgresql.org/ 取得合适的驱动程序。

编辑server.xml

编辑$CATALINA_HOME/conf/server.xml文件,在host里添加如下片段(以MySQL为例)
 <Realm className = 'org.apache.catalina.realm.JDBCRealm' debug='0'
      driverName = 'org.gjt.mm.mysql.Driver'
connectionURL = 'jdbc:mysql://localhost/authority?user=dbuser&password=dbpass'
       userTable='users' userNameCol='user_name' userCredCol='user_pass'
   userRoleTable='user_roles' roleNameCol='role_name'/>

 


其中 jdbc:mysql://localhost/authority?user=dbuser&password=dbpass 是Mysql的连接串,你可以根据你的需要进行修改。其有关属性介绍如下: 属性 描述
className Realm的实现类,这里必须是 'org.apache.catalina.realm.JDBCRealm'
 
connectionName 数据库用户名
 
connectionPassword 数据库用户的密码
 
connectionURL 数据库的JDBC连接串
 
debug Debug的程度,它和Logger相关配置配合使用,值越高信息越详细,缺省为0
 
digest 存储密码的加密方式,如果不指定则是明文存储。指定为 java.security.MessageDigest 之类的类名则要看数据库里表中用户密码的存放格式。
 
driverName 数据库驱动程序类
 
roleNameCol 角色表的存放角色名的字段名.
 
userCredCol 用户表里存放密码的字段名
 
userNameCol 用户表中存放用户名的字段名
 
userRoleTable 角色表的表名(类似/etc/group)
 
userTable 用户表的表名
 


注意点

如果你对用户表进行了新增操作和修改操作,那么会实时作用于正要进行登陆操作的用户;
用户已经完成登陆后,你对它进行的删除修改操作,并不能实时作用于用户的当前状态,只能在此用户下次登陆的时候生效;(如果是基于表单认证的用户,是在会话结束或者他注销后当前认证失效;如果是基础认证的用户则需要等到当前窗口关闭)
对数据库里那两个表的增删改管理,你需要自行编写合适的业务代码,Tomcat并没有提供标准的实现,这是没有意义的。
编译者注:这部分内容是帮助newbie理解Realm而直接从Realm Configuration HOW-TO中摘译的,是我们完整例子所必须要了解并正确配置的部分,不过似乎没有看到类似的译文,就做了这件累赘的事情。这系列文章对熟手基本没有什么帮助,请见谅。

 

posted on 2005-08-17 09:41 my java 阅读(542) 评论(0)  编辑  收藏 所属分类: java身份认证转帖

只有注册用户登录后才能发表评论。


网站导航: