JavaWeb-Tomcat安全域

a 夏天 提交于 2020-04-11 08:42:56

概述

安全域是Web服务器用来保护Web资源的一种机制.

在安全域中可以配置安全验证信息,即用户信息(包括用户名和口令),以及用户和角色的映射关系.

每个用户可以有一个或多个角色,每个角色限定了可访问的Web资源,一个用户可以访问其拥有的所有角色对应的资源.

安全域是Tomcat内置的功能,在org.apache.catalina.Realm接口中声明了把一组用户名,口令及所关联的角色集成到Tomcat中的方法.

安全域的类型

安全域类型 类名 描述
内存域 MemoryRealm 在初始化阶段,从XML文件中读取安全验证信息,并把它们以一组对象的形式存放在内存中
JDBC JDBCRealm 通过JDBC驱动程序访问存放在数据库中的安全验证信息
数据源域 DataSourceRealm 通过JNDI数据源访问存放在数据库中的安全验证信息
JNDI JNDIRealm 通过JNDI provider访问存放在基于LDAP的目录服务器中的安全验证信息
JAAS JAASRealm 利用JAAS(Java Authentication & Authorization Service,Java验证与授权服务)框架进行验证

不管配置哪一种类型的安全域,都包含以下步骤

  1. Web应用的WEB-INF/web.xml文件中为Web资源设置安全约束

  2. Tomcat$CATALINA_HOME/conf/server.xml配置文件中,或者Web应用的META-INF/contex.xml文件中配置<Realm>元素,并在这个元素中指定安全域的类名及相关的属性.形式如下:

    <Realm className="xxxRealm" 其他属性...>
    

<Realm>可以嵌入到3中不同的容器元素中,这直接决定<Realm>的作用范围:

嵌入位置 描述
嵌入到<Engine>元素中 <Engine>中所有虚拟主机上的所有Web应用共享这个Realm,例外情况是在这个<Engine>下的<Host><Context>元素下还定义了自己的Realm元素
嵌入<Host> <Host>下的所有Web应用共享这个Realm,例外情况是在这个<Host>下的<Context>元素下还定义了自己的Realm元素
嵌入到<Context> 只有<Context>元素对应的Web应用才能使用这个Realm

为Web资源设置安全约束

无论是哪种域,都必须先配置安全约束.用来定义受保护的资源,允许访问的角色及给用户提供登录渠道.

Web应用的$project_base_dir/src/main/webapp/WEB-INF/web.xml文件中加入<security-constraint>,<login-config><security-role>元素.

直接参考配置安全约束,配置安全验证登录界面配置对安全验证角色的引用

配置好了安全约束,就可以试试配置各个安全域了.

内存域

默认就是内存域.

org.apache.catalina.realm.MemoryRealm类来实现,从一个XML文件中读取用户信息,在默认的情况下,改XML文件为$CATALINA_HOME/conf/tomat-users.xml,参考:Tomcat用户角色配置

JDBC域

JDBC域通过JDBC驱动程序访问存放在关系型数据库中的安全验证信息.

用户数据库结构

必须在数据库中创建两张表:usersuser_roles,这两张表包含了所有的安全验证信息.

users

字段 字段类型 描述
user_name varchar(15) 用户名
user_pass varchar(15) 密码

user_roles

字段 类型 描述
user_name varchar(15) 用户名
role_name varchar(15) 角色

配置<Realm>元素

当用户数据库创建好后,应该把数据库的驱动程序(jar)文件复制到$CATALINA_HOME/lib目录中,然后再在$project_base_dir/src/main/webapp/WEB-INF/context.xml文件的<Context>元素内加入如下<Realm>元素:

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!