首页 > 数据库 >springboot整合springsecurity,从数据库中认证

springboot整合springsecurity,从数据库中认证

时间:2024-03-19 23:02:07浏览次数:29  
标签:springboot 数据库 springframework springsecurity user import org public String

概述:springsecurity这个东西太容易忘了,这里写点东西,避免忘掉

目录

第一步:引入依赖

第二步:创建user表

第三步:创建一个用户实体类(User)和一个用于访问用户数据的Repository接口

第四步:创建一个实现UserDetailsService接口的自定义用户详情服务类,用于从数据库中加载用户信息。

第五步:创建一个配置类来配置Spring Security。

第六步:创建一个简单的控制器类用于测试

第七步:编写一个简单的数据库初始化器类用于初始化用户信息

运行项目测试查看结果


第一步:引入依赖

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.cyl</groupId>
    <artifactId>spaceTutorial</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Send</name>
    <description>Send</description>
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.7.13</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring Boot Starter Data JPA -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!-- Spring Boot Starter Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- MySQL Connector Java -->
         <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>


    </dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <compilerArgs>
                    <arg>--enable-preview</arg>
                    <arg>--add-modules=jdk.incubator.vector</arg>
                </compilerArgs>
                <compilerVersion>17</compilerVersion>
                <source>17</source>
                <target>17</target>
            </configuration>
        </plugin>
    </plugins>
</build>
</project>

第二步:创建user表

CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(100) NOT NULL,
    password VARCHAR(255) NOT NULL,
    enabled TINYINT(1) DEFAULT 1,
    role VARCHAR(50)
);

第三步:创建一个用户实体类(User)和一个用于访问用户数据的Repository接口

User类

package org.cyl.spaceutils.pojo;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "users")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "username")
    private String username;
    
    @Column(name = "password")
    private String password;
    
    @Column(name = "enabled")
    private boolean enabled;
    
    @Column(name = "role")
    private String role;

    // Getters and setters

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }
}

Repository接口

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

第四步:创建一个实现UserDetailsService接口的自定义用户详情服务类,用于从数据库中加载用户信息。

实现类

package org.cyl.spaceutils.service;

import org.cyl.spaceutils.pojo.User;
import org.cyl.spaceutils.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.AuthorityUtils;
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 CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found with username: " + username);
        }
        return new org.springframework.security.core.userdetails.User(
                user.getUsername(), user.getPassword(), user.isEnabled(), true, true, true,
                AuthorityUtils.createAuthorityList(user.getRole())
        );
    }
}

第五步:创建一个配置类来配置Spring Security。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasRole("USER")
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .logout().permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

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

第六步:创建一个简单的控制器类用于测试

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "Welcome to the home page!";
    }

    @GetMapping("/user")
    public String user() {
        return "Welcome user!";
    }

    @GetMapping("/admin")
    public String admin() {
        return "Welcome admin!";
    }
}

第七步:编写一个简单的数据库初始化器类用于初始化用户信息

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

@Component
public class DatabaseInitializer implements CommandLineRunner {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public void run(String... args) throws Exception {
        User user = new User();
        user.setUsername("user");
        user.setPassword(passwordEncoder.encode("password"));
        user.setRole("ROLE_USER");
        userRepository.save(user);

        User admin = new User();
        admin.setUsername("admin");
        admin.setPassword(passwordEncoder.encode("admin"));
        admin.setRole("ROLE_ADMIN");
        userRepository.save(admin);
    }
}

运行项目测试查看结果

启动时会增加数据到mysql里面

以ROLE_USER的身份登录

现在登录可能会出现用户被禁用的情况,将enabled设置为1即可

现在用admin账号登录

然后访问/user,出现不能访问,即可

访问/admin,查看

然后用user用户登录,记得先退出

访问/admin,出现无法访问的情况

访问/user,出现访问正常的情况

搞定

标签:springboot,数据库,springframework,springsecurity,user,import,org,public,String
From: https://blog.csdn.net/m0_63251896/article/details/136822228

相关文章

  • 简历管理系统java+springboot+vue
    简历管理系统1、功能介绍1.1、演示视频2、系统部分功能展示管理员功能模块用户管理功能模块模板类型管理报名招聘管理3、系统分析技术可行性操作可行性1、功能介绍本文以Java为开发技术,实现了一个简历管理系统。主要功能:管理员登录,通过填写用户名、密码、角色......
  • MySQL——数据库备份上传到阿里云OSS存储
    前言基于阿里云的OSS存储对数据库进行备份,阿里云ossutil安装文档还是比较详细的,直街参考阿里云文档操作就好了ossutil:https://help.aliyun.com/zh/oss/developer-reference/overview-59内容根据ossutil安装配置好命令行工具,然后直接写相应的脚本就好了,如果存在大表建议单独导......
  • 使用java代码对数据库中的表单数据进行:增,删,改,查,操作。
    1、数据库表单如下:2、在项目中创建TestLinkMysql.java类,用于数据库的增删改查操作。代码如下: packageLink.Mysql;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLExcept......
  • Garnet: 力压Redis的C#高性能分布式存储数据库
    今天看到微软研究院开源了一个新的C#项目,叫Garnet,它实现了Redis协议,可以直接将Redis替换为Garnet,客户端不需要任何修改。根据其官网的信息,简单的介绍一下它。开源仓库地址:https://github.com/microsoft/garnet文档地址:https://microsoft.github.io/garnet/Garnet是微软研究院基......
  • 数据库数据查询:使用SELECT语句从数据库中检索数据
    这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注......
  • 使用navicat导出查询大量数据结果集并导入到其他数据库(mysql)
    在工作中我们偶尔会遇到处理数据的问题;比如需要将处理后的结果集导出来再导入到数据;具体的的实现方案有:1、导出excel再导入在navicat中选中对应数据库的表对象,右键选择导入,导出向导,如图: 2、将查询的结果集导出成sql实现步骤:先整理查询的sql;执行查询,再选择对话框上面的......
  • openGauss Anomaly_detection_数据库指标采集_预测与异常监控
    Anomaly-detection:数据库指标采集、预测与异常监控可获得性本特性自openGauss1.1.0版本开始引入。特性简介anomaly_detection是openGauss集成的、可以用于数据库指标采集、预测以及异常监控与诊断的AI工具,是dbmind套间中的一个组件。支持采集的信息包括IO_Read、IO_Write、CPU......
  • 基于SpringBoot+MyBatis-Plus的图书管理系统
    基于SpringBoot的图书管理系统图书管理系统开发技术功能模块代码结构数据库设计运行截图源码获取图书管理系统开发技术技术:SpringBoot、MyBatis-Plus、MySQL、Beetl、Layui。框架:基于开源框架Snowy-Layui开发。工具:IDEA、Navicat等。功能模块内置三种角色:超级......
  • openGauss DB4AI-数据库驱动AI
    DB4AI:数据库驱动AI可获得性本特性自openGauss2.1.0版本开始引入。特性简介DB4AI是指利用数据库的能力驱动AI任务,实现数据存储、技术栈的同构。通过在数据库内集成AI算法,令openGauss具备数据库原生AI计算引擎、模型管理、AI算子、AI原生执行计划的能力,为用户提供普惠AI技术......
  • Mybatis使用JDBC实现数据库批量添加
    1、spring注入数据源@Resource(name="dataSource")privateDataSourcedataSource;2、连接数据库批量添加publicvoidinsertJdbc(List<StatisticStatus>statusList)throwsSQLException{Connectionconnection=null;PreparedStatem......