使用Spring Boot实现用户认证和授权

文章目录

    • 引言
    • 第一章 Spring Boot概述
      • 1.1 什么是Spring Boot
      • 1.2 Spring Boot的主要特性
    • 第二章 用户认证和授权基础知识
      • 2.1 用户认证
      • 2.2 用户授权
      • 2.3 Spring Security概述
    • 第三章 项目初始化
    • 第四章 实现用户认证和授权
      • 4.1 定义用户实体类和角色实体类
      • 4.2 创建Repository接口
      • 4.3 实现Service类
      • 4.4 配置Spring Security
      • 4.5 创建Controller类
      • 4.6 创建Thymeleaf模板
    • 第五章 部署与监控
      • 5.1 部署Spring Boot应用
      • 5.2 使用Docker部署Spring Boot应用
      • 5.3 监控Spring Boot应用
    • 结论

在这里插入图片描述

引言

在现代Web应用中,用户认证和授权是必不可少的功能。它们确保只有经过验证的用户才能访问应用,并根据用户的角色和权限进行相应的操作。Spring Boot通过集成Spring Security,提供了强大的安全功能,简化了用户认证和授权的实现。本文将详细探讨如何使用Spring Boot实现用户认证和授权,并提供具体的代码示例和应用案例。

第一章 Spring Boot概述

1.1 什么是Spring Boot

Spring Boot是一个基于Spring框架的开源项目,旨在通过简化配置和快速开发,帮助开发者构建独立、生产级的Spring应用。Spring Boot通过自动化配置、内嵌服务器和多样化的配置方式,使得开发者能够更加专注于业务逻辑,而不需要花费大量时间在繁琐的配置上。

1.2 Spring Boot的主要特性

  • 自动化配置:通过自动化配置减少了大量的手动配置工作,开发者只需定义少量的配置,即可启动一个完整的Spring应用。
  • 内嵌服务器:提供内嵌的Tomcat、Jetty和Undertow服务器,方便开发者在开发和测试阶段快速启动和运行应用。
  • 独立运行:应用可以打包成一个可执行的JAR文件,包含所有依赖项,可以独立运行,不需要外部的应用服务器。
  • 生产级功能:提供了监控、度量、健康检查等生产级功能,方便开发者管理和监控应用的运行状态。

第二章 用户认证和授权基础知识

2.1 用户认证

用户认证(Authentication)是验证用户身份的过程。常见的认证方式包括用户名和密码、OAuth、JWT等。认证的目的是确保只有合法用户才能访问系统。

2.2 用户授权

用户授权(Authorization)是对经过认证的用户进行权限控制的过程。授权决定了用户可以访问哪些资源和执行哪些操作。常见的授权方式包括基于角色的访问控制(RBAC)和基于权限的访问控制(PBAC)。

2.3 Spring Security概述

Spring Security是Spring框架的一个子项目,提供了全面的安全服务支持。Spring Security通过高度可扩展的安全机制,简化了用户认证和授权的实现。

第三章 项目初始化

使用Spring Initializr生成一个Spring Boot项目,并添加所需依赖。

<!-- 示例:通过Spring Initializr生成的pom.xml配置文件 -->
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>auth-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>auth-demo</name>
    <description>Demo project for Spring Boot Authentication and Authorization</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

第四章 实现用户认证和授权

4.1 定义用户实体类和角色实体类

定义用户实体类和角色实体类,并配置JPA注解。

// 示例:用户实体类
package com.example.authdemo.model;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String username;
    private String password;
    private boolean enabled;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles = new HashSet<>();

    // Getters and Setters
}

// 示例:角色实体类
package com.example.authdemo.model;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;

    @ManyToMany(mappedBy = "roles")
    private Set<User> users = new HashSet<>();

    // Getters and Setters
}

4.2 创建Repository接口

创建用户和角色的JPA Repository接口,用于数据访问操作。

// 示例:用户Repository接口
package com.example.authdemo.repository;

import com.example.authdemo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

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

// 示例:角色Repository接口
package com.example.authdemo.repository;

import com.example.authdemo.model.Role;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface RoleRepository extends JpaRepository<Role, Long> {
}

4.3 实现Service类

创建UserDetailsService实现类,处理用户认证逻辑。

// 示例:自定义UserDetailsService实现类
package com.example.authdemo.service;

import com.example.authdemo.model.User;
import com.example.authdemo.repository.UserRepository;
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 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.getRoles());
    }
}

4.4 配置Spring Security

配置Spring Security,实现用户认证和授权。

// 示例:Spring Security配置类
package com.example.authdemo.config;

import com.example.authdemo.service.CustomUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private CustomUserDetailsService userDetailsService;

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

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

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

4.5 创建Controller类

创建控制器类,处理用户登录、注册等请求。

// 示例:用户控制器类
package com.example.authdemo.controller;

import com.example.authdemo.model.User;
import com.example.authdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;


