你真的知道Spring Security安全框架吗?

news2024/11/18 9:21:09

1、什么是安全管理框架?

解决系统安全问题的框架。如果没有安全框架,我们需要手动处理每个资源的访问控制,非常麻烦。使 用安全框架,我们可以通过配置的方式实现对资源的访问限制。 安全框架,简单说是对访问权限进行控制,应用的安全性包括用户认证(Authentication)和用户授权 (Authorization)两个部分。

安全框架能做什么?

登录验证 —— 轻松登录鉴权,并提供五种细分场景值

权限验证 —— 适配RBAC权限模型,不同角色不同授权

踢人下线 —— 将违规用户立刻清退下线

持久层扩展 —— 可集成Redis、Memcached等专业缓存中间件,重启数据不丢失

分布式会话 —— 提供jwt集成和共享数据中心两种分布式会话方案

单点登录 —— 一处登录,处处通行

注解式鉴权 —— 优雅的将鉴权与业务代码分离

路由拦截式鉴权 —— 根据路由拦截鉴权,可适配restful模式

会话治理 —— 提供方便灵活的会话查询接口

记住我模式 —— 适配[记住我]模式,重启浏览器免验证

密码加密 —— 提供密码加密模块,可快速MD5、SHA1、SHA256、AES、RSA加密

组件自动注入 —— 零配置与Spring等框架集成

2、企业中使用的主流安全框架

市面上主流的安全管理框架Shiro、SpringSecurity、Sa-Token

在sping boot发布之前之前shiro是市场的绝对主流 直到有一天 Spring Boot 像谜一般出现在江湖边缘,彻底颠覆了 JavaEE 的世界。一人得道鸡犬升天,自 从 Spring Boot 火了之后,Spring 家族的产品都被带了一把,Spring Security 就是受益者之一,从此飞 上枝头变凤凰。

Spring Boot/Spring Cloud 现在作为 Java 开发领域最最主流的技术栈,这一点大家应该都没有什么异 议,而在 Spring Boot/Spring Cloud 中做安全管理,Spring Security 无疑是最方便的。 而sa-Token呢,则算是后期之秀,与其他框架相比

1. 简单 :可零配置启动框架,真正的开箱即用,低成本上手

2. 强大 :目前已集成几十项权限相关特性,涵盖了大部分业务场景的解决方案

3. 易用 :如丝般顺滑的API调用,大量高级特性统统只需一行代码即可实现

4. 高扩展 :几乎所有组件都提供了扩展接口,90%以上的逻辑都可以按需重写

首先我要声明一点,框架无所谓好坏,关键是适合当前项目场景,作为一个年轻的程序员更不应该厚此 薄彼,或者拒绝学习某一个框架。 小孩子才做选择题,成年人两个都要学!

3.为什么选择spring security?

功能全:API完整;成熟的身份认证和用户授权方案;支持缓存;可以前后端分离,适应市场;可 以单独使用 搭配技术多:配合spring boot,JWT,OAuth2 授权服务,RBAC角色访问模型等技术或模型更方 便快捷 社区资源丰富:遇到问题,可以轻松找到成熟的解决方案;学习资料容易获取; 对于spring更友好:充分利用Spring IoC,DI,和AOP的功能

「有的人觉得 Spring Security 配置臃肿。」

如果是 SSM + Spring Security 的话,我觉得这话有一定道理。但是如果是 Spring Boot 项目的话,其实 并不见得臃肿。Spring Boot 中,通过自动化配置 starter 已经极大的简化了 Spring Security 的配置, 我们只需要做少量的定制的就可以实现认证和授权了,一会大家看我给大家演示快速入门就知道了

「有人觉得 Spring Security 中概念复杂。」

这个是这样的,没错。

Spring Security 由于功能比较多,就显得比较重量级,不像 Shiro 那样轻便。 但是如果换一个角度,你可能会有不一样的感受。 在 Spring Security 中你会学习到许多安全管理相关的概念,以及常见的安全攻击。这些安全攻击,如果 你不是 web 安全方面的专家,很多可能存在的 web 攻击和漏洞你可能很难想到,而 Spring Security 则 把这些安全问题都给我们罗列出来并且给出了相应的解决方案。 所以我说,我们学习 Spring Security 的过程,也是在学习 web 安全,各种各样的安全攻击、各种各样 的登录方式、各种各样你能想到或者想不到的安全问题,Spring Security 都给我们罗列出来了,并且给 出了解决方案,从这个角度来看,你会发现 Spring Security 好像也不是那么让人讨厌。

结合微服务的优势

除了前面和大家介绍的 Spring Security 优势,在微服务中,Spring 官方推出了 Spring Cloud Security

和 Spring Cloud OAuth2,结合微服务这种分布式特性,可以让我们更加方便的在微服务中使用 Spring Security 和 OAuth2

