当前位置: 首页 > news >正文

spring boot(学习笔记第十四课)

spring boot(学习笔记第十四课)

  • Spring Security的密码加密,基于数据库认证

学习内容:

  1. Spring Security的密码加密
  2. 基于数据库认证

1. Spring Security的密码加密

  1. 如果用户的密码保存在数据库中是以明文保存,对于公司的安全将是灾难性的,哪个公司也不会允许用户数据使用明文保存。这里练习使用加密之后的密码进行认证。
    注意,这样公司的数据库里面是没有用户的明文密码,即使数据库泄露,也不会暴漏用户的明文密码在这里插入图片描述
  2. 实现密码加密
    • 配置passwordEncoder
      @Bean
      PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder(10);
      }
      
    • 手动根据明文密码生成密文密码
      bcrypt转换工具
      注意,每次生成的密码都不一样,但是每个生成的都好用
      在这里插入图片描述
    • 使用生成的密文进行用户的创建。
       @BeanUserDetailsService userDetailsService() {InMemoryUserDetailsManager users =new InMemoryUserDetailsManager();users.createUser(User.withUsername("finlay_user").password("$2a$10$uwwZ5EyWbFnnw3JG53rqQ.VJUm/.Pl9Ko1CUP5Aqc2kuBr2Bx7bc.").roles("USER").build());
      
    • 再次进行认证。
      在这里插入图片描述

2. 基于数据库认证

以上练习了基于内存的认证,实际上,正式的系统开发都是使用数据库进行认证,在这里练习使用使用数据库的用户数据进行认证。这里使用postgresql

  1. 首先创建数据库需要的表
    • 创建USER
      CREATE TABLE "USER"(
      id int,
      username varchar(32),
      password varchar(255),
      enabled int,
      locked int,
      PRIMARY KEY(id)
      );
      
    • 创建ROLE
      CREATE TABLE "ROLE"(
      id int,
      name varchar(32),
      nameZh varchar(255),
      PRIMARY KEY(id)
      );
      
    • 创建USER_ROLE表(userrole的关系表)
      CREATE TABLE "USER_ROLE"(
      id int,
      uid int,
      rid int,
      PRIMARY KEY(id)
      );
      
    • 用户数据如下:
      • USER
        在这里插入图片描述
      • ROLE
        在这里插入图片描述
      • USER_ROLE
        在这里插入图片描述
      • USERROLE的关系
        			with uur as ( select* from"USER" u inner join "USER_ROLE" ur on u.id = ur.uid)select username,namezh,name as rolename from uur inner join "ROLE" r on uur.rid = r.id
        
        在这里插入图片描述
  2. 引入必要的依赖
    		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.9</version></dependency>
    
    这里repository使用mybatis,所以引入mybatis的依赖包。
  3. application.properties定义数据库连接信息。
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/springboot
    spring.datasource.username=finlay
    spring.datasource.password=123456
    
  4. 定义mybatisinterface,以及xml文件
    • 定义UserRole的实体类
      @Data
      public class Role {private Integer id;private String name;private String nameZh;
      }
      
      @Data
      public class User implements UserDetails {private Integer id;private String username;private String password;private Boolean enabled;private Boolean locked;private List<Role> roles;@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {List<SimpleGrantedAuthority> authorities = new ArrayList<>();for (Role role : roles) {authorities.add(new SimpleGrantedAuthority(role.getName()));}return authorities;}@Overridepublic String getPassword() {return this.password;}@Overridepublic String getUsername() {return this.username;}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return !this.locked;}@Overridepublic boolean isCredentialsNonExpired(){return true;}@Overridepublic boolean isEnabled(){return this.enabled;}
      }
      
    • 配置mybatis
      @Mapper
      public interface UserMapper {User loadUserByUserName(String usernam);List<Role> getUserRolesByUid(Integer id);
      }
      
    • 配置mybatisxml配置文件
      <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="com.example.demo.repository.mybatis.UserMapper"><select id="loadUserByUserName" resultType="com.example.demo.authentication.User">select * from "USER" where username=#{username}</select><select id="getUserRolesByUid" resultType="com.example.demo.authentication.Role">select * from "ROLE" r, "USER_ROLE" ur where r.id=ur.rid and ur.uid=#{id}</select>
      </mapper>
      
  5. 定义UserDetailsService
    @Service
    public class UserService implements UserDetailsService {@Autowiredpublic UserMapper userMapper;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userMapper.loadUserByUserName(username);if (user == null) {throw new UsernameNotFoundException("username is not found");}user.setRoles(userMapper.getUserRolesByUid(user.getId()));return user;}
    }
    
    注意,这里生成了UserDetailsServicebean,所以spring boot security的的认证处理,都会使用这个bean
  6. 整体的架构
    在这里插入图片描述
  7. 测试认证结果
    在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 7-20FPGA调试日志
  • ThinkPad改安装Windows7系统的操作步骤
  • FastGPT 知识库搜索测试功能解析
  • 云原生项目纪事系列 - 项目管理的鲜活事例
  • 使用百度语音技术实现文字转语音
  • Vue学习(一)初识Vue、事件
  • Spring Boot集成Spring Batch快速入门Demo
  • 秒懂LINUX之初识命令(下)
  • 基于torch-pruning库对resnet18在cifar100数据集上进行剪枝实验
  • 【数据分享】2013-2022年我国省市县三级的逐月SO2数据(excel\shp格式\免费获取)
  • 华为1000人校园实验记录
  • Kafka Producer之ACKS应答机制
  • 泛型新理解
  • 数组算法--基本查找
  • 在vs code中用npm run serve运行项目报错
  • 03Go 类型总结
  • C++入门教程(10):for 语句
  • ES6--对象的扩展
  • laravel5.5 视图共享数据
  • mongodb--安装和初步使用教程
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 分布式事物理论与实践
  • 力扣(LeetCode)56
  • 如何编写一个可升级的智能合约
  • 如何进阶一名有竞争力的程序员?
  • 什么是Javascript函数节流?
  • 小李飞刀:SQL题目刷起来!
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​一些不规范的GTID使用场景
  • #laravel 通过手动安装依赖PHPExcel#
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #QT项目实战(天气预报)
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (第61天)多租户架构(CDB/PDB)
  • (六)vue-router+UI组件库
  • (四)汇编语言——简单程序
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (自用)网络编程
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .env.development、.env.production、.env.staging
  • .net打印*三角形
  • .Net组件程序设计之线程、并发管理(一)
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [ JavaScript ] JSON方法
  • [<事务专题>]
  • [ANT] 项目中应用ANT
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [BZOJ 2142]礼物(扩展Lucas定理)