技术标签: Java 安全框架 Spring Spring Security
Spring Security 的前身是 Acegi Security,在被收纳为Spring子项目后正式更名为Spring Security。
应用程序的安全性通常体现在两个方面:认证和授权。
这些概念并非Spring Security独有,而是应用安全的基本关注点。Spring Security可以帮助我们更便
捷地完成认证和授权。
Spring Security 支持广泛的认证技术,这些认证技术大多由第三方或相关标准组织开发。Spring
Security 已经集成的认证技术如下:
◎ HTTP BASIC authentication headers:一个基于IETF RFC的标准。
◎ HTTP Digest authentication headers:一个基于IETF RFC的标准。
◎ HTTP X.509 client certificate exchange:一个基于IETF RFC的标准。
◎ LDAP:一种常见的跨平台身份验证方式。
◎ Form-based authentication:用于简单的用户界面需求。
◎ OpenID authentication:一种去中心化的身份认证方式。
◎ Authentication based on pre-established request headers:类似于 Computer Associates SiteMinder,一种用户身份验证及授权的集中式安全基础方案。
◎ Jasig Central Authentication Service:单点登录方案。
◎ Transparent authentication context propagation for Remote Method Invocation(RMI) and HttpInvoker:一个Spring远程调用协议。
◎ Automatic “remember-me” authentication:允许在指定到期时间前自行重新登录系统。
◎ Anonymous authentication:允许匿名用户使用特定的身份安全访问资源。
◎ Run-as authentication:允许在一个会话中变换用户身份的机制。
◎ Java Authentication and Authorization Service:JAAS,Java验证和授权API。
◎ Java EE container authentication:允许系统继续使用容器管理这种身份验证方式。
◎ Kerberos:一种使用对称密钥机制,允许客户端与服务器相互确认身份的认证协议。
除此之外,Spring Security还引入了一些第三方包,用于支持更多的认证技术,如JOSSO等。如果
所有这些技术都无法满足需求,则Spring Security允许我们编写自己的认证技术。因此,在绝大部分情 况下,当我们有Java应用安全方面的需求时,选择Spring Security往往是正确而有效的。
在授权上,Spring Security不仅支持基于URL对Web的请求授权,还支持方法访问授权、对象访问授权等,基本涵盖常见的大部分授权场景。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
引入security包后,可以看到自动引入spring-security-web和spring- security -config、spring- security -aop两个核心模块,这正是官方建议引入的Sp ring Security最小依赖
@GetMapping("/")
@ResponseBody
public String test2() {
return "hello , Java技术债务!";
}
访问http://127.0.0.1:8705/
在引入Spring Security项目之后,虽然没有进行任何相关的配置或编码,但Spring Security有一个默 认的运行状态,要求在经过HTTP基本认证后才能访问对应的URL资源,其默认使用的用户名user, 密码则是动态生成并打印到控制台的一串随机码。翻看控制台的打印信息,可以看到
输入用户名和密码后,单击“登录”按钮即可成功访问页面
当然,右HTTP基本认证中,用户名和密码都是可以配置的,最常见的就是在resources下的配置文 件中修改。
spring.security.user.name=1
spring.security.user.password=1
重新启动程序,发现控制台不再打印默认密码串了,此时使用我们自定义的用户名和密码即可登录。
事实上,绝大部分Web应用都不会选择HTTP基本认证这种认证方式,除安全性差、无法携带cookie等因素外,灵活性不足也是它的一个主要缺点。通常大家更愿意选择表单认证,自己实现表单登录页和验证逻辑,从而提高安全性。
WebSecurityConfig.java
package com.cuizb.cloud.alibaba.gtw.security;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
/**
* @author: Java技术债务
* @Date: 2021/6/5 18:45
* Describe: SpringSecurity配置
*/
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Slf4j
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
public void configure(HttpSecurity http) throws Exception {
log.info("Using de fault configure(HttpSecurity).If subclassed this will potentially override subclass configure(HttpSecurity) .");
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.loginPage("/blog-web/login").permitAll()
.and()
.csrf().disable();
}
}
HttpSecurity实际上对应了Spring Security命名空间配置方式中XML文件内的标签,允许我们为特 定的HTTP请求配置安全策略。
HttpSecurity提供了很多配置相关的方法,分别对应命名空间配置中的子标签。例如authorizeRequests()、formLogin()、httpBasic()和 csrf()分别对应、、和标签。调用这些方法之后,除非使用and()方法结束当前标签,上下文 才会回到HttpSecurity,否则链式调用的上下文将自动进入对应标签域。
authorizeRequests()方法实际上返回了一个 URL 拦截注册器,我们可以调用它提供的 anyanyRequest()、antMatchers()和regexMatchers()等方法来匹配系统的URL,并为其指定安全 策略。
formLogin()方法和httpBasic()方法都声明了需要Spring Security提供的表单认证方式,分别返 回 对 应 的 配 置 器 。 其 中 , f o r m L o gi n ( ) . l o gi n P a ge ( " / m y L o gi n . h t m l " ) 指 定 自 定 义 的 登 录 页/myLogin.html,同时,Spring Security会用/myLogin.html注册一个POST路由,用于接收登录请求。
csrf()方法是Spring Security提供的跨站请求伪造防护功能,当我们继承 WebSecurityConfigurerAdapter时会默认开启csrf()方法。关于csrf()方法的更多内容会在后面的章节专门探讨,以使测试 进程更加顺利。
package com.cuizb.cloud.alibaba.gtw.security;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author: Java技术债务
* @Date: 2021/6/5 18:45
* Describe: SpringSecurity配置
*/
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Slf4j
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
public void configure(HttpSecurity http) throws Exception {
log.info("Using de fault configure(HttpSecurity).If subclassed this will potentially override subclass configure(HttpSecurity) .");
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.loginPage("/blog-web/login")
.loginProcessingUrl("/blog-web/userLogin")
.successHandler(new UserAuthenticationSuccessHandler())
.failureHandler(new AuthenticationFailureHandler() {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
response.setStatus(401);
PrintWriter writer = response.getWriter();
writer.write("fail");
}
})
.permitAll()
.and()
.csrf().disable();
}
}
表单登录配置模块提供了 successHandler()和 failureHandler()两个方法,分别处理登录成功和 登录失败的逻辑。其中,successHandler()方法带有一个Authentication参数,携带当前登录用户及其角色等信息;而failureHandler()方法携带一个AuthenticationException异常参数。具体处理方式需按照系统的情况自定义。
本文作者:Java技术债务
原文链接:https://www.cuizb.top/myblog/article/1648307805
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 3.0 CN协议进行许可。转载请署名作者且注明文章出处。
JVM内存泄漏和内存溢出的原因
JVM常用监控工具解释以及使用
Redis 常见面试题(一)
ClickHouse之MaterializeMySQL引擎(十)
三种实现分布式锁的实现与区别
线程池的理解以及使用
号外!号外!
最近面试BAT,整理一份面试资料,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。想获取吗?如果你想提升自己,并且想和优秀的人一起进步,感兴趣的朋友,可以在扫码关注下方公众号。资料在公众号里静静的躺着呢。。。
一键四连,你的offer也四连
————————————————————————————————————————————————————————————————
文章浏览阅读69次。特色:l考试辅导指定教材,基于前两版再度精心修订l精研最新版考纲,涵盖最新考试所有知识点l深入历年考试真题,详尽分析近年最新考题中的重点和难点l特别制作:历年考点分布大表,高度概括考试要点,帮助您归纳、总结、记忆l特别提醒:书中特殊标记考试关键点、重点、难点,引起考生高度注意l特别赠送:随书光盘免费赠送大量考试培训和串讲视频《网络工程师考前冲刺预测卷及考点解析:最新版》/郭春柱编著.—北京:电子工..._国内软考培训
文章浏览阅读923次,点赞15次,收藏8次。透明加密技术软件采用先进的透明加密技术,对指定类型的文件(如Office文档、PDF报告、图片、音频、视频、工程图纸、源代码等)进行实时、自动加密。用户在日常工作中无需额外操作即可实现加密与解密过程的无缝衔接,确保数据在创建、编辑、保存、传输过程中始终处于加密状态,未经许可无法访问或使用。权限管理。
文章浏览阅读5.1w次,点赞17次,收藏72次。引子:关于原文链接,可参考https://stackoverflow.com/questions/6406762/why-am-i-merging-remote-tracking-branch-origin-develop-into-develop,点赞最多的回答果真是比较精品的问题:合并分支时出现了merge remote-tracking branch 'xxx' into xxxx转义过来就是 xxxx合并了远程跟踪分支xxx原因:试想,我们平时碰到最多的情况就是合并xxx分支到x_merge remote-tracking branch
文章浏览阅读228次。昆明理工大学C语言综合设计报告(含代码).doc昆明理工大学《程序设计基础》课程综合设计实践教学课题报告课程名称: C语言程序设计课题名称:综合设计实践教学课题报告组长: 学号 20121 姓名组员: 学号 20121 姓名学号 201217 姓名学院: 信自 专业班级: 测指导教师: 耿植林昆明理工大学计算中心2013年 6 月 4 日填写格式及说明系统概述随着社会的发展,人们..._昆明理工大学土木工程c语言大作业
文章浏览阅读1.2k次,点赞27次,收藏22次。ChatGPT最新功能“Text To Speech (TTS,文本转语音)”详细解读!_chatgpt如何把文字转换成语音
文章浏览阅读3.5k次,点赞29次,收藏28次。CSDN 官方为了感谢我们的铁粉们一直以来对我们的支持,同时也为了鼓励更多的博主们积极参与创作,我们特地为您准备了专属奖牌。因此,通过这篇文章带大家了解 CSDN 的铁粉是什么?如何获得粉丝与铁粉?对于新人博主以及久久不能涨粉的博主来说具有参考价值,接下来跟随我的脚步,来一探究竟吧。_csdn粉丝2000相当于什么水平
文章浏览阅读653次。商品描述:【图书描述】:本书系统地介绍C语言的实验指导和习题解答。全书共分三个部分,下面简单介绍这些章节的内容:第一部分:C语言上机指导这个部分包括从第l章到第6章的内容。第l章到第4章分别介绍了在VisualC++2005、Devc++、TurboC和Unix/Linux操作系统中的C编译器等常用C程序开发环境中编辑、编译、链接、运行和调试的具体步骤和方法。第5章介绍了软件测试的常用方法,..._dewc++
文章浏览阅读67次。request was one of the first modules added to the npm registry. As npm grew so did dependence on request. Even now, when npm is used far more for front-end than back-end work, request remains one of t..._npm 提示request 3142
文章浏览阅读6.2w次,点赞121次,收藏1k次。1、数据库中的范式:(1)第一范式(1NF):指表的列不可再分,数据库中表的每一列都是不可分割的基本数据项,同一列中不能有多个值;(2)第二范式(2NF):在 1NF 的基础上,还包含两部分的内容:一是表必须有一个主键;二是表中非主键列必须完全依赖于主键,不能只依赖于主键的一部分;(3)第三范式(3NF):在2NF 的基础上,消除非主键列对主键的传递依赖,非主键列必须直接依赖于主键。(4)BC范式(BCNF):在 3NF 的基础上,消除主属性对于码部分的传递依赖2、SQL语句的执.._mysql面试题
文章浏览阅读1.7k次。情况事件10016,RuntimeBroker无法编辑应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址 LocalHost (使用 LRPC) 中的用户 CHAUNCY-MSI\duan SID (S-1-5-21-1497519730-1164639677-489590190-1001)授予针对 CLSID 为{D63B10C5-BB46-4990-A94F-E40B9D520160}、APPID 为{9CA88EE3-ACB7-47C8-AFC4-AB702_解决runtimebroker进程启动和激活权限无法编辑
文章浏览阅读148次。在NUCLEO-U5A5ZJ-Q上,能够使用上TFT彩色显示屏,就可以更方便的进行多远信息的呈现了,不管是传感器数据的读取后的呈现,还是状态信息的呈现,结合起来,能够做出很出色的工作。使用 【新提醒】【NUCLEO-U5A5ZJ-Q测评】无需移植使用lvgl驱动SSD1306 OLED显示中英文和绘图 这篇分享中的代码,用上面的命令,重编编译,就能够直接使用了。Zephyr对NUCLEO-U5A5ZJ-Q的给力支持,以及提供的LVGL模块支持,能够让开发者聚焦于核心业务的处理,真的是非常的方便。_高清彩屏驱动
文章浏览阅读1.2w次。这个问题在别人电脑上面没有出现,但我的电脑就出现了,在网上找各种解决方法:有的说是asm.jar冲突,有的说要配置byName,有的说是路径问题但路径明显是正确的。严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.Contex_error creating bean with name 'org.springframework.context.config.internalbe