文档章节

Tomcat中的领域(Realm)

摆渡者
 摆渡者
发布于 2017/07/24 21:06
字数 1380
阅读 20
收藏 0
点赞 0
评论 0

Servlet container和Web应用程序本身都可以控制Web应用程序资源的安全防护。在J2EE规范中,前者成为容器管理(container-managed)的安全防护,后者称为应用程序管理(application-managed)的安全防护。为了使用Tomcat的容器管理的安全防护机制,必须设定领域。领域只是用户、密码和角色的集合。

Tomcat包含以下几个常见的领域实现:UserDatabaseRealm、JDBCRealm、JNDIRealm与JAASRealm。另外,开发者可以创建额外的领域实现,以便作为其用户和密码的接口。领域在server.xml文件中以<Realm>元素指定:

<Realm className="some.realm.implementation.className"
       customAttribute1="some value"
       customAttribute2="other value"/>

UserDatabaseRealm

UserDatabaseRealm是从静态文件加载到内存中的,且直到Tomcat停止后才从内存中清除。事实上,Tomcat所用的用户、密码及角色只存在于内存中,换句话说,权限文件只会在启动时读入一次。在UserDatabaseRealm中分配权限的默认文件为$CATALINA_HOME/conf/tomcat-users.xml。

server.xml中resource的声明:

<Resource name="UserDatabase" auth="Container"
    type="org.apache.catalina.UserDatabase"
    description="User database that can be updated and saved"
    factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
    pathname="conf/tomcat-users.xml" />

server.xml中UserDatabaseRealm的配置:

<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>

tomcat-users.xml中users和roles的配置:

<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">
	<role rolename="tomcat"/>
	<role rolename="role1"/>
	<user username="tomcat" password="tomcat" roles="tomcat"/>
	<user username="both" password="tomcat" roles="tomcat,role1"/>
	<user username="role1" password="tomcat" roles="role1"/>
</tomcat-users>

user和password的意义很清楚了,不过这里要解释一下有关roles的含义。角色(roles)是一组用户,针对这组用户,Web应用程序可以定义一组特定的功能组合。

UserDatabaseRealm并非真正用于实际,因为它唯一的更新方式是编写能经由JNDI访问Realm的自定义servlet。而该servlet需要能修改内存中的用户数据库,或磁盘上的tomcat-users.xml文件,最后,还需要重启Tomcat以便使这些修改生效。

JDBCRealm

顾名思义,JDBCRealm是一个可以使用关系型数据库的领域。它比UserDatabaseRealm更灵活,并且能动态的访问数据库。例如:往数据库中新增一个账号,JDBCRealm就可以马上读取它。

server.xml中JDBCRealm的配置:

<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"  
       driverName="com.mysql.jdbc.Driver"  
       connectionURL="jdbc:mysql://localhost:3306/DB_NAME"  
       connectionName="DB_Username" 
       connectionPassword="DB_Password"  
       userTable="TABLE_Name"
       userNameCol="COLUMN_Username"      
       userCredCol="COLUMN_Password"  
       userRoleTable="ROLE_TABLE_Name" 
       roleNameCol="COLUMN_Role" />  

DataSourceRealm

这是一个通过JNDI访问配置好的数据源,来访问关系型数据库的一种Realm实现。

假如有个MySQL数据库叫"authority",并且包含下面的表:

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)
);

如果可以通过JNDI方式以"java:/comp/env/jdbc/authority"访问,此时:

server.xml中配置DataSourceRealm:

<Realm className="org.apache.catalina.realm.DataSourceRealm"
    dataSourceName="jdbc/authority"
    userTable="users" 
    userNameCol="user_name" 
    userCredCol="user_pass"
    userRoleTable="user_roles" 
    roleNameCol="role_name"/>

JNDIRealm

如果需要Tomcat从LDAP(Lightweight Directory Access Protocol,轻量目录访问协议)目录取得用户名称、角色及密码,则可以使用JNDIReam。它是一个非常有弹性的Realm实现,可以依据用户名、角色及密码的LDAP目录来验证用户的身份。同时还允许该数据用于许多不同的模式布局。它还可以递归的搜寻LDAP的层次目录,直到找到所需的信息为止。还可以在特定服务器的特定位置查找。

server.xml中JNDIRealm的配置:

<Realm className="org.apache.catalina.realm.JNDIRealm"
    connectionURL="ldap://localhost:389"
    userPattern="uid={0},ou=people,dc=mycompany,dc=com"
    roleBase="ou=groups,dc=mycompany,dc=com"
    roleName="cn"
    roleSearch="(uniqueMember={0})"/>

