首页 > 其他分享 >spring boot(学习笔记第十四课)

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

时间:2024-07-20 22:55:47浏览次数:9  
标签:username spring boot public ROLE USER 第十四 id

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

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

学习内容:

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

1. Spring Security的密码加密

  1. 如果用户的密码保存在数据库中是以明文保存,对于公司的安全将是灾难性的,哪个公司也不会允许用户数据使用明文保存。这里练习使用加密之后的密码进行认证。
    注意,这样公司的数据库里面是没有用户的明文密码,即使数据库泄露,也不会暴漏用户的明文密码在这里插入图片描述
  2. 实现密码加密
    • 配置passwordEncoder
      @Bean
      PasswordEncoder passwordEncoder() {
         return new BCryptPasswordEncoder(10);
      }
      
    • 手动根据明文密码生成密文密码
      bcrypt转换工具
      注意,每次生成的密码都不一样,但是每个生成的都好用
      在这里插入图片描述
    • 使用生成的密文进行用户的创建。
       @Bean
          UserDetailsService 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;
      
          @Override
          public Collection<? extends GrantedAuthority> getAuthorities() {
              List<SimpleGrantedAuthority> authorities = new ArrayList<>();
              for (Role role : roles) {
                  authorities.add(new SimpleGrantedAuthority(role.getName()));
              }
              return authorities;
          }
      
          @Override
          public String getPassword() {
              return this.password;
          }
      
          @Override
          public String getUsername() {
              return this.username;
          }
      
          @Override
          public boolean isAccountNonExpired() {
              return true;
          }
      
          @Override
          public boolean isAccountNonLocked() {
              return !this.locked;
          }
          @Override
          public boolean isCredentialsNonExpired(){
              return true;
          }
          @Override
          public boolean isEnabled(){
              return this.enabled;
          }
      }
      
    • 配置mybatis
      @Mapper
      public interface UserMapper {
          User loadUserByUserName(String usernam);
          List<Role> getUserRolesByUid(Integer id);
      }
      
    • 配置mybatisxml配置文件
      <!DOCTYPE mapper
              PUBLIC "-//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 {
        @Autowired
        public UserMapper userMapper;
    
        @Override
        public 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. 测试认证结果
    在这里插入图片描述

标签:username,spring,boot,public,ROLE,USER,第十四,id
From: https://blog.csdn.net/sealaugh1980/article/details/140483183

相关文章

  • springboot基于Java的人力资源管理系统的设计与实现人事管理工资员工管理系统(源码+lw
    具体实现截图技术栈后端框架SpringBoot采用springboot作为后台的框架,java框架具有简化配置和开发的效率。Spring框架目前是很多java开发者的首选框架,Spring主要有两大功能,控制反转和面向切面的编程。控制反转(IOC)可以实现代码的依赖注入,减少代码......
  • springboot基于Java的企业人才引进服务平台的设计与实现(源码+lw+部署文档+讲解等)
    具体实现截图技术栈后端框架SpringBoot采用springboot作为后台的框架,java框架具有简化配置和开发的效率。Spring框架目前是很多java开发者的首选框架,Spring主要有两大功能,控制反转和面向切面的编程。控制反转(IOC)可以实现代码的依赖注入,减少代......
  • 基于SpringBoot+Vue的二手手机交易平台的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示项目运行截图技术框架后端采用SpringBoot框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • 对于Spring Boot的渗透姿势
    0#SpringBoot概述SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的创建、运行、调试、部署等。使用SpringBoot可以做到专注于Spring应用的开发,而无需过多关注XML的配置。SpringBoot使用“习惯优于配置”的理念,简单来说,它提供了一堆依赖......
  • SpringAOP的简单介绍及入门案例
    文章目录一、AOP介绍二、使用步骤(日志案例)1.创建模块,导入依赖2.创建实体类3.创建业务层接口和实现类4.创建日志类5.配置切面6.创建配置类7.单元测试三、通知类型1.四大通知2.环绕通知四、切点表达式1.execution2.@annotation五、记录日志详情一、AOP介绍AOP(......
  • springboot的多环境配置
    文章目录一、多环境配置yml二、项目部署打成jar包一、多环境配置在实际开发中,项目的开发环境、测试环境中配置可能不一致,因此SpringBoot支持多环境配置java-jarxxx,jaryml这三个yml文件做配置这个一般为本地开发环境这个为生产环境这个为测试环境二、......
  • Spring boot + Mybatis 实现数据库的增删改查(CRUD)操作
    Springboot+Mybatis实现数据库的增删改查(CRUD)操作利用Springboot,我们可以快速构建Spring框架应用。利用Mybatis为Springboot提供的依赖,我们可以快捷地连接到MySQL,实现web项目对数据库的CRUD操作。一、创建项目在IDEA中新建maven项目,并在pom.xml......
  • 基于SpringBoot+Vue+uniapp的新闻资讯系统(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • bootstrap4登录注册页面
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><title>login</title><metaname="description"content......
  • bootstrap4注册页面
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><title>register</title><metaname="description"co......