Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式

摘要:
当访问服务器中受保护的资源时,容器管理的验证方法可以控制确认用户身份的方式。使用这种验证方法,所有的密码都会以base64编码的文本在网络上传输。--这里的member要与tomcat-user.xml中配置的role一致--˃memberMyConstraintstomcat-user.xml˂!server.xml中的UserDatabaseRealm里增加digest属性:接下来,要生成tomcat可识别的MD5密码。用户名就是tomcat-users.xml中配置的名字,Realm名是在web.xml中配置的,密码明文即该用户用于登录的密码。

当访问服务器中受保护的资源时,容器管理的验证方法可以控制确认用户身份的方式。Tomcat支持四种容器管理的安全防护,它们是:

  • BASIC(基本验证):通过HTTP验证,需要提供base64编码文本的用户口令
  • DIGEST(摘要验证):通过HTTP验证,需要提供摘要编码字符串的用户口令
  • FORM(表单验证):在网页的表单上要求提供密码
  • CLIENT-CERT(客户端证书验证):以客户端证书来确认用户的身份

基本验证

当web.xml文件中的auth-method元素设置为BASIC时,表明应用使用的是基本验证,每次浏览器请求受保护的Web应用资源时,Tomcat都会使用HTTP基本验证向浏览器索取用户名和密码(以页面弹窗的方式)。使用这种验证方法,所有的密码都会以base64编码的文本在网络上传输。

先看下项目结构(我用Maven管理的依赖):

Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式第1张

其中,protect/protect.jsp是被保护的,需要授权访问。

说明:本文提到的tomcat-users.xml,server.xml等文件,如果是在Eclipse中启动tomcat,则这些文件在Eclipse中的Servers工程下对应的tomcat下,如图:

Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式第2张

而本文提到的web.xml是指项目自己的web.xml,而非Servers项目下Tomcat中的web.xml。

web.xml

<security-constraint>
    <web-resource-collection>
        <http-method>GET</http-method>
        <web-resource-name>tomcat protect page</web-resource-name>
        <!-- /protect目录下的所有资源是受保护的 -->
        <url-pattern>/protect/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <!-- 这里的member要与tomcat-user.xml中配置的role一致 -->
        <role-name>member</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <!-- 验证方式,可选的值为: "BASIC", "DIGEST", "FORM", "CLIENT-CERT" -->
    <auth-method>BASIC</auth-method>
    <!-- 使用的Realm名字,注意这里不能有空格 -->
    <realm-name>MyConstraints</realm-name>
</login-config>

tomcat-user.xml(注意如果是在Eclipse中启动tomcat,这个tomcat-user.xml在Eclipse中的Servers工程下)

<role rolename="member"/>
<!-- member角色下有一个叫alvis的用户,密码为pwd -->
<user username="alvis" password="pwd" roles="member"/>

重启tomcat后,访问protect目录下的资源,情况是这样的:

Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式第3张

输入账户alvis,密码pwd后,访问成功(当然,非protect目录下的资源是可以直接访问的):

Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式第4张

摘要验证

当web.xml文件中的auth-method元素设置为DIGEST时,表明应用使用的是摘要验证。还是上面的例子,看配置:

web.xml和基本验证一样,只是auth-method修改为DIGEST,此处不赘述。

server.xml中的UserDatabaseRealm(如果tomcat使用的是其他Realm,也一样的)里增加digest属性:

Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式第5张

接下来,要生成tomcat可识别的MD5密码。方式有两种,正如官网描述:

To calculate the digested value of a cleartext password, two convenience techniques are supported:

  • If you are writing an application that needs to calculate digested passwords dynamically, call the static Digest() method of the org.apache.catalina.realm.RealmBase class, passing the cleartext password and the digest algorithm name as arguments. This method will return the digested password.
  • If you want to execute a command line utility to calculate the digested password, simply execute

    <code>CATALINA_HOME/bin/digest.[bat|sh] -a {algorithm} {cleartext-password} </code>

    and the digested version of this cleartext password will be returned to standard output.

方式一:用代码来生成:

import org.apache.catalina.realm.RealmBase;
public class T {
    public static void main(String[] args) {
        //参数1:要加密的字符串;参数2:加密算法;参数3:字符串的编码
        String base = RealmBase.Digest("alvis:MyConstraints:pwd", "MD5", null);
        System.out.println(base);
    }
}

由于RealmBase类在catalina.jar包中,如果项目中没有这个类,可在项目上右键–>Java Build Path–> Libraries–>Add Library–>选择Server Runtime–>选择Apache Tomcat V8.0(其实7.0也行),如图:

Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式第6张

方式二:用脚本来生成:

在tomcat/bin目录下有个digest.sh(Linux系统)或digest.bat(Windows系统)脚本,运行这个脚本,传入摘要算法和参数即可,这里我在Windows系统上运行,如图:

Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式第7张

这里的-a指定摘要算法为MD5,要 特别注意这里的参数是:{用户名}:{Realm名}:{密码明文} 。用户名就是tomcat-users.xml中配置的<user>名字(这里为alvis),Realm名是在web.xml中配置的<realm-name>(这里为MyConstraints),密码明文即该用户用于登录的密码(我这里设为pwd)。

