Spring Security加密认证|学习笔记

简介: 快速学习 Spring Security加密认证

开发者学堂课程【Spring Security知识精讲与实战演示(一)Spring Security加密认证】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/730/detail/13039


Spring Security加密认证

 

认证的流程已经做完,还有一些季节性的东西需要来优化,第一个,现在的认证走的全是原文,说明我们把密码截止到数据库,大家谁都进来可以看到密码是123,这样做是不合理的。我们应该存到数据库里面的密码应该是加密后的密文,要涉及到加密,我们只认得spring security,也给我们提供了一种加密方式。

我们可以来对这个加密方式先进行一个简单的测试和介绍。Create New Class中的Name填的是com.itheima.test.Encoding Test。

image.png

public class EncodingTest {后边填写上public static void main(String[] args){BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();System out. print In(passwordEncoder).把鼠标放在passwordEncoder.后会出现两种方法,一种是encode(CharSequence rawPassword),rawPassword是原文的意思,原来密码是123,把123写到CharSequence后,再返回一个String,是加密后的String。

还有一个是 matches(CharSequence rawPassword, String encodedPassword),我们来看,rawPassword 指的是原文,encodedPassword 指的是密文,写一个原文,再写一个密文,它会返回一个boolean值。如果它发现这两个密码是同一个,肯定会给你返回String,如果不是同一个,它就会给你返回boolean。当它给我一个123,我们第一次加密文,第二次进行判断,我们这再加密一下,我们就可以判断出来吗?我们在System out. print In (passwordEncoder. encode()中填写上rawPassword:"123"),选中实行,将$2a$10$CYX90Mv0y08wR8rE19N2f0aXDJondci5uR68k2eQJm50q8ESsDMIC粘贴复制到public class EncodingTest下边。

我们再来看一下第二次加密后的结果,将$2a$10$sfam Br judKnEeuhZGrh6.p67bUzBX/Szq3i47oagpR1kQQmlwQ7G粘贴复制到$2a$10$CYX90Mv0y08wR8rE19N2f0aXDJondci5uR68k2eQJm50q8ESsDMIC后,我们可以再执行一次,事不过三,三次都不一样可以推断出它永远都不一样,$2a$10$hy6Kk0fi.qTTiQx6WXX6ru9goE2FFy7xzidT75ji8N00SV4po4Fou粘贴复制过去,我们可以发现三种都不一样。

FM5每次用完都是一样的,有一个概念叫做加盐加密,例如md 5,如果原文是123,加完密之后可能是bcaddjlj,但是需要我们注意的是,我们以前md 5123加完密之后永远是bcaddjlj,如果永远是bcaddjlj,那这安全性还可以有保障吗?只要收集大量的这种建筑盾,我拿它当配值去get一下123,就是密码。但是如果这样做就没有安全性可言了,真正用md5要加盐,加盐即例如我现在有一个规则很简单,就是破坏里边原来的味道,原来是123,我们的盐是首字母跟最后一个字母调换,若还是还不放心,可以加一个名,例如调换一下就变成321了,原来密码123,首尾交换就变成321。

若觉得这还不靠谱,我们可以加用户名,在用户名后加上xiaoming,加完密之后是另外一种,例如是dhxjndjdjn,既然是另外一种,相较于之前的会保险很多。是相对,不是绝对,因为这个盐也是人静,那这个盐如果泄露出去,这个密码就会不准了。这个密码我得到了这一串,我知道你不是密码,但是我知道盐,我们把最后的用户名去掉,首位调换我们再换回来,即我们就知道密码是123所以说这个也不保险。spring security可以做到动态加盐,动态加盐即每一次加的盐都不一样,我们永远不知道他下一次加的是什么,但是它的位置是固定的,它会分析出位置来判断是否是同一个,但是我们注意,因为盐我们是不知道的,所以我们不能判断两个密码是否是同一个。

所以package方法就是必须的。上述就是我们介绍spring security的加盐加密。那么知道这个对象之后,我们就可以用这个对象说把我们这数据库中的密码加密,并且认证方法我们也可以改成加密。

image.png

接下来做这个操作,右键可以控制他的舰队名。首先做第一步,我们要把当前这个加密对象放到ID容器中。这个很简单,我们写上<bean id="" class="org. springframework. security.crypto.berypt. BGryptPasswordEncoder,此时有一个细节需要我们注意,当前这个加密对象的默认密码是passwordEncoder,ID写的就是passwordEncoder,但是我们记不住这个名字,所以有一个更靠谱的方式直接在这里边填写s,就会出现security:password-encoder ref="",再把passwordEncoder粘贴复制进去,此时就更靠谱了,不管我们的密码是啥,我这都可以用,但是我们需要注意,如果我们默认ID的话,我们得把加密对象放入到IOC容器中这一句放到这个认证提供经济来源这个配置的上面,放下面不好选。

如果我们直接通过security:password-encoder ref="passwordEncoder"引用过来,我们就可以随便放置。此时我们的ioc容器中就有了一个加密对象,并且我们告诉spring security,

image.png

此时需要注意,就不要再配置那句话,配置也不起作用。此时它就是加密认证,加密认证这就这么简单,做完之后我们想,在保存数据库中的对象,它不是加密的。

我们可以在这里边做一个修改,我们注入@Autowired private BCryptPasswordEncoder passwordEncoder,注入之后就会变得很简单,我们再输入user. setPassword(passwordEncoder. encode(user. getPassword()),再次保存到数据库中密码就是密文了。到此,加密工作就做完了,保存到数据库中密码是加密的,认证的时候也是加密的。

重新启动,启动的时候有一个问题。问题是此时认证还能通过吗?用户名我们还是需要输入xiaoming,密码是123,此时是没有用的。因为此时它认为123是密文,但是我们的123不是密文,所有此时我们可以再来登录一次,用户名写xiaoming,密码是123,点击登录,界面一闪而过,并没有成功,认证失败。

认证失败应该有认证失败的界面,认证失败的界面应该出现在认证时候之后,但是失败的时候并没有ROLE_USER,即没有这个角色就不能访问这个界面,同理,不能出现这个页面,系统就会自己进行跳页,authentication-failure-url="/failer.jsp就不起作用,所以要将failer.jsp进行释放,把failer.jsp复制粘贴到<security:http pattern="/failer.jsp"security-"none"/)里,这样的话页面不认证也可以访问了。

但是它没有必要经过后续的过滤器,所以把它放到最外面就行了,此时再来重新启动,重新启动之后,此时就能跳转到我们的认证失败界面,启动之后后再次弹跳出登录页面,再次输入用户名xiaoming,密码是123,意看现点击登录。此时就可以到认证失败页面。若我们想成功,我们可以在Encoding里$2a$10$CYX90Mv0y08wR8rE19N2f0aXDJondci5uR68k2eQJm50q8ESsDMIC粘贴复制password栏里,这里只能手动更改。进行刷新后,此时就更改成了$2a$10$CYX90Mv0y08wR8rE19N2f0aXDJondci5uR68k2eQJm50q8ESsDMIC。再进行刷新,刷新之后再次返回到登录界面,输入用户名 xiaoming,密码是123,点击登录,登录成功。这一次就是加密认证。以上是加密认证这一部分,以后在实地公司做开发的时候,一定要注意我们数据库中的用户密码一定要是加密的状态。

相关文章
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
2054 5
|
2月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
9月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
498 0
|
9月前
|
监控 Java 应用服务中间件
微服务——SpringBoot使用归纳——为什么学习Spring Boot
本文主要探讨为什么学习Spring Boot。从Spring官方定位来看,Spring Boot旨在快速启动和运行项目,简化配置与编码。其优点包括:1) 良好的基因,继承了Spring框架的优点;2) 简化编码,通过starter依赖减少手动配置;3) 简化配置,采用Java Config方式替代繁琐的XML配置;4) 简化部署,内嵌Tomcat支持一键式启动;5) 简化监控,提供运行期性能参数获取功能。此外,从未来发展趋势看,微服务架构逐渐成为主流,而Spring Boot作为官方推荐技术,与Spring Cloud配合使用,将成为未来发展的重要方向。
364 0
微服务——SpringBoot使用归纳——为什么学习Spring Boot
|
4月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1056 10
|
5月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
1205 1
|
6月前
|
安全 Java 数据库
Spring Boot 框架深入学习示例教程详解
本教程深入讲解Spring Boot框架,先介绍其基础概念与优势,如自动配置、独立运行等。通过搭建项目、配置数据库等步骤展示技术方案,并结合RESTful API开发实例帮助学习。内容涵盖环境搭建、核心组件应用(Spring MVC、Spring Data JPA、Spring Security)及示例项目——在线书店系统,助你掌握Spring Boot开发全流程。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
1046 2
|
8月前
|
Java Spring
Spring框架的学习与应用
总的来说,Spring框架是Java开发中的一把强大的工具。通过理解其核心概念,通过实践来学习和掌握,你可以充分利用Spring框架的强大功能,提高你的开发效率和代码质量。
204 20
|
9月前
|
编解码 安全 Java
如何在Spring Boot中实现数据加密
本文介绍了如何在Spring Boot中实现数据加密。首先阐述了数据加密的重要性与应用场景,接着讲解了对称加密和非对称加密的原理及区别。通过添加依赖、配置加密算法、编写加密工具类等步骤,展示了具体实现方法,并在业务代码中应用加密技术保护敏感数据。希望对开发者有所帮助。
722 7
|
10月前
|
Java 应用服务中间件 Scala
Spring Boot 实现通用 Auth 认证的 4 种方式
本文介绍了在Spring Boot中实现通用Auth的四种方式:传统AOP、拦截器(Interceptor)、参数解析器(ArgumentResolver)和过滤器(Filter)。每种方式都通过实例代码详细说明了实现步骤,并总结了它们的执行顺序。首先,Filter作为Servlet规范的一部分最先被调用;接着是Interceptor,它可以在Controller方法执行前后进行处理;然后是ArgumentResolver,在参数传递给Controller之前解析并验证参数
227 1