JAASRealm

JAASRealm是经由JAAS(Java Authentication and Authorization Service,Java验证与授权服务)验证用户的一种领域实现。JAAS实现了标准的“可插入式验证模块(Pluggable Authentication Module,PAM)”架构,此架构可让应用程序独立于验证实现之外。可以不修改应用程序本身而只需稍微修改应用程序的配置,在应用程序中插入全新或更新的验证实现。除此之外,JAAS还支持堆栈式的验证模块,从而在一个验证堆栈中,多个验证模块可以相互协同使用。

<Realm className="org.apache.catalina.realm.JAASRealm" 
    appName="MyFooRealm"
    userClassNames="org.foobar.realm.FooUser"
    roleClassNames="org.foobar.realm.FooRole"/>

CombinedRealm

这是一个特殊的Realm,顾名思义,它可以使用多个子的Realm(Realm可以嵌套)来对用户进行授权。也许你有多个“数据源”,也许你希望当有一个Realm停止工作的时候系统仍然不会崩溃,不管是什么需求需要同时使用多个Realm,这个CombinedRealm就能满足这个需求。授权将会按照子Realm的声明顺序依次进行,只要满足任何一个子Realm,都可以通过校验。

<Realm className="org.apache.catalina.realm.CombinedRealm" >
   <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
        resourceName="UserDatabase"/>
   <Realm className="org.apache.catalina.realm.DataSourceRealm"
        dataSourceName="jdbc/authority"
        userTable="users"
        userNameCol="user_name" 
        userCredCol="user_pass"
        userRoleTable="user_roles" 
        roleNameCol="role_name"/>
</Realm>

LockOutRealm

它继承与CombinedRealm,和CombinedRealm一样,与它一起工作的Realm需要嵌套在LockOutRealm中,而且也是只需要满足任何一个Realm即可。如果在一定的时间内多次尝试授权失败,它将会锁定这个用户。使用它时,不需要修改它下面的Realm配置,因为它是通过记录所有失败的登录(包括不存在的用户)来实现的。

下面是安装Tomcat后,server.xml中默认的配置:

<!-- Use the LockOutRealm to prevent attempts to guess user passwords via a brute-force attack -->
<Realm className="org.apache.catalina.realm.LockOutRealm">
    <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key 
        "UserDatabase".  Any edits that are performed against this UserDatabase are immediately
	    available for use by the Realm.  -->
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>

 

参考链接:

http://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html#UserDatabaseRealm

 

 

© 著作权归作者所有

共有 人打赏支持
摆渡者
粉丝 314
博文 169
码字总数 205794
作品 0
浦东
程序员
我如何使用JDBC和Tomcat和MySQL域吗?

身份验证可以由一个web应用程序控制或由容器(比如Tomcat 年代 W web应用程序中运行)。 Tomcat容器管理的安全是基于领域。 领域包含了用户的姓名,密码,和角色。 我配置了Tomcat(5.5.20版)是一...

五大三粗 ⋅ 2015/11/16 ⋅ 0

Shiro源码分析-初始化-Realm

在上一篇介绍SecurityManager的初始化过程中,也有realm的粗略介绍。 realm的概念在安全领域随处可见: 各种中间件的realm、spring security的realm、shiro的realm。。。如下: tomcat的rea...

Dead_knight ⋅ 2014/04/08 ⋅ 0

Tomcat认证授权与简单的SSO

回顾 在前几天,我使用apache+tomcat搭建了一个集群,有一个简单的网站应用。Apache httpd与tomcat集群。 今天在此基础上,我要为其开发一个登录页面,并开启网站的认证和授权。 基本概念 在...

xpbug ⋅ 2014/02/12 ⋅ 9

Tomcat配置详解

一、Tomcat定义 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一...

Mr_陈 ⋅ 2014/05/12 ⋅ 0

Tomcat tomcat-users.xml configuration example

This article describes the configuration of the tomcat-users.xml file forApache Tomcat 7 web server. tomcat-users.xml is the default user database for container-managed authenti......

五大三粗 ⋅ 2015/11/16 ⋅ 0

JDBCRealm Http Digest

