摘要
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 阅读(541)
评论(0) 编辑 收藏 所属分类:
java身份认证转帖