import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @GetMapping("/register")
    public String register(Model model) {
        model.addAttribute("user", new User());
        return "register";
    }

    @PostMapping("/register")
    public String registerUser(@ModelAttribute User user) {
        userService.save(user);
        return "redirect:/login";
    }
}

4.6 创建Thymeleaf模板

创建Thymeleaf模板,提供用户登录和注册页面。

<!-- 示例:login.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Login</title>
    <link rel="stylesheet" th:href="@{/css/style.css}">
</head>
<body>
    <h1>Login</h1>
    <form th:action="@{/login}" method="post">
        <div>
            <label for="username">Username</label>
            <input type="text" id="username" name="username" required>
        </div>
        <div>
            <label for="password">Password</label>
            <input type="password" id="password" name="password" required>
        </div>
        <div>
            <button type="submit">Login</button>
        </div>
    </form>
</body>
</html>
<!-- 示例:register.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Register</title>
    <link rel="stylesheet" th:href="@{/css/style.css}">
</head>
<body>
    <h1>Register</h1>
    <form th:action="@{/register}" method="post" th:object="${user}">
        <div>
            <label for="username">Username</label>
            <input type="text" id="username" th:field="*{username}" required>
        </div>
        <div>
            <label for="password">Password</label>
            <input type="password" id="password" th:field="*{password}" required>
        </div>
        <div>
            <button type="submit">Register</button>
        </div>
    </form>
</body>
</html>

第五章 部署与监控

5.1 部署Spring Boot应用

Spring Boot应用可以通过多种方式进行部署,包括打包成JAR文件、Docker容器等。

# 打包Spring Boot应用
mvn clean package

# 运行Spring Boot应用
java -jar target/auth-demo-0.0.1-SNAPSHOT.jar

5.2 使用Docker部署Spring Boot应用

Docker是一个开源的容器化平台,可以帮助开发者将Spring Boot应用打包成容器镜像,并在任何环境中运行。

# 示例:Dockerfile文件
FROM openjdk:11-jre-slim
VOLUME /tmp
COPY target/auth-demo-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
# 构建Docker镜像
docker build -t spring-boot-auth-demo .

# 运行Docker容器
docker run -p 8080:8080 spring-boot-auth-demo

5.3 监控Spring Boot应用

Spring Boot Actuator提供了丰富的监控功能,通过Prometheus和Grafana,可以实现对Spring Boot应用的监控和可视化。

<!-- 示例:集成Prometheus的pom.xml配置文件 -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
# 示例:Prometheus配置文件
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    prometheus:
      enabled: true

结论

通过Spring Boot和Spring Security,开发者可以高效地实现用户认证和授权功能,确保系统的安全性和可靠性。本文详细介绍了用户认证和授权的基础知识、Spring Boot项目的初始化、具体实现以及部署和监控,帮助读者深入理解和掌握Spring Boot在用户认证和授权中的应用。希望本文能够为您进一步探索和应用Spring Boot提供有价值的参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/733974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

点击旋转箭头样式

实现效果&#xff1a; html界面&#xff0c;主要通过isdown来控制箭头是上还是下 <el-popoverplacement"bottom"trigger"click":visible-arrow"false"v-model"isdown"popper-class"user-popover"><divslot"re…

IF膨胀时代,“水刊”当赢?2023热门“水刊”影响因子详解!

【欧亚科睿学术】 1 “四大水刊”详情 图片来源&#xff1a;欧亚科睿学术整理 “四大水刊”的影响因子均有所下跌&#xff0c;其中&#xff0c;曾经被列入中科院预警名单的期刊MEDICINE&#xff0c;其影响因子已是连续三年持续下降。从JCR分区来看&#xff0c;四本期刊分区均…

【已解决】Qwen2:KeyError: ‘qwen2‘

问题背景&#xff1a; 在运行 Qwen2-7B-Instruct 时&#xff0c;报错&#xff1a;KeyError: qwen2 原因说明&#xff1a; Transformer版本过低&#xff0c;需要升级版本 解决方案&#xff1a; pip install -U transformers 参考&#xff1a; 【modelscope_Qwen2-7B-Instr…

windows设置开机启动项

将文件放到下面路径即可实现每次开机启动 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

胖东来启示录:传统商超如何逆境求生?

近日&#xff0c;经过胖东来精心调改的永辉超市郑州信万广场店盛大开业&#xff0c;首日销售额高达188万元&#xff0c;客流量突破1.2万人&#xff0c;业绩飙升13.9倍&#xff0c;这一惊人数据无疑为当前低迷的传统商超行业带来了一线生机。胖东来&#xff0c;这位零售业的黑马…

[数据集][目标检测]棉花叶子害虫检测数据集VOC+YOLO格式595张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;595 标注数量(xml文件个数)&#xff1a;595 标注数量(txt文件个数)&#xff1a;595 标注类别…

小程序 UI 设计缔造独特魅力

小程序 UI 设计缔造独特魅力

Linux_内核缓冲区

