阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

如何在 Java Web 应用程序中启用 Spring Security?

  • 2019-07-08
  • 本文字数:2982 字

    阅读完需:约 10 分钟

如何在Java Web应用程序中启用Spring Security?

Spring Security 是通过声明方式在 Java Web 应用程序中实现安全性的流行开源框架之一。 它提供了基本的安全功能,如 LDAP 身份验证,授权,基于角色的访问控制,记住密码,URL 保护,并发活动 Session 管理等。为了在 Java Web 应用程序中启用 Spring Security,需要配置如下三项内容 :


  • 在 web.xml 中声明委托代理过滤器(delegating proxy filter )

  • 在 web.xml 中添加 ContextLoaderListener

  • 在 applicationContext-Security.xml 文件上提供实际的安全性约束。


由于 Spring Security 使用一系列过滤器来实现各种安全约束,也称为 Spring 的“安全链过滤器”,它依赖于通过 Java Web 容器来初始化过滤器的代理。


如果你还记得,过滤器是由像 Tomcat 或 Jetty 这样的 Servlet 容器创建、维护和销毁。 通过在 web.xml 中声明过滤器,并且 Web 容器通过调用过滤器的 init(FilterConfig config)方法来进行初始化。 然后,此过滤器将预处理和后处理任务委托给 Spring Security 框架的过滤器实现。


每当请求或响应通过匹配过滤器的 URL 模式,Servlet 容器就会调用 DelegatingFilterProxy 的 doFilter()方法来进行处理。


此方法可以访问 ServletRequest,ServletResponse 和 FilterChain 对象,这意味着它可以在将请求发送到 Servlet 或响应客户端之前修改请求标头,响应标头和响应正文。 FilterChain 对象用于将请求路由中转到过滤链中的另一个过滤器进一步处理。


顺便说一下,在深入 Spring Security 之前了解 Spring 框架很重要,如果你觉得自己对 Spring 框架知之甚少,那么我建议你先学习一下像 Spring Framework 5 这样的综合课程:初学者到Guru


在 Web 应用程序中启用 Spring Security 的步骤。


以下是在 Java Web 应用程序中启用 Spring Security 功能的三个步骤:


1、首先在 web.xml 中声明 DelegatingFilterProxy 过滤器;


2、接着,将 Spring 应用程序上下文文件指定给 ContextLoaderListener;


3、最后,在 applicationContext-Security.xml 文件中指定 Spring Security 模板匹配 URL。


在 web.xml 中使用 DelegatingFilterProxy 过滤器声明如下:


<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> 
<filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

复制代码


Servlet 容器将获取此过滤器并进行初始化,并在发出请求时调用 DelegatingSpringSecurity 的 doFilter()方法。 通过调用 init()方法初始化过滤器。 DelegatingFilterProxy 扩展了 GenricFilterBean,它实现了 init(FilterConfig filterConfig)方法,并回调 initFilterBean()以允许子类执行初始化。