可以看到,Spring 官方一直在积极进取,让 Spring Security 能够更好的集成进微服务中。

、怎么开始学习Spring Security 

具体参考教程:后台系统权限管理设计实战

Spring Security快速入门 

1、导入依赖 

Spring Security已经被Spring boot进行集成,使用时直接引入启动器即可。 

org.springframework.boot 

spring-boot-starter-security 

2、访问页面 

导入spring-boot-starter-security启动器后,Spring Security已经生效,默认拦截全部请求,如果用户 没有登录,跳转到内置登录页面。 在项目中新建login.html页面后 在浏览器输入:http://localhost:8080/login.html后会显示下面页面 

默认的username为user,password打印在控制台中。当然了,同学们显示的肯定和我的不一样。

在浏览器中输入账号和密码后会显示login.html页面内容。 

3、修改默认配置 

1.修改默认密码 

Security默认用户是user,密码是通过UUID随机生成。添加这些配置项, 

UserDetailsServiceAutoConfiguration会基于配置信息在内存中创建一个用户user,如果没有配置, 

UserDetailsServiceAutoConfiguration会自动在内存中创建一个密码用UUID随机生成的user用户。 通过修改application.properties(application.yml) 

spring: 

security: 

user: 

name: admin 

password: admin

2.自定义登录页面 

虽然Spring Security给我们提供了登录页面,但是对于实际项目中,大多喜欢使用自己的登录页面。所 以Spring Security中不仅仅提供了登录页面,还支持用户自定义登录页面。实现过程也比较简单,只需 要修改配置类即可。 说明:在上面代码基础上进行修改 

1.添加thymeleaf的依赖 

2.编写登录页面 

在resources下新建templates文件夹。其中fail.html和success.html都只有一句话,分别是:“登录失 败”和“登录成功” login.html 

3.编写控制器 

新建一个IndexController 

三个方法都是只有显示页面的功能。因为Thymeleaf页面必须通过控制器显示。如果示例代码是拿纯 

HTMl静态页面演示,是不需要写这些控制器。 

org.springframework.boot 

spring-boot-starter-thymeleaf 

lang="en"> 

charset="UTF-8"> 

action="/login" method="post"> 

用户名: type="text" name="username"/>

密码: type="password" name="password"/> 

type="submit" value="提交"/> 

@Controller 

public class IndexController {

4.创建SecurityConfig配置类 

在以往Spring Security的教程中我们自定义配置都是声明一个配置类 

WebSecurityConfigurerAdapter ,然后覆写( @Override )对应的几个方法就行了。 然而这一切在Spring Security 5.4开始就得到了改变,从Spring Security 5.4 起我们不需要继承 

WebSecurityConfigurerAdapter 就可以配置 HttpSecurity 了 

@RequestMapping("/") public String showLogin() { return "login"; } @RequestMapping("/success") public String success() { return "success"; } @RequestMapping("/fail") public String fail() { return "fail"; } } /** 

* SpringSecurity的配置 

*/ 

@Configuration 

@EnableWebSecurity 

@EnableGlobalMethodSecurity(prePostEnabled = true) public class OldSecurityConfig extends WebSecurityConfigurerAdapter { } 

@Configuration 

public class SecurityConfig { @Bean 

SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { httpSecurity.formLogin() // 哪个URL为登录页面 

.loginPage("/") // 当发现什么URL时执行登录逻辑

.loginProcessingUrl("/login") // 登录成功页 

.successForwardUrl("/success") // 登录失败页 

.failureForwardUrl("/fail"); // 设置URL的授权问题 多个条件取交集 

httpSecurity.authorizeRequests() // 匹配 / 控制器 permitAll() 不需要被认证就可以访问 

.antMatchers("/").permitAll() // anyRequest() 所有请求 authenticated() 必须被认证

4、数据库访问方式 

创建表并插入默认数据 

创建用户对象 

创建相应的mapper 

.anyRequest().authenticated(); // 关闭csrf

httpSecurity.csrf().disable(); return httpSecurity.build(); } } 

-- ---------------------------- -- Table structure for ums_admin -- ---------------------------- 

DROP TABLE IF EXISTS `ums_admin`; 

CREATE TABLE `ums_admin` ( 

`id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 

NULL, `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 

NULL, PRIMARY KEY (`id`) USING BTREE 

) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '后台用户表' ROW_FORMAT = Dynamic; 

-- ---------------------------- -- Records of ums_admin -- ---------------------------- 

INSERT INTO `ums_admin` VALUES (1, 'root', 

'$2a$10$IXM8dvRox2Po40xNyvLJW.Txc3Ia9TOutQgKm0mk20l1T/azhiypa'); 

@Data @TableName("ums_admin") 

public class UmsAdmin implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; private String username; private String password; } 

