java web容器_Java Web容器安全

这里的Java Web容器特指Tomcat,Tomcat依然是最流行的Java Web容器,你大爷还是你大爷。

本文并不涉及业务层面上的安全控制,只针对Tomcat自身所支持的相关安全控制功能与特性。

首先看一下Web容器的四个基本安全特性验证 Authentication

资源访问控制 Access control for resources

数据完整性 Data Integrity

数据机密性或私密性 Confidentiality or Data Privacy

每一项的细节这里不展开,并不难理解。

Java EE使用基于角色的访问控制——有用户、组、角色三个基本概念。

存储用户名和密码的地方叫Realm,有可能是文件,比如Tomcat的tomcat-users.xml,也可能是数据库,或者基于证书的机制。

Tomcat支持声明式验证和编程式验证,一个是基于XML配置,一个是通过代码实现。

声明式基本身份验证

在web.xml中定义

BASIC

同时可以定义角色

Admin User

admin

Manager

manager

针对路径做控制

Admin

/admin/*

admin

连HTTP方法也能配置

Manager

/manager/*

GET

POST

admin

manager

部署后,根据各服务器来配置用户和角色,比如Tomcat的就在conf/tomcat-users.xml里。

Tomcat的验证过程如下初次访问某个受保护的URI,Web容器会检查请求中是否包括Authorization头,如果没有,容器会返回401,以及WWW-Authenticate标头给浏览器,浏览器收到后会弹出对话框要求用户输入名称和密码。

如果用户输入用户名、密码正确后,浏览器会将用户名、密码以BASE64方式编码,然后放在Authorization标头中送出,容器进行验证,正确就将资源传回。

在关闭浏览器之前,对服务器的请求都包括Authorization头,服务器也每次都检查,所以登录有效期一直持续到关闭浏览器为止。

现在实验步骤如下

在Tomcat9目录下,修改conf/tomcat-users.xml文件,解注并新增admin的角色

在webapps目录下,新建test目录和/WEB-INF/web.xml文件

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"

version="4.0"

metadata-complete="true">

Servlet and JSP Examples.

Servlet and JSP Examples

UTF-8

Example Security Constraint

Protected Area - Allow methods

/admin/*

DELETE

GET

POST

PUT

admin

manager

BASIC

admin

manager

新建/admin目录和/test.html文件,

输入正确后,查看请求可以看到Authorization头

注意这种方式几乎跟裸奔没区别,只要能拦截到你的HTTP请求,就相当于查看到你的密码。上面Basic后的字符串用base64解密就是tomcat:123456。

如果需要自定义登录窗口,可以配置

FORM

/login.html

/error.html

登录表单的action和name属性是有要求的

除了FORM和BASIC,还可以设置为DIGEST或CLIENT_CERT。DIGEST提交时传递的是MD5加密后的摘要,CLIENT_CERT使用的是Public Key Certificate(PKC)加密,客户端要安装证书。

如果要启用HTTPS,则在下设置

CONFIDENTIAL

默认值是NONE,还可以设置为INTEGRAL,不过习惯设为CONFIDENTIAL,效果一样。

设置完后,认证的时候会自动跳转为HTTPS

编程式安全管理

支持编程能带来更灵活的控制。HttpServletRequest里跟安全有关的方法有authenticate( ): 是否登录,如果没有,返回false,并会转到登录界面

login( ): 登入

logout( ): 登出

getUserPrincipal( ): 取得代表用户的Principal对象

getRemoteUser( ): 获得登录用户的名称

isUserInRole(String role): 传入角色名称,检查登录用户是否属于该角色

@WebServlet("/secret")

public class User extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

if (request.authenticated(response)) { // 检查登录 // 执行登录后的用户能够做的事情 }

}

@WebServlet("/login")

public class Login extends HttpServlet {

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String username = request.getParameter("user");

String password = request.getParameter("passwd");

try {

request.login(username, password);

response.sendRedirect("user");

} catch( ServletException ex) {

response.sendRedirect("login.html");

}

}

和对标的注解是@ServletSecurity,比如

@WebServlet("/admin")

@ServletSecurity(@HttpConstraint(rolesAllowed = {"admin"}))

就表示/admin只允许admin角色访问。

再看一个复杂一点的

@WebServlet("/admin")

@ServletSecurity(

value=@HttpConstraint(rolesAllowed = { "admin", "manager" }),

httpMethodConstraints = {

@HttpMethodConstraint(value = "GET", rolesAllowed = {"admin", "manager"},

transportGuarantee = TransportGuarantee.CONFIDENTIAL),

@HttpMethodConstraint(value = "POST", rolesAllowed = {"admin", "manager"}),

)

其它Realm

前面的例子都是把用户名密码放在配置文件里,这样带来一定的隐患,在Tomcat里也支持其它的Realm,比如JDBCRealm

DataSourceRealm

JNDIRealm

UserDatabaseRealm

MemoryRealm

JAASRealm

CombinedRealm

LockOutRealm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 中如何一次 catch 多个异常?

咨询区 Michael Stum:在项目开发中当抛出异常时,我会简单的用 System.Exception,但这种会捕获所有的异常,我不希望大一统,我只想捕获我预知的几个异常,然后在这里处理一些特定的业务逻辑。目前我只能这么实…

堆和堆排序

在讨论「堆排序」之前&#xff0c;先复习一下「选择排序」。 void SelectionSort(int a[], size_t n) {for (size_t i 0; i < n; i) {// 在剩余元素中找出最小的一个&#xff0c;然后与 a[i] 交换。size_t k i;for (size_t j i1; j < n; j) {if (a[j] < a[k]) {k …

Android之二维码生成和识别

二维码 1、ZXing库介绍 这里简单介绍一下ZXing库。ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。该项目可实现的条形码编码和解码。目前支持以下格式:UPC…

得罪前女友到底有多可怕?

1 多带一支笔到底有多重要&#xff08;via&#xff1a;100天用泰语撩到小哥哥&#xff09;▼2 专门为跪键盘而生&#xff08;via&#xff1a;in外设&#xff09;▼3 当表情包不再模糊▼4 新娘&#xff1a;他渣你&#xff0c;你干啥子整我&#xff01;&#xff01;&#xff0…

Asp.NET中如何一次性下载多个文件

在ASP.NET中&#xff0c;我们可以很方便的下载单个文件&#xff0c;当需要一次性下载多个文件的时候&#xff0c;如果提示用户一次一次保存的话&#xff0c;会导致用户体验特别的不好。我这里找到一种比较合理的解决方案&#xff0c;就是先把要下载的所有文件打包压缩到成一个文…

CybersecurityVentures:中小企业将是SIEM市场增长的下一波热点

CybersecurityVentures在2016Q1的一个报告中指出&#xff0c;中小企业将是SIEM市场增长的下一波热点。网安战略群发布了该报告的中文版。报告由GAIA小组的Charlie翻译&#xff0c;转载如下&#xff1a;来源&#xff1a;CybersecurityVentures官网翻译&#xff1a;盖亚(GAIA)小组…

Windows 10 版本 21H2 正式发布

微软今日宣布开始推送 Windows 10 版本 21H2。 Windows 10 版本 21H2 将作为 Windows 10 2021 年 11 月更新向运行 Windows 10 版本 2004、Windows 10 版本 20H2 和 Windows 10 版本 21H1 的电脑推出。 为保证升级效果&#xff0c;Windows 10 版本 21H2 将进行分阶段和可评估的…

Android之开发者应该收藏的优秀博客和技术网站

安居客Trinea 的个人博客 http:// www.trinea.cn codekk 一个Trinea发起的开源项目解析分享站点 微信公众号:codekk http://codekk.com/open-source-project-analysis

成功的换心手术——Windows Phone 8 发布

微软在刚刚开始的 Windows Phone 开发者峰会上正式发布了代号阿波罗的 Windows Phone 8 操作系统。虽然微软之前几乎没在公开场合提过阿波罗&#xff0c;但新系统变化的大方向早已泄漏。不过整个发布会依然充满惊喜&#xff0c;微软整整演示了一个多小时新功能&#xff0c;完全…

世上最“贵”的河:河里石头比黄金还值钱?甚至还有士兵驻守!

全世界只有3.14 % 的人关注了爆炸吧知识大家都听过世界上最长的河是尼罗河世界上最宽的河是亚马逊河但是你知道世界上最“贵”的河是哪条河吗这条河中最贵的原因不是水中有什么特殊生物也不是河里有黄金钻石仅仅是因为这里的“石头”这河里的石头可不普通大都是翡翠原石而这条河…

ASP.NET Core 跨平台图形验证码实现

概述几年前&#xff0c;大部分网站、论坛之类的是没有验证码的&#xff0c;因为对于一般用户来说验证码只是增加了用户的操作&#xff0c;降低了用户的体验。但是后来各种灌水机器人、投票机器人、恶意注册机器人层出不穷&#xff0c;大大增加了网站的负担同时也给网站数据库带…

日常管理

2019独角兽企业重金招聘Python工程师标准>>> 关于目前自己iOS项目使用的第三方开源库 1.AFNetworking 目前比较推荐的iOS网络请求组件&#xff0c;默认网络请求是异步&#xff0c;通过block回调的方式对返回数据进行处理。 2.FMDB 对sqlite数据库操作进行了封装&…

关于input type=file 限制文件上传类型

HTML <input> 标签的 accept 属性 <input type"file" name"pic" id"pic" accept"image/gif, image/jpeg" />accept 的取值是 MIME_type列出素有MIME_type的取值&#xff1a;下列信息摘自w3cschool MIME 类型 MIME (Multip…

System Information for Windows

运行平台&#xff1a;Windows软件授权&#xff1a;自由软件软件大小&#xff1a;1.76MBSystem Information for Windows是一款功能非常强大的系统信息管理工具,除了可查看电脑中所有的软硬件信息,网络信息等这些基本功能外,还可以查看电脑中所有软件的注册信息,包括IE和 Firefo…

Android之android studio如何把项目分享到github并提修改的代码到Github

android studio如何提交代码到Github 第一步、下载git 第二步:在android studio指定git路径 File->Settings 测试Git是否可用

清华伯克利造出机械小强:承重200万倍踩不死,跑得和真蟑螂一样快

全世界只有3.14 % 的人关注了爆炸吧知识打不死的小强&#xff0c;真的是太讨厌了&#xff01;既然打不死&#xff0c;那……干脆仿造一个出来&#xff0c;为我所用&#xff0c;岂不是爽歪歪&#xff1f;还真有人仿造成功了&#xff0c;最新的一期Science Robotics&#xff0c;就…

RowVersion字段从SqlServer到PostgreSQL的迁移

SQL Server 有个列是rowversion&#xff0c;之前是timestamp&#xff0c;因此这两个关键字在SQL server中是同义词&#xff0c;不过目前timestamp处在废弃阶段&#xff0c;因此我们最好使用rowversion来代替它。而在数据库迁移时&#xff0c;因为使用到该类型&#xff0c;因此要…

支付宝手机支付

1 在 "商家服务"开通"移动支付" 2 创建应用

java序列化有什么用_java中序列化的作用

一 什么叫序列化通俗点讲&#xff1a;它是处理对象流的一种机制&#xff0c;即可以很方便的保存内存中java对象的状态&#xff0c;同时也为了方便传输。二 序列化有什么作用1.方便传输&#xff0c;速度快&#xff0c;还很安全&#xff0c;被调用方序列化&#xff0c;调用方反序…

zk 08之:Curator之一:zk客户端Curator

Curator是Netflix公司开源的一个Zookeeper客户端&#xff0c;与Zookeeper提供的原生客户端相比&#xff0c;Curator的抽象层次更高&#xff0c;简化了Zookeeper客户端编程。 它包含以下几个组件&#xff1a; ComponentdescriptionRecipesImplementations of some of the common…