概述
安全域是Web服务器用来保护Web资源的一种机制.
在安全域中可以配置安全验证信息,即用户信息(包括用户名和口令),以及用户和角色的映射关系.
每个用户可以有一个或多个角色,每个角色限定了可访问的Web资源,一个用户可以访问其拥有的所有角色对应的资源.
安全域是Tomcat内置的功能,在org.apache.catalina.Realm接口中声明了把一组用户名,口令及所关联的角色集成到Tomcat中的方法.
安全域的类型
JDBCRealm: 通过JDBC驱动程序访问存放在数据库中的安全验证信息
DataSourceRealm: 通过JNDI数据源访问存放在数据库中的安全验证信息
JNDIRealm: 通过JNDI provider访问存放在基于LDAP的目录服务器中的安全验证信息
MemoryRealm: 在初始化阶段,从XML文件中读取安全验证信息,并把它们以一组对象的形式存放在内存中
JAASRealm: 利用JAAS(Java Authentication & Authorization Service,Java验证与授权服务)框架进行验证
不管配置哪一种类型的安全域,都包含以下步骤
在Web应用的WEB-INF/web.xml文件中为Web资源设置安全约束
在Tomcat的$CATALINA_HOME/conf/server.xml配置文件中,或者Web应用的META-INF/contex.xml文件中配置元素,并在这个元素中指定安全域的类名及相关的属性.形式如下:
可以嵌入到3中不同的容器元素中,这直接决定的作用范围:
嵌入位置
描述
嵌入到元素中
中所有虚拟主机上的所有Web应用共享这个Realm,例外情况是在这个下的活元素下还定义了自己的Realm元素
嵌入
下的所有Web应用共享这个Realm,例外情况是在这个下的元素下还定义了自己的Realm元素
嵌入到
只有元素对应的Web应用才能使用这个Realm
为Web资源设置安全约束
无论是哪种域,都必须先配置安全约束.用来定义受保护的资源,允许访问的角色及给用户提供登录渠道.
在Web应用的$project_base_dir/src/main/webapp/WEB-INF/web.xml文件中加入,和元素.
配置好了安全约束,就可以试试配置各个安全域了.
内存域
由org.apache.catalina.realm.MemoryRealm类来实现,从一个XML文件中读取用户信息,在默认的情况下,改XML文件为$CATALINA_HOME/conf/tomat-users.xml,参考:Tomcat用户角色配置
JDBC域
JDBC域通过JDBC驱动程序访问存放在关系型数据库中的安全验证信息.
用户数据库结构
一般需要在数据库中创建两张表:users和user_roles,这两张表包含了所有的安全验证信息.
其实表名列名也可以自由命名,但需要与元素的对应的属性值保持一致.
users
字段
字段类型
描述
user_name
varchar(15)
用户名
user_pass
varchar(15)
密码
user_roles
字段
类型
描述
user_name
varchar(15)
用户名
role_name
varchar(15)
角色
配置元素
当用户数据库创建好后,应该把数据库的驱动程序(jar)文件复制到$CATALINA_HOME/lib目录中,然后再在$CATALINA_HOME/conf/server.xml 文件的/或元素内加入如下元素:
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost:3306/authority?user=dbuser&password=dbpass"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>
表明用户在输入用户名密码后与端口号为3306的MySQL中找到authority数据库,查找users和user_roles两张表对应的信息是否一致,一致则放行.