public interface UmsAdminMapper extends BaseMapper<UmsAdmin> { }

创建serviceImpl实现UserDetailsService 

这边我们用的是mybatis-plus,这部分不是今天的重点,这里我就不赘述了 

创建配置文件CommonSecurityConfig 

@Service @Log4j2 

public class UmsAdminServiceImpl implements UserDetailsService { @Autowired 

private UmsAdminMapper umsAdminMapper; @Override 

public UserDetails loadUserByUsername(String username) { //获取用户信息 

UmsAdmin admin = getAdminByUsername(username); if (admin == null) { throw new UsernameNotFoundException("用户名或密码错误"); } return new User(username, admin.getPassword(), 

AuthorityUtils.commaSeparatedStringToAuthorityList("admin")); } /** 

* 根据用户名获取后台管理员 

* @param username 

* @return 

*/ 

public UmsAdmin getAdminByUsername(String username) { QueryWrapper<UmsAdmin> wrapper = new QueryWrapper<>(); wrapper.lambda().eq(UmsAdmin::getUsername, username); List<UmsAdmin> adminList = umsAdminMapper.selectList(wrapper); if (adminList != null && adminList.size() > 0) { UmsAdmin admin = adminList.get(0); return admin; } return null; } } 

@Configuration 

public class CommonSecurityConfig { // PasswordEncoder:SpringSecurity定义的用于对密码进行编码及比对的接口,目前使用的是 

BCryptPasswordEncoder; 

@Bean 

public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }

5、测试效果 

在浏览器输入:http://localhost:8080显示登录页面。输入:账号:root,密码:root后会显示“登录成 功

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

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

相关文章

Android Material Design之MaterialButton(一)

按规矩先上效果图 资源引入 implementation com.google.android.material:material:1.4.0关键属性 属性描述app:backgroundTint背景着色app:backgroundTintMode着色模式app:strokeColor描边颜色app:strokeWidth描边宽度app:cornerRadius圆角大小app:rippleColor按压水波纹颜色…

【Java八股文总结】之计算机网络

文章目录计算机网络一、基础1、网络体系结构2、HTTP协议、TCP协议、UDP协议比较3、网络协议4、WebSocket和Socket的区别&#xff1f;5、常见的端口及其对应的服务&#xff1f;6、从浏览器输入URL到页面展示发生了什么&#xff1f;&#xff08;★★★★★&#xff09;1、DNS域名…

MySQL纯代码复习(下)

前言 本文章的语言描述会比上篇多一些 数据库的创建修改与删除 标识符命名规则 数据库名、表名不得超过30个字符&#xff0c;变量限制为29个必须只能包含A-Z&#xff0c;a-z&#xff0c;0-9&#xff0c;_等63个字符数据库名、表名、字段名等对象名中间不要包含空格同一个My…

Twitter引流如何开发客户

要想在twitter平台上取得效果&#xff0c;你需要先了解twitter的算法规则&#xff0c;去迎合平台&#xff0c;推特群推王给出以下5条建议&#xff0c;让你发布的帖子更容易被推荐。 这里Twitter群推王可以给大家讲一下&#xff0c;关于推特平台的算法排名&#xff1a; Twitter…

nginx降权+安装php

nginx降权 使用普通用户启动Nginx 为什么要让nginx服务使用普通用户 默认情况下&#xff0c;nginx的master进程使用的是root用户&#xff0c;worker进程使用的是nginx指定的普通用户&#xff0c;使用root用户跑nginx的master进程有两个大问题&#xff1a; &#xff08;1&#x…

课程设计-天天象棋作弊软件判别

目录 1.作弊开挂可能迹象 2.设计作弊检测系统灵感 3.设计作弊检测系统思路 3.1反作弊系统应对策略框架 4.感想体悟 1.作弊开挂可能迹象 1.非实名认证&#xff1b; 2.头像&#xff1a;美女&#xff1b; 3.名称&#xff1a; (1)一串英文字母&#xff1b; (2)非正常中文名…

【深度分解网络:显著性分析:IVIF】

Infrared and Visible Image Fusion Based on Deep Decomposition Network and Saliency Analysis &#xff08;基于深度分解网络和显著性分析的红外与可见光图像融合&#xff09; 传统的图像融合侧重于选择一种有效的分解方法从源图像中提取代表性特征&#xff0c;并试图找到…

2022年海运行业研究报告

第一章 行业概况 海洋运输又称“国际海洋运输”&#xff0c;提供海上客运或者货运服务的行业。是国际物流中最主要的运输方式。它是指使用船舶通过海上航道在不同国家和地区的港口之间运送货物的一种方式&#xff0c;在国际货物运输中使用最广泛。国际贸易总运量中的2/3以上&a…

功率放大器和电压放大器的区别是什么意思

