首页 > 数据库 >springboot security对接mysql数据库

springboot security对接mysql数据库

时间:2024-04-04 20:45:24浏览次数:36  
标签:return springboot student mysql import security public String

首先要添加springboot security依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>3.2.4</version>
</dependency>

实现UserDetailsServiceImpl、UserDetailsImpl类

这里只实现了student用户的登录验证

UserDetailsImpl.java: (实现UserDetails接口)

注意默认的方法很多都是false,需要去改成true。(比如是否允许登录等权限要改成true,还有相应的getUsername返回username等)

package com.ajg.backend.service.impl.utils;

import com.ajg.backend.pojo.Student;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDetailsImpl implements UserDetails {
    private Student student;
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public String getPassword() {
        return student.getPassword();
    }

    @Override
    public String getUsername() {
        return student.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

UserDetailsServiceImpl.java:(实现UserDetailsService接口)

package com.ajg.backend.service.impl;

import com.ajg.backend.mapper.StudentMapper;
import com.ajg.backend.pojo.Student;
import com.ajg.backend.service.impl.utils.UserDetailsImpl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private StudentMapper studentMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 如果想要对接数据库,需要根据这个username去数据库中查询这个用户,把这个用户找出来
        QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username",username);
        Student student = studentMapper.selectOne(queryWrapper);
        if (student == null) {
            throw new RuntimeException("用户不存在");
        }

        // 这里应该去判断前端传过来的登录信息是哪个类型用户的,然后去调用相应的mapper去查相应的数据库表

        return new UserDetailsImpl(student);
    }
}

现在重启服务会发现需要登录了,这时输入student表中的用户名密码就能登录

这时就已经对接了数据库了

扩展-实现密码加密存储

需要配置一个SecurityConfig.java: (写在backend/config下)

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(); // 返回一个BCryptPasswordEncoder对象,这个对象有.encode()、.matches()等方法,可以对密码加密,判断是否匹配
    }
}

下面这个StudentTestController.java就实现了密码加密存储:

@RestController
public class StudentController {
    @Autowired
    StudentMapper studentMapper;

    @RequestMapping("/student/all/")
    public List<Student> getAll() {
        return studentMapper.selectList(null);
    }
    @GetMapping("/student/add/{username}/{name}/{email}/{password}/")
    public String addStudent(
            @PathVariable String username,
            @PathVariable String name,
            @PathVariable String email,
            @PathVariable String password
            ) {
        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String encodedPassword = passwordEncoder.encode(password); // 加密
        Student student = new Student(null,username,encodedPassword,name,email,null,null);
        studentMapper.insert(student);
        return "add student successfully!";
    }
}

标签:return,springboot,student,mysql,import,security,public,String
From: https://www.cnblogs.com/rdisheng/p/18114566

相关文章

  • 基于springboot+JavaWeb技术的在线考试系统源码数据库
    基于JavaWeb技术的在线考试系统设计与实现摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于JavaWeb技术的在线考试系统设计与实现的开发全过程。通过分析基于JavaWeb技术的在线考试系统设计与实现管理的不足,创建了一......
  • 基于Springboot框架在线小说电子书阅读系统设计与实现(安装部署+源码+文档)
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • 字节二面:为什么SpringBoot的 jar 可以直接运行?我说因为内嵌了Tomcat容器,他让我出门左
    引言在传统的Java应用程序开发和部署场景中,开发者往往需要经历一系列复杂的步骤才能将应用成功部署到生产环境。例如,对于基于Servlet规范的JavaWeb应用,开发完成后通常会被打包成WAR格式,然后部署到像ApacheTomcat、Jetty这样的Web容器中。这一过程中,不仅要管理应用本身的编译产......
  • MySQL面试题系列-6
    MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。数据库的三范式数据库的三范式......
  • MySQL面试题系列-7
    MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。mysql的索引覆盖是什么?在MySQL......
  • Python+requests+Pytest+logging+allure+pymysql框架详解
    一、框架目录结构1)tools目录用来放公共方法存储,如发送接口以及读取测试数据的方法,响应断言数据库断言前置sql等方法;2)datas目录用例存储接口用例的测试数据,我是用excel来存储的数据,文件数据图片数据等;3)testcases目录用来存放测试用例,一个python文件对应一个接口模块的......
  • [MySQL] “MySQL 服务无法启动”原理及解决方法
    最近在学习数据库,安装MySQL时候第一条指令netstartmysql就无法正常运行,错误如下:MySQL服务正在启动.MySQL服务无法启动。服务没有报告任何错误。请键入NETHELPMSG3534以获得更多的帮助。在网上找了很多教程,百度靠前的全部都是让跟着输入以下指令:E:\Mysql\mysql-8.0.2......
  • java计算机毕业设计(附源码)音乐播放平台(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着数字时代的到来,音乐播放平台已经成为了人们生活中不可或缺的一部分。这些平台通过互联网提供了大量的音乐资源,使得用户可以随时随地欣赏到自己喜欢的......
  • java计算机毕业设计(附源码)音乐播放器app(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当今的数字化时代,音乐已经成为人们日常生活中不可或缺的一部分。随着智能手机和移动互联网的普及,音乐播放器app应运而生,为人们提供了随时随地欣赏音乐......
  • mysqli 事务处理
    <?php$mysqli=newmysqli("localhost","username","password","database");//检查连接是否成功if($mysqli->connect_error){die("连接失败:".$mysqli->connect_error);}//开启一个事务$mysqli->autoc......