JDBCRealm 授权信息存在关系数据库中, 通过JDBC驱动访问 数据库中必须至少有两张表,表示用户及角色 用户表必须至少有两个字段,用户名及密码 角色表必须至少有两个字段,用户名及角色 [htm...

kenzheng ⋅ 2015/12/21 ⋅ 0

同一服务启动多个tomcat

修改server.xml中的三个端口号 <?xml version='1.0' encoding='utf-8'?> <Server port="8006" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListen......

ylittlema ⋅ 2015/10/31 ⋅ 0

Tomcat基本结构和配置文件结构

Tomcat: Servlet and JSP APIs, JNDI and JMX APIs. Tomcat不是一个完整意义上的Jave EE服务器,它甚至都没有提供对哪怕是一个主要Java EE API的实现;但由于遵守apache开源协议,tomcat却又...

Hai_Mo ⋅ 2017/09/05 ⋅ 0

Tomcat的组件及配置文件(一)

tomcat的组件: tomcat运行在JVM中,运行在JVM中之后,它会启动一个JVM实例,这个JVM实例称之为叫做tomcat server; 一个server就是运行在JVM中的一个实例,这个实例内部跑的是tomcat; conn...

长得丑死了 ⋅ 06/21 ⋅ 0

tomcat 配成用 https方式访问

.1 确认存放keystore文件的位置(比如:D:TomcatGMAE3.0Tomcat) .2 在cmd中进入%JAVA_HOME%bin目录下,执行以下命令: keytool -genkey -alias tomcat -keyalg RSA -keystore d:TomcatGMAE3.......

指尖的舞者 ⋅ 2012/12/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从方法论到零售客户实践 解码阿里巴巴数据中台——2018上海云栖大会

摘要: 一、数据中台之道 6月8日,上海云栖大会进入了第二天的议程,数据中台专场论坛座无虚席,数据中台总架构师邓中华女士向在场的观众介绍了数据中台的衍生发展之道。 基于OneID、OneData...

阿里云云栖社区 ⋅ 16分钟前 ⋅ 0

Ubuntu部署django问题汇总

使用Anaconda3的Python3.6的pip安装UWSGI报错 原因是gcc版本不兼容,安装4.7并修改gccsudo apt-get install gcc-4.7sudo mv /usr/bin/gcc /usr/bin/gcc.baksudo ln -s /usr/bin/gcc-4.......

wuyaSama ⋅ 19分钟前 ⋅ 0

从方法论到零售客户实践 解码阿里巴巴数据中台——2018上海云栖大会

摘要: 一、数据中台之道 6月8日,上海云栖大会进入了第二天的议程,数据中台专场论坛座无虚席,数据中台总架构师邓中华女士向在场的观众介绍了数据中台的衍生发展之道。 基于OneID、OneData...

猫耳m ⋅ 19分钟前 ⋅ 0

Docker减肥小记

如果经常使用 docker,你会发现 docker 占用的资源膨胀很快,其中最明显也最容易被察 如何快速的清理 docker 占用的系统资源,具体点说就是删除那些无用的镜像、容器、网络和数据卷… 1、查看...

寰宇01 ⋅ 30分钟前 ⋅ 0

微信小程序中如何使用WebSocket实现长连接(含完整源码)

本文由腾讯云技术团队原创,感谢作者的分享。 1、前言 微信小程序提供了一套在微信上运行小程序的解决方案,有比较完整的框架、组件以及 API,在这个平台上面的想象空间很大。腾讯云研究了一...

JackJiang- ⋅ 37分钟前 ⋅ 0

定制库到Maven本地资源库

1.如果只有定制库的JAR文件 下载链接如下:pdf.jar 2.使用命令转换成Maven本地资源 mvn install:install-file -Dfile=/Users/manager/Downloads/clj-pdf-2.2.33.jar -DgroupId=clj-pdf -Dar......

年少爱追梦 ⋅ 42分钟前 ⋅ 0

高仿springmvc之xuchen-mvc

package org.mvc.framework.servlet; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.......

徐志 ⋅ 44分钟前 ⋅ 0

关于自定义URLStreamHandler的一次踩坑

关于自定义URLStreamHandler的一次踩坑 20180625 lambo init 说明 一般自定义实现url的协议解析.方案为实现URLStreamHandler.实现其 openConnection 就可以了, 如果我们执行 new URL("xx://...

林小宝 ⋅ 45分钟前 ⋅ 0

【SM2证书】利用BC的X509v3CertificateBuilder组装X509国密证书

演示证书文件 链接: https://pan.baidu.com/s/1ijHNnMQJj7jzW-jXEVd6Gg 密码: vfva 所需jar包 <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on --> <dependenc......

小帅帅丶 ⋅ 46分钟前 ⋅ 0

用Calendar 实现 计算 一段时间的毫秒值

Calendar c=Calendar.getInstance();c.add(Calendar.MONTH, -1);int lastMonthMaxDay=c.getActualMaximum(Calendar.DAY_OF_MONTH);c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH)......

岸芷汀兰 ⋅ 49分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部