JavaWeb-Tomcat安全域

概述

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

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

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

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

安全域的类型

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

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

  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,这两张表包含了所有的安全验证信息.

其实表名列名也可以自由命名,但需要与<Realm>元素的对应的属性值保持一致.

users

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

user_roles

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

配置<Realm>元素

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

<Realm className="org.apache.catalina.realm.JDBCRealm"
      driverName="org.gjt.mm.mysql.Driver"
   connectionURL="jdbc:mysql://localhost:3306/authority?user=dbuser&amp;password=dbpass"
       userTable="users" userNameCol="user_name" userCredCol="user_pass"
   userRoleTable="user_roles" roleNameCol="role_name"/>

表明用户在输入用户名密码后与端口号为3306MySQL中找到authority数据库,查找usersuser_roles两张表对应的信息是否一致,一致则放行.

更多域配置参考官网realm-howto

posted @ 2020-04-10 22:26  舒山  阅读(502)  评论(0编辑  收藏  举报