默认情况下,DelegatingFilterProxy 类将在初始化期间查找 Spring 应用程序上下文 ,如下面 Spring 安全 JAR 文件中 DelegatingFilterProxy 类的代码所示。


 protected void initFilterBean() throws ServletException {   synchronized (this.delegateMonitor)  { if (this.delegate == null) { // If no target bean name specified, use filter name.   if (this.targetBeanName == null)  {  this.targetBeanName = getFilterName(); } // Fetch Spring root application context and initialize the  // delegate early, if possible.  // If the root application context will be started  // after this filter proxy, we'll have to resort to lazy  // initialization.   WebApplicationContext wac = findWebApplicationContext();   if (wac != null)  { this.delegate = initDelegate(wac); } }   } 
}

复制代码


如果要自定义此行为,可以通过 FilterConfig 对象使用 targetBeanName 提供 bean 类的名称。 如果没有,那么这将使用 filter-name,即“springSecurityFilterChain”。 然后,它在 applicationContext.xml 和 applicationContext-Security.xml 文件中搜索此 bean 以进行初始化。


但是,当您在配置文件中搜索此内容时,很可能由于而无法找到它,因为使用默认值会隐藏了复杂性。 您可以进一步加入学习Spring Security 4 基础实践,以了解有关如何在 Spring 安全性中委派过滤器代理以及如何自定义和配置其行为的更多信息。 

 以下是在 Java Web 应用程序中加载 Spring 安全性配置文件的方法:


<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> 
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/applicationContext.xml /WEB-INF/applicationContext-security.xml </param-value> </context-param>

复制代码


应该把配置文件 applicationContext-security.xml 放在 WEB-INF 目录中。


以下是 Spring 安全配置文件的示例:


<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 
<security:http auto-config="true">
<security:intercept-url pattern="/admin" access="ROLE_ADMIN" /> </security:http> <security:authentication-manager> <security:authentication-provider>
<security:user-service> <security:user authorities="ROLE_ADMIN" name="admin" password="admin" /> <security:user authorities="ROLE_ADMIN" name="root" password="root" /> </security:user-service> </security:authentication-provider> </security:authentication-manager> </beans>
复制代码


通过这种简单的配置,现在可以保护所有以 /admin 结尾的 URL 只能使用用户名和密码进行访问。 有权访问此权限的两个用户 admin 和 root。 简而言之,您不需要对任何 Spring 安全过滤器或 bean 进行编码,所有这些都是通过使用现有的 Spring 安全过滤器和标记来完成的。


顺便说一句,如果你想深入理解这个配置,比如每个标签的含义以及它们与 Java 类的关系,我建议你看看 Eugen 的Spring Security Master课,它针对 Spring Security 5 进行了更新。


现在,如果您点击 URL 登录 admin,将要求您输入用户名和密码,并且只有在正确的凭据之后才允许您访问受保护的部分。


在模式的顺序声明此非常重要,它们必须按最具体到最不具体的顺序声明,因为这些模式按照它们在 spring 安全应用程序上下文文件中声明的顺序进行计算 找到匹配项,不执行其他模式。


这就是如何在 Java Web 应用程序中启用或激活 Spring Security。 虽然配置和使用非常简单,但功能非常强大,为您提供了许多实现复杂安全约束的可选项。 我们没有编写任何代码,我们只是进行了一些 XML 配置,以便将不安全的 Web 应用程序设置为安全的,很神奇。


原文链接:


https://javarevisited.blogspot.com/2017/05/how-to-enable-spring-security-in-java-web-application.html


2019-07-08 10:013757
用户头像
王文刚 Instagram 营销专家

发布了 37 篇内容, 共 22.9 次阅读, 收获喜欢 55 次。

关注

评论

发布
暂无评论
发现更多内容

专业统计分析绘图软件:GraphPad Prism 10 激活最新版

mac大玩家j

数据分析工具 Mac软件 数学分析软件

URL Manager Pro for Mac(浏览器标签管理应用)v6.4.1激活版

iMac小白

手把手带你配置一个DHCP服务器 | 京东云技术团队

京东科技开发者

网络协议 服务器 Wireshark DHCP

AI数字人在小红书开播教程!

青否数字人

数字人

从 MLOps 到 LMOps 的关键技术嬗变

百度Geek说

大模型 MLOps 12 月 PK 榜 Prompt LMops

如何最大化利用虚拟主机:实用技巧与建议

一只扑棱蛾子

虚拟主机

生产环境质量保障的四大挑战

老张

质量保障 测试右移

MySQL数据库中SQL语句分几类?

小魏写代码

【腾讯云 HAI域探秘】整合腾讯云HAI的ChatGLM模型到NUXT官网:实现智能IM功能

攀登者

图形化编程平台对比:iVX 与 Blockly/Scratch

代码生成器研究

去哪儿如何实现故障率降低65%?技术+管理的数字化度量体系实践

TakinTalks稳定性社区

使用 KubeRay 和 Kueue 在 Kubernetes 中托管 Ray 工作负载

字节跳动云原生计算

ray KubeRay

Macs Fan Control Pro for mac( 电脑风扇控制软件)v1.5.16中文激活版

iMac小白

未雨绸缪,天翼云云备份护航企业稳健发展

Geek_2d6073

测试用例设计方法六脉神剑——第二剑:招式组合,因果判定出世 | 京东物流技术团队

京东科技开发者

测试 因果图法 判定表法

中企出海 | 引领全球税务治理,助力中企出海

用友BIP

中企全球化

Solidity之旅(七)单位以及全局变量

BSN研习社

localhost工具:本地代码的远程之路 | 京东云技术团队

京东科技开发者

HTTP 内网穿透 go语言 localhost

专业视频调色软件达芬奇DaVinci Resolve Studio 18激活中文正式版

胖墩儿不胖y

Mac软件 视频剪辑工具 视频后期处理工具 Mac软件视频编辑

Dropzone 4 for mac(文件拖拽增强工具)v4.80.4激活版

iMac小白

AI数字人短视频添加背景教程!(数字人SaaS系统或剪映)

青否数字人

数字人

低代码正在改变软件开发方式

互联网工科生

软件开发 低代码 JNPF

浅析MySQL代价模型:告别盲目使用EXPLAIN,提前预知索引优化策略 | 京东云技术团队

京东科技开发者

MySQL 数据库 索引优化 EXPLAIN

搭建本地http服务器-打开本地文件

Lemoon Can

notion链接脑图 mac开机自启动服务 打开本地文件的http服务器

做服务的架构陷阱,你掌握了多少

华为云开发者联盟

后端 开发 华为云 华为云开发者联盟

活动预告 | 中国数据库联盟(ACDU)中国行第四站定档西安,邀您探讨数据库前沿技术

墨天轮

数据库 postgresql oceanbase 国产数据库 KaiwuDB

怎样防止数字人直播被判定为录播?

青否数字人

数字人

亚马逊云科技宣布推出三项无服务器服务创新

财见

轻松掌握!作为产品经理,手把手教你使用API接口获取拼多多商品详情

Noah

文心一言 VS 讯飞星火 VS chatgpt (151)-- 算法导论12.2 7题

福大大架构师每日一题

福大大架构师每日一题

鹏华基金核心系统完成国产化升级,腾讯云大数据TBDS再拓应用新场景

腾讯云大数据

TBDS

如何在Java Web应用程序中启用Spring Security?_文化 & 方法_javin paul_InfoQ精选文章