只有这样的参数加密后的密码,在tomcat-users.xml中配置才有效,否则是登录不了的。由于我是参考《Tomcat权威指南(第二版)》的步骤做的,之前试了很久都不知道为什么登录不了,结果在官网找到答案,是这么描述的:

If using digested passwords with DIGEST authentication, the cleartext used to generate the digest is different and the digest must use the MD5 algorithm. In the examples above{cleartext-password}must be replaced with{username}:{realm}:{cleartext-password}. For example, in a development environment this might take the form testUser:Authentication required:testPassword . The value for {realm} is taken from the <realm-name> element of the web application’s <login-config> . If not specified in web.xml, the default value of Authentication required is used.

大意是说,如果使用DIGEST方式验证,用于生成摘要的明文必须被替换为这种格式。实践出真知,所以还是不能完全看书啊,动手实践才是实在的。

然后就是在tomcat-users.xml中配置生成的密码(通过下方的截图,可以比较password跟上方digest.bat脚本生成的密码是否一致):

Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式第8张

之后重启tomcat,效果自然是跟使用基本验证的效果一样了。

表单验证

当web.xml文件中的auth-method元素设置为FORM时,表明应用使用的是表单验证。当用户请求Web应用程序受保护的资源时,表单验证会跳转至配置的登录页面。当登录失败时,还需要一个验证失败的页面,还是上面的例子,看配置:

web.xml

<security-constraint>
    <web-resource-collection>
        <http-method>GET</http-method>
        <web-resource-name>tomcat member part</web-resource-name>
        <url-pattern>/protect/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>member</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>MyConstraints</realm-name>
    <form-login-config>
        <form-login-page>/form/login.html</form-login-page>
        <form-error-page>/form/error.html</form-error-page>
    </form-login-config>
</login-config>

这里的form/login.html是用于登录的页面,而form/error.html则是验证失败后跳转到的页面(这两个页面在上方的工程结构图中已经有了)。

login.html

<html>
    <body>
    <h2>Login Page.</h2>
    <form method="post" action="j_security_check" name="loginForm">
        <input type="text" name="j_username" /><br>
        <input type="password" name="j_password" /><br>
        <input type="submit" value="Login" />
    </form>
    </body>
</html>

注意:这里form的action=”j_security_check“,账号的name=”j_username“和密码的name=”j_password“都是不可变的,否则配置的验证规则不起作用。

server.xml中,要去掉Realm中添加的“digest=MD5”这个属性:

Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式第9张

tomcat-users.xml中使用明文保存密码:

Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式第10张

效果(仅在访问protect目录下的资源时才出现Login Page):

Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式第11张

输入错误的账号和密码,跳转至form/error.html页面:

Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式第12张

输入正确的账号和密码,跳转至受保护的页面:

Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式第13张

客户端证书验证

待续

Demo下载:

链接:http://pan.baidu.com/s/1gfnqVdT密码: pubw

参考页面:

https://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html

免责声明:文章转载自《Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇spark 调优概述【洛谷P5633】最小度限制生成树下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HttpServletrequest 注册和登录、request域对象、web动态shop

 summarize httpServletResponse跟 Request一个是响应一个是请求,获得客户端请求方式 用getMethod 得到的是String类型, response:属于重定向请求、地址栏URL会发生改变、想服务器发送两次请求 response解决中文乱码:response.setContentType("text/html;char...

vue按键修饰符@keyup.enter.native

Vue 允许为 v-on 在监听键盘事件时添加按键修饰符: <!-- 只有在 `key` 是 `Enter` 时调用 `vm.submit()` --> <input v-on:keyup.enter="submit"> 应用场景: 1、当我们在登录页面中,输完密码后,点击enter键就可以发起登录请求 <!-- 登录表单区...

WCF服务

创建了一个WCF服务之后,为了能够方便的使用WCF服务,就需要在客户端远程调用服务器端的WCF服务,使用WCF服务提供的方法并将服务中方法的执行结果呈现给用户,这样保证了服务器的安全性和代码的隐秘性。 18.5.1 在客户端添加WCF服务为了能够方便的在不同的平台,不同的设备上使用执行相应的方法,这些方法不仅不能够暴露服务器地址,同样需要在不同的客户端上能...

jmeter上传图片附件实践

一、根据定义的接口文档,通过Jmeter发起请求 接口请求入参 { "consignorPrice": 299, "manageNo": "MMOUXX", "waybillNo": "100514000141", "driverPrice": 273, "cargoWeight": 29.09, "oil": 34, "loa...

SpringMVC 使用验证框架 Bean Validation(上)

SpringMVC 使用验证框架 Bean Validation(上) 对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证。 SpringMVC 自身对数据在服务端的校验(Hibernate Validator)有一个比较好的支持,它能将我们提交到服务端的数据按照我们事先的约定进行数...

ant-design-vue 之form表单中label-col和wrapper-col使用

ant-design-vue 之form表单中label-col和wrapper-col使用 主要代码: :label-col="{ span: 5 }" :wrapper-col="{ span: 15 }" demo: <template> <div> <a-form :form="form" &g...