很多人经常会在后台咨询小编功率放大器和电压放大器的区别有哪些&#xff1f;今天就来为大家科普一下功率放大器和电压放大器的知识内容&#xff0c;希望大家下次能够区分&#xff0c;并且可以正常地选择和使用功率放大器。 图&#xff1a;功率放大电路与电压放大电路对比 功率…

Opengl ES之YUV数据渲染

YUV回顾 记得在音视频基础知识介绍中&#xff0c;笔者专门介绍过YUV的相关知识&#xff0c;可以参考&#xff1a; 《音视频基础知识-YUV图像》 YUV数据量相比RGB较小&#xff0c;因此YUV适用于传输&#xff0c;但是YUV图不能直接用于显示&#xff0c;需要转换为RGB格式才能显…

简单的股票行情演示(一) - 实时标的数据

一、概述二、效果展示三、实现代码 1、行情数据中心2、数据拉取模块3、基础服务模块4、UI展示四、相关文章原文链接&#xff1a;简单的股票行情演示&#xff08;一&#xff09; - 实时标的数据 一、概述 很长一段时间都有一个想法&#xff0c;使用QCP去做一个行情展示小事例&…

TiDB Cloud

TiDB Cloud 为什么选择TiDB 分布式数据库-多租户混合工作负载-在同一个数据库中 事务型&#xff1a;基于行的数据分析型&#xff1a;基于列的数据 弹性比例&#xff1a; 缩小-减少节点横向扩展-添加节点 基于“RAFT”的高可用性 每个数据段的3个可用区进行复制 多租户 什么…

DataGridXL 2.0 for JavaScript Crack

你的web开发好了&#xff0c;客户说我习惯用excel这样的表格&#xff0c;你们是否能开发像电子表格一样的功能&#xff1f; Web 应用程序的类似 Excel 的体验---DataGridXL 2.0 for JavaScript Crack 你已经构建了一个 Web 应用程序&#xff0c;但你的用户坚持使用 Excel。 类似…

一、ROS2简介

ros2相关简介 ROS2的前身是ROS&#xff0c;ROS即机器人操作系统&#xff08;Robot Operating System&#xff09;。但是ROS本身并不是一个操作系统&#xff0c;而是一个软件库和工具集。 Ros的出现解决了机器人各个组件的通信问题&#xff0c;后来越来越多的机器人算法也集成到…

漫谈信息模型(1)

简单地表达复杂的世界&#xff0c;这是各类思想家近千年来的追求。如何将人类在世界上观察到的结果进行概念化表达&#xff1f;又如何描述人造的复杂工具&#xff1f;这种探索成为人类文明进步的一个重要的驱动力。计算机的出现&#xff0c;推动了人类对现实事物进行概念化的描…

技术开发87

技术开发87 业务内容&#xff1a; . 冲床加工&#xff0c;高速冲床加工&#xff0c;省力化机械制作 . 铣床加工&#xff0c;食品机械制作 . 轮廓加工&#xff0c;钢丝加工 . 冲床模具制作 . 溶接 公司简介&#xff1a; 资本金&#xff1a;1000万日元&#xff08;约66元人…

文件数据丢失怎么办?推荐几款好用的文件恢复大师

众所周知&#xff0c;计算机在使用过程中难免会出现文件数据丢失的情况&#xff0c;这是一种非常正常的现象。但是遇到这种情况&#xff0c;很多时候我们不知道该如何去补救。特别是由于一些原因导致电脑被重启&#xff0c;这样不仅会对电脑造成一定影响&#xff0c;更重要的是…

2022年8月15日陌陌推荐算法工程师面试题5道|含解

8本电子书免费送给大家&#xff0c;见文末。 1、DeBERTa与BERT的区别 DeBERTa提出了两种改进BERT预训练的方法&#xff1a;第一种方法是分散注意机制&#xff0c;该机制使用两个向量分别对每个单词的内容和位置进行编码来表示每个单词&#xff0c;并使用分散矩阵计算单词之间…

本地传奇架设详细教程

十二堂今天给大家分享一篇技术文章&#xff0c;传奇架设教程。 教程讲的很详细&#xff0c;就是一个菜鸟都能学会如何架设传奇。 在管理工具&#xff0d;>服务中停止ssdpdiscoveryservic服务 一、准备软件DBCommander 2000 Pro和传奇服务端&#xff08;什么版本都行&#x…

设计模式之代理模式(十一)

目录 1. 静态代理 2. 动态代理 3. Cglib代理 代理模式&#xff1a;为一个对象提供一个替身&#xff0c;以控制对这个对象的访问。好处就是可以用来增强。 被代理的对象可以是 远程对象&#xff0c;创建开销大的对象 或者 需要安全控制的对象。 可以分为三类 静态代理动态代…