目录 1、用户缓冲区概念 2、用户缓冲区刷新策略 3、用户缓冲区的好处 4、内核缓冲区 5、验证内核缓冲区 6、用户缓冲区存放的位置 7、全缓冲 结语 前言&#xff1a; Linux下的内核缓冲区存在于系统中&#xff0c;该缓冲区和用户层面的缓冲区不过同一个概念&#x…

基于大型语言模型的全双工语音对话方案

摘要解读 我们提出了一种能够以全双工方式运行的生成性对话系统&#xff0c;实现了无缝互动。该系统基于一个精心调整的大型语言模型&#xff08;LLM&#xff09;&#xff0c;使其能够感知模块、运动功能模块以及一个具有两种状态&#xff08;称为神经有限状态机&#xff0c;n…

数据库管理-第207期 HTAP核心:列存技术探索(20240619)

数据库管理207期 2024-06-19 数据库管理-第207期 HTAP核心&#xff1a;列存技术探索&#xff08;20240619&#xff09;1 Oracle In-memory1.1 基本概念1.2 基本测试1.3 Exadata增强 2 OceanBase3 TiDB4 PolarDB总结 数据库管理-第207期 HTAP核心&#xff1a;列存技术探索&#…

atcoder abc 358

A welcome to AtCoder Land 题目&#xff1a; 思路&#xff1a;字符串比较 代码&#xff1a; #include <bits/stdc.h>using namespace std;int main() {string a, b;cin >> a >> b;if(a "AtCoder" && b "Land") cout <&…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 目录管理器(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 目录管理器(200分) 🌍 评测功能需要订阅专栏后私信联系清隆…

无限滚动表格

纵向无限滚动 单元格内部横向滚动 <!--* Description: 横向、纵向滚动表格* Author: liyanfeng liyanfenghopewind.com* Date: 2024-06-15 16:06:57* LastEditors: liyanfeng liyanfenghopewind.com* LastEditTime: 2024-06-20 17:15:37* FilePath: \plus-ui\src\componen…

Python武器库开发-武器库篇之ThinkPHP 2.x 任意代码执行漏洞(六十三)

Python武器库开发-武器库篇之ThinkPHP 2.x 任意代码执行漏洞&#xff08;六十三&#xff09; PHP代码审计简介 PHP代码审计是指对PHP程序进行安全审计&#xff0c;以发现潜在的安全漏洞和风险。PHP是一种流行的服务器端脚本语言&#xff0c;广泛用于开发网站和Web应用程序。由…

8.华为两台交换机的三种连接方式access 、trunk、undo portswitch

目的&#xff1a;两台三层交换机的三种连接方式 1.access 2.trunk 3.undo portswitch 模拟机不支持此配置&#xff0c;实体机支持 第一种access CE1配置 [~HUAWEI]vlan batch 10 [~HUAWEI]int Vlanif 10 [~HUAWEI-Vlanif10]ip add 10.10.10.1 24 [~HUAWEI]int g1/0/0 [~HUAWE…

乌班图Ubuntu 24.04 SSH Server 修改默认端口重启无效

试用最新的乌班图版本&#xff0c;常规修改ssh端口&#xff0c;修改完毕后重启sshd提示没有找到service&#xff0c;然后尝试去掉d重启ssh后查看状态&#xff0c;端口仍然是默认的22&#xff0c;各种尝试都试了不行&#xff0c;重启服务器后倒是端口修改成功了&#xff0c;心想…

用RNN构建人名分类器

目录 项目综述1.导入必备的工具包2.处理数据&#xff0c;满足训练要求2.1 统计常用的字符2.2 进行规范化处理,去除重音符号2.3 将文件读取到内存中2.4 构建人名国家和具体人名的对应关系2.5 one-hot编码 3.构建RNN模型3.1 构建传统RNN模型3.2 构建传统LSTM模型3.3 构建传统GRU模…

CPU飙升100%怎么办?字节跳动面试官告诉你答案!

小北说在前面 CPU占用率突然飙升是技术人员常遇到的一个棘手问题&#xff0c;它是一个与具体技术无关的普遍挑战。 这个问题可以很简单&#xff0c;也可以相当复杂。 有时候&#xff0c;只是一个死循环在作祟。 有时候&#xff0c;是死锁导致的。 有时候&#xff0c;代码中有…

基于STM32的智能工厂环境监测系统

目录 引言环境准备智能工厂环境监测系统基础代码实现&#xff1a;实现智能工厂环境监测系统 4.1 数据采集模块4.2 数据处理4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;智能工厂管理与优化问题解决方案与优化收尾与总结 1. 引言 智能工厂环境监测系统通过…

AI语言文字工具类API实现自动化的写作

热门实用的AI语言文字工具类API是当今开发者们追逐的宝藏。这些API利用先进的人工智能和自然语言处理技术&#xff0c;为开发者提供了一系列实用而强大的语言文字处理能力。这些API包括了文本翻译、情感分析、智能写作、关键词提取、语言检测等功能&#xff0c;使得开发者能够轻…