本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Vue.js与Spring Boot是当今流行的前后端技术栈,通过整合可创建现代、高效、分离的Web应用。本资源包为开发者提供了详尽的学习笔记和代码实例,内容涵盖Vue组件化、响应式数据绑定、路由、Vuex状态管理以及Spring Boot的Spring MVC、JPA、Thymeleaf特性。整合步骤包括前端配置、RESTful API设计、前后端通信、安全性设置、部署运行、错误处理、日志记录以及测试。通过学习这些内容,开发者能够深入理解并实现Vue与Spring Boot的无缝整合。
vue+spring boot整合笔记和代码资料

1. Vue.js基础与进阶知识

1.1 Vue.js入门理解

Vue.js是一个轻量级的前端框架,以数据驱动和组件化思想为核心,易于上手且功能强大。它允许开发者通过简洁的API实现响应式数据绑定和组合的视图组件。Vue.js的双向数据绑定、组件系统和虚拟DOM是其三大特色,开发者可以通过这些特性构建动态用户界面。

1.2 Vue.js的响应式原理

Vue.js的响应式原理是基于依赖收集和数据劫持。当Vue实例化时,它会遍历数据对象的所有属性,并使用 Object.defineProperty 方法将它们转换为getter/setter。当数据变动时,视图会自动更新,这就是所谓的响应式。这一机制使得Vue.js在处理复杂界面时,能保持较高的性能和数据同步的一致性。

1.3 Vue.js进阶实践

在熟练掌握Vue.js基本概念之后,开发者可以进一步学习其生态系统中的高级特性,如Vue Router用于构建单页面应用(SPA),Vuex用于状态管理,以及Vue CLI用于项目的快速搭建和配置。通过深入学习这些内容,可以更好地构建可维护和扩展的大型Vue.js应用。

// Vue.js简单示例代码
new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})

以上代码段创建了一个简单的Vue实例,其中 el 定义了挂载点, data 定义了需要绑定的数据。这是一个Vue.js入门的直观例子,用于展示Vue.js如何将数据与视图进行绑定。

2. Spring Boot微服务框架特点

2.1 Spring Boot的配置与应用

2.1.1 Spring Boot的自动配置机制

Spring Boot的自动配置机制是其核心特性之一,它为开发者提供了方便的“约定优于配置”的体验。自动配置尝试根据添加的jar依赖自动配置Spring应用。例如,如果你的类路径下存在H2数据库(h2数据库的jar包),并且你没有手动配置任何连接池,那么你将自动获得一个内存数据库。

在自动配置生效过程中,Spring Boot会根据类路径下存在的jar包以及应用中定义的Bean来自动配置Spring应用。整个过程是可配置的,允许开发者覆盖自动配置。使用 @EnableAutoConfiguration @SpringBootApplication 注解可以开启自动配置功能。

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

在上述代码中, @SpringBootApplication 是一个复合注解,其中包含了 @EnableAutoConfiguration ,它告诉Spring Boot基于添加的jar依赖自动配置项目。

2.1.2 依赖管理与起步依赖

Spring Boot的起步依赖(Starters)为不同类型的Spring应用提供了快速的开发基础。每个起步依赖都是一个特定功能的集合,例如web、test等。它通过依赖传递来管理版本,确保使用的库版本兼容。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

在上述pom.xml的依赖声明中, spring-boot-starter-web 依赖包含了构建web应用所需的所有依赖,包括Tomcat和Spring MVC。

2.2 Spring Boot的组件与服务

2.2.1 组件扫描与生命周期管理

Spring Boot组件扫描功能使得开发者可以轻松地通过 @Component , @Service , @Repository , @Controller 等注解定义的类自动注册到Spring应用上下文。通过 @ComponentScan 注解可以进一步细化扫描的包。

@ComponentScan(basePackages = "com.example")
public class AppConfig {
    // ...
}

在上述代码中, @ComponentScan 注解定义了扫描的基础包,所有在这个包以及子包下的带有相关注解的类都会被注册为Spring的Bean。

2.2.2 嵌入式容器与外部容器支持

Spring Boot支持嵌入式Servlet容器,如Tomcat、Jetty或Undertow,这意味着你可以在JAR包中运行一个完全自包含的Web应用。另外,它同样支持传统的WAR部署,允许部署到外部Servlet容器。

# 在application.properties中指定Servlet容器为Jetty
server.servlet.context-path=/myapp
server.servlet.context-class=org.eclipse.jetty.server.Server

在上述配置中,指定了Servlet容器使用Jetty,并设置了应用上下文路径。

2.3 Spring Boot的中间件集成

2.3.1 数据访问与事务管理

Spring Boot可以自动配置Spring Data JPA、Hibernate、MyBatis等数据访问框架。它能够自动配置数据源,以及基于数据源自动配置事务管理器。

@EnableTransactionManagement
@Configuration
public class PersistenceConfig {
    // 配置数据源和事务管理器
}

在上述配置中, @EnableTransactionManagement 注解启用了注解驱动的事务管理。

2.3.2 缓存抽象与消息队列集成

Spring Boot提供了与多种缓存技术的集成,如EhCache、Redis、Caffeine等。通过 @EnableCaching 注解启用缓存。

@EnableCaching
@Configuration
public class CacheConfig {
    // 配置缓存相关Bean
}

对于消息队列,Spring Boot可以集成RabbitMQ、Apache Kafka等中间件。通过添加对应的起步依赖,并配置连接属性,即可快速搭建消息通信机制。

# 在application.properties中配置RabbitMQ
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

通过上述配置,Spring Boot应用便可以连接到RabbitMQ服务器,并开始发送和接收消息。

flowchart LR
    A[Spring Boot Application] -->|配置信息| B[自动配置机制]
    B -->|扫描组件| C[组件与服务]
    C -->|配置属性| D[中间件集成]
    D -->|数据源配置| E[数据访问]
    E -->|事务管理| F[事务控制]
    D -->|缓存配置| G[缓存抽象]
    D -->|消息配置| H[消息队列集成]

3. 前后端分离架构的实现

3.1 前后端分离概念与优势

3.1.1 前后端分离的定义

前后端分离是一种软件架构设计模式,其核心思想是将前端展示层与后端服务层进行解耦。在这种模式下,前端通常以单页应用(SPA)的形式出现,利用现代JavaScript框架或库(如Vue.js、React、Angular等)来构建用户界面,而后端则专注于提供RESTful API或GraphQL API供前端调用。

前后端分离将传统的多层开发模式简化为前后两层。前端负责页面的渲染和用户的交云,后端负责业务逻辑的处理和数据的存取。这种分离可以让前端开发者和后端开发者并行工作,加快开发速度,并提高系统的可维护性。

3.1.2 分离架构的优势

前后端分离架构有若干明显优势:

  • 解耦 :后端API的改变不会影响前端页面的展示逻辑,同样,前端页面的更新也不会影响后端服务的稳定性。
  • 并行开发 :前后端可以独立开发、独立部署,大幅度提高开发效率和交付速度。
  • 技术多样性 :前端可以根据需要选择合适的框架或库,后端也可以选择适合业务的服务和数据库技术,提升了技术选型的灵活性。
  • 维护和扩展性 :前后端分离使得系统的各个部分更容易维护和扩展,因为更改某一部分不会影响其他部分。

3.2 前后端交互模式

3.2.1 RESTful API设计原则

RESTful API 是前后端分离架构中的关键部分,它基于HTTP协议定义的一组约束和原则。RESTful API的设计原则主要包括:

  • 统一接口 :所有API通过统一的接口进行访问。
  • 无状态 :客户端的每个请求都包含处理该请求所需的所有信息,因此服务器不需要维护客户端的状态。
  • 可缓存性 :响应信息可以被缓存,以提高性能。
  • 客户端-服务器分离 :客户端和服务器的职责分离,使得前端界面可以独立于后端服务进行优化。
  • 分层系统 :系统通过分层架构来提供更好的可扩展性和安全性。

3.2.2 GraphQL与传统REST对比

GraphQL 是另一种API设计标准,与REST相比,它提供了一种更加灵活的数据查询方式。

  • 查询的灵活性 :GraphQL 允许客户端精确地指定所需的数据,减少了冗余数据的传输,提高了效率。
  • 类型系统 :GraphQL 强调使用类型系统,有助于在编译时发现API的使用错误。
  • 版本控制 :由于客户端可以明确指定所需数据,因此很少需要对GraphQL API进行版本控制。

尽管GraphQL具有许多优势,但在传统的RESTful API仍然有其适用的场景。选择哪种方式取决于项目的具体需求和团队的技术偏好。

3.2.3 前后端分离架构实现中的API设计

实现前后端分离架构时,API的设计和实现至关重要。它需要考虑如下要素:

  • 安全性 :API需要进行认证和授权,确保数据的安全性。
  • 数据格式 :数据通常以JSON格式在前后端之间传输。
  • 状态管理 :前后端分离架构中,前端需要处理应用的状态管理,通常会使用状态管理库如Vuex来管理应用状态。
  • 错误处理 :在API调用中,需要合理设计错误响应,包括错误码和错误信息,使得前端能够根据错误信息进行相应的处理。

实现前后端分离的架构需要仔细设计和规划API,以确保系统的高效和稳定。这种架构不仅适用于大型应用,也适用于小型和中型项目,能够显著提升开发效率和产品质量。

4. 前端配置与Vue CLI工具使用

4.1 Vue CLI基本使用

4.1.1 Vue CLI初始化项目

Vue CLI(Command Line Interface)是Vue.js的官方脚手架工具,它为开发者提供了快速构建Vue项目的强大功能。使用Vue CLI,可以轻松完成项目的初始化工作,从而快速进入项目开发状态。

初始化项目的基本命令如下:

vue create project-name

在执行该命令之后,会启动一个交互式操作界面,提供多种预设配置选项,或允许用户自定义配置,例如选择所需的预设包管理工具(npm或yarn),项目配置细节(如Babel、Router、Vuex等)等。用户可以通过简单的指令操作,完成项目的基础构建。

4.1.2 项目结构与配置文件

初始化项目后,Vue CLI会创建一个标准的项目结构,并包含一些预设的文件和目录。了解这些项目结构对于后续的开发工作至关重要。

一个典型的Vue项目结构大致如下:

project-name/
├── node_modules/
├── public/
├── src/
│   ├── assets/
│   ├── components/
│   ├── views/
│   ├── App.vue
│   └── main.js
├── .gitignore
├── babel.config.js
├── package.json
├── README.md
└── vue.config.js
  • src 目录包含了所有的源码文件,其中:
    • components :存放可复用的组件;
    • views :存放页面级的组件;
    • App.vue :项目入口组件;
    • main.js :项目入口文件,用于初始化Vue实例;
  • .gitignore :告诉Git哪些文件或目录不需要版本控制;
  • babel.config.js :Babel配置文件,用于转译代码;
  • package.json :项目依赖和脚本配置文件;
  • vue.config.js :Vue CLI配置文件,允许用户自定义配置选项,如代理设置、插件配置等。

了解这些基本的文件和结构,有助于开发者高效管理和维护项目。

4.2 Vue CLI高级配置与优化

4.2.1 插件的安装与管理

Vue CLI支持插件系统,可以安装各种扩展来为项目添加新功能。例如,@vue/cli-plugin-babel、@vue/cli-plugin-router等插件。

安装插件的命令示例如下:

vue add router

该命令会自动安装对应插件,并提供交互界面来配置插件选项。插件安装完成后,可能需要重启项目来使插件生效。

4.2.2 打包优化与构建性能提升

Vue CLI提供了一个强大的打包优化功能,通过合理的配置可以显著提升生产环境下的应用性能。

优化构建性能的一个常见做法是使用 vue.config.js 文件。例如,添加以下配置可以启用 thread-loader uglifyjs-webpack-plugin 进行代码压缩:

module.exports = {
  configureWebpack: {
    plugins: [
      new UglifyJsPlugin()
    ],
    optimization: {
      splitChunks: {
        chunks: 'all',
      }
    }
  }
}

此外,还需要注意到,Vue CLI的 vue-cli-service build 命令会在生产环境中默认启用压缩和优化,但依然有多个可调整的选项来进一步提升性能。

接下来,让我们进入下一个章节,深入了解如何通过Spring Boot实现RESTful API的设计与实践。

5. Spring Boot RESTful API设计

随着现代Web开发的发展,RESTful API设计已成为构建Web服务的主流方法。Spring Boot作为微服务架构下的首选框架之一,它对RESTful API的设计与实践提供了丰富的支持。本章将深入探讨RESTful设计原则在Spring Boot中的应用,以及如何通过Spring MVC实现高效、可维护的API开发。

5.1 RESTful设计原则

5.1.1 状态无状态原则

RESTful API设计中最核心的原则之一是无状态性。无状态原则要求服务器端不保存任何客户端的状态信息,从而减少服务器内存的开销,并使得API能够轻松支持负载均衡与横向扩展。

在Spring Boot中,我们可以通过使用HttpSession或者Token(例如JWT)等方式来实现状态无状态原则。例如,使用JWT进行用户身份验证时,服务器只需要在响应中返回一个JWT给客户端,之后的每次请求,客户端都需携带这个JWT,服务器端通过验证JWT中的信息来确定请求者的身份。这样既保持了无状态,又实现了安全认证。

5.1.2 统一接口设计

RESTful要求API提供统一的接口,通常基于HTTP的GET、POST、PUT、DELETE等方法来处理资源的CRUD操作。统一接口可以简化服务的架构,提高可读性和易用性。

在Spring Boot中,我们可以通过定义控制器(Controller)类和使用注解如@GetMapping、@PostMapping、@PutMapping、@DeleteMapping等来快速实现统一接口的设计。下面是一个简单的例子:

@RestController
@RequestMapping("/api/v1/items")
public class ItemController {

    @Autowired
    private ItemService itemService;

    @GetMapping("/{id}")
    public ResponseEntity<Item> getItem(@PathVariable Long id) {
        Item item = itemService.getItem(id);
        return ResponseEntity.ok(item);
    }

    @PostMapping
    public ResponseEntity<Item> createItem(@RequestBody Item item) {
        Item createdItem = itemService.createItem(item);
        return new ResponseEntity<>(createdItem, HttpStatus.CREATED);
    }
    // 其他方法实现...
}

在这个例子中, @RestController 注解表明这个类作为控制器使用,每个方法都是一个HTTP请求处理函数。 @RequestMapping("/api/v1/items") 定义了基础路径, @GetMapping @PostMapping 分别映射HTTP请求类型和路径。

5.2 Spring MVC与RESTful实践

5.2.1 控制器与路由映射

Spring MVC是Spring框架的一部分,专门用于处理HTTP请求和响应。控制器(Controller)是处理请求的类,其中包含了映射到特定HTTP请求的方法。

在Spring Boot应用中,控制器的创建非常简单。如前面的代码所示,我们只需要标注 @RestController 注解,并使用相应的HTTP方法注解(如 @GetMapping , @PostMapping )来映射不同的请求到控制器的方法上。同时,方法中可以使用 @PathVariable @RequestBody 等注解来接收请求参数或请求体中的数据。

5.2.2 数据序列化与分页处理

在RESTful API中,数据序列化通常是通过使用JSON格式来实现的。Spring Boot提供了强大的支持来处理JSON序列化与反序列化,借助于 @RestController @ResponseBody 注解,Spring Boot会自动将返回的对象序列化为JSON格式。

为了提高API的性能,特别是在处理大量数据时,分页是一个常用的策略。Spring Data JPA提供了 Pageable 接口,可以方便地实现数据的分页查询:

@GetMapping
public Page<Item> listItems(@RequestParam(defaultValue = "0") int page,
                            @RequestParam(defaultValue = "10") int size) {
    Pageable pageable = PageRequest.of(page, size);
    return itemService.findItems(pageable);
}

上面的代码展示了如何通过 Pageable 实现分页查询。 PageRequest.of 方法用于创建分页请求对象,其中指定了页码和每页显示的数量。控制器方法返回的 Page<Item> 对象包含了分页信息和实际的数据列表。

通过上述实践,我们可以看到Spring Boot通过Spring MVC使得RESTful API的开发变得简洁而高效,同时也展示了如何结合实际需求,实现复杂功能如分页查询的简便性。

以上章节仅展示了Spring Boot在实现RESTful API设计的冰山一角。在随后的实践中,我们将继续探讨如何利用Spring Boot提供的强大功能,来进一步优化和扩展我们的API设计与实践。

6. 前后端通信及数据交互方法

6.1 Ajax与JSON数据交换

6.1.1 Ajax技术要点

Ajax(Asynchronous JavaScript and XML)是一种用于创建快速动态网页的技术。它允许网页在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容。这项技术要点包括异步通信机制,使得用户在等待数据处理和返回时依然能与页面进行交互。

异步通信 :传统的HTTP请求通常是同步的,这意味着浏览器会发送请求,然后等待服务器响应。在此期间,用户必须等待,不能执行其他操作。Ajax通过 XMLHttpRequest 对象或更现代的 fetch API实现异步请求,这样用户就可以在等待服务器响应的同时继续与网页交互。

数据交换格式 :Ajax请求通常使用JSON或XML格式交换数据。由于JSON的轻量级和易读性,它已经成为数据交换的首选格式。JSON数据可以很容易地在JavaScript中解析,并且几乎所有现代前端框架都能很好地处理JSON数据。

Ajax的工作原理 :当用户执行某个操作(例如点击按钮)时,JavaScript将发起一个Ajax请求到服务器。服务器处理请求,然后返回数据。JavaScript接收数据并使用DOM操作更新页面的特定部分,整个过程中页面不需要完全重载。

6.1.2 JSON数据处理与转换

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集,因此可以很容易地在JavaScript中被解析和使用。

JSON数据结构 :JSON数据通常包含属性和值。属性/值对组合成对象,对象用大括号 {} 包围。数组由中括号 [] 包围,并包含一系列值(这些值可以是对象、字符串、数字、布尔值等)。

JSON解析 :在JavaScript中,JSON数据可以使用 JSON.parse() 方法被解析成JavaScript对象。例如:

let jsonString = '{"name": "John", "age": 30}';
let obj = JSON.parse(jsonString);
console.log(obj.name); // John

JSON序列化 :将JavaScript对象转换为JSON字符串的过程称为序列化。 JSON.stringify() 方法可以实现这一点:

let obj = { name: "John", age: 30 };
let jsonString = JSON.stringify(obj);
console.log(jsonString); // {"name":"John","age":30}

数据转换实践 :在前后端交互时,前端发送的请求体数据(通常是JSON格式)需要在客户端序列化,服务器端则需要解析请求体数据,然后执行业务逻辑。服务器返回的响应也需要被客户端解析,以便于更新页面上的信息。

// 前端发送数据
fetch('https://example.com/api/data', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ name: 'John', age: 30 }),
})
.then(response => response.json()) // 解析JSON格式响应
.then(data => console.log(data))
.catch(error => console.error('Error:', error));

在后端,例如使用Node.js和Express框架处理上述请求:

const express = require('express');
const app = express();
app.use(express.json());

app.post('/api/data', (req, res) => {
  console.log(req.body); // { name: 'John', age: 30 }
  // 处理业务逻辑...
  res.json({ message: 'Data received!' }); // 发送JSON响应
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

6.2 WebSocket与前后端实时通信

6.2.1 WebSocket协议介绍

WebSocket是HTML5提供的一种在单个TCP连接上进行全双工通讯的协议。与传统的HTTP协议不同,WebSocket允许服务器主动向客户端发送信息,实现服务器到客户端的实时通信。

WebSocket连接建立 :当客户端和服务器通过HTTP协议建立连接时,可以通过升级协议来建立WebSocket连接。客户端发起请求,使用 Upgrade 头部通知服务器它希望切换到WebSocket协议。

WebSocket的特点

  • 持久连接 :连接一旦建立,就保持开启状态,直到被一方关闭。
  • 双向通信 :客户端和服务器可以互相发送消息。
  • 减少开销 :不需要每次通信时都建立HTTP连接,从而减少了开销。
  • 实时性 :适合需要实时数据交换的应用场景,如聊天、游戏、实时监控等。

6.2.2 实时通信实现示例

客户端实现 :使用JavaScript的 WebSocket 对象建立WebSocket连接,并处理接收和发送消息。

let ws = new WebSocket('wss://example.com/ws');

ws.onopen = function() {
  console.log('WebSocket connection established');
  ws.send('Hello Server!'); // 发送消息
};

ws.onmessage = function(event) {
  console.log('Message from server:', event.data);
};

ws.onerror = function(error) {
  console.error('WebSocket error:', error);
};

ws.onclose = function() {
  console.log('WebSocket connection closed');
};

服务器端实现 :在Node.js中使用 ws 库来创建WebSocket服务器,处理连接事件和接收到的消息。

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
  console.log('Client connected');

  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
    ws.send(`Echo: ${message}`); // 发送回消息
  });

  ws.on('close', function close() {
    console.log('Client disconnected');
  });
});

通过上述实现,一旦客户端和服务器端的WebSocket连接建立,双方就可以实时交换消息。在实时应用中,如聊天应用,这种通信方式非常有效。客户端发送消息到服务器,服务器通过其他已经建立的WebSocket连接将消息广播给所有在线用户。

7. 安全认证机制与策略

在构建现代的Web应用时,安全是一个不可忽视的关键因素。尤其是当我们处理用户数据和提供API服务时,有效的认证和授权策略是保护这些资源的基石。本章我们将深入探讨认证与授权的基本概念,并了解如何使用Spring Security来实现这些安全机制。

7.1 认证与授权基础

7.1.1 认证机制概述

认证是确认用户身份的过程,确保用户是他们声称的那个人。在Web应用中,这通常通过用户名和密码来完成,但也可以通过多种因素如生物识别、短信验证码等来实现。

认证流程
  • 用户提供凭证(通常是用户名和密码)。
  • 应用将这些凭证发送到认证服务器。
  • 认证服务器验证凭证,并返回一个令牌,通常是JWT(JSON Web Token)。
  • 用户将该令牌存储起来,之后每次请求都携带该令牌进行验证。

7.1.2 授权与访问控制

授权是根据用户身份和已知安全策略,决定用户可以访问的资源和执行的操作。它通常发生在用户成功认证之后,确保用户有权访问特定的接口或者数据。

常见的授权机制
  • 基于角色的访问控制(RBAC):用户的角色定义了他们可以访问的资源。
  • 基于属性的访问控制(ABAC):用户的属性(如年龄、职位)用来决定访问权限。
  • 基于声明的访问控制(CBAC):根据用户的声明(如令牌中的信息)来决定访问权限。

7.2 Spring Security应用

7.2.1 Spring Security核心概念

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,它是保护基于Spring的应用程序的事实标准。Spring Security提供了全面的安全特性,包括但不限于认证、授权、CSRF保护和SSL支持。

Spring Security组件
  • SecurityContext : 保存了安全信息,如当前认证的用户。
  • Authentication : 表示当前用户的认证信息。
  • UserDetailsService : 用于根据用户名加载用户详细信息的服务接口。
  • GrantedAuthority : 表示用户被授予的权限,通常用于角色定义。
  • FilterChainProxy : 控制请求如何通过不同的安全过滤器。

7.2.2 实现用户认证与权限控制

在Spring Boot应用中,集成Spring Security非常简单。通常,我们需要添加Spring Security依赖,并提供一个配置类来定制安全策略。

示例:Spring Boot集成Spring Security配置
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private DataSource dataSource;

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder());
    }

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

在这个配置中,我们定义了访问权限规则,并指定了登录页面。同时,我们还指定了 UserDetailsService 和密码加密器。

示例:实现 UserDetailsService
@Service
public class CustomUserDetailsService implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new UsernameNotFoundException("User not found"));
        return new org.springframework.security.core.userdetails.User(
                user.getUsername(),
                user.getPassword(),
                getAuthorities(user));
    }

    private Set<GrantedAuthority> getAuthorities(User user) {
        Set<GrantedAuthority> authorities = new HashSet<>();
        user.getRoles().forEach(role -> {
            authorities.add(new SimpleGrantedAuthority(role.getName()));
        });
        return authorities;
    }
}

这个类实现了 UserDetailsService ,在数据库中查找用户,并构建了用户权限集合。

通过以上两个代码示例,我们可以看到如何在Spring Boot应用中实现用户认证和授权。Spring Security提供了丰富的配置选项和扩展点,允许开发者构建符合自己需求的安全策略。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Vue.js与Spring Boot是当今流行的前后端技术栈,通过整合可创建现代、高效、分离的Web应用。本资源包为开发者提供了详尽的学习笔记和代码实例,内容涵盖Vue组件化、响应式数据绑定、路由、Vuex状态管理以及Spring Boot的Spring MVC、JPA、Thymeleaf特性。整合步骤包括前端配置、RESTful API设计、前后端通信、安全性设置、部署运行、错误处理、日志记录以及测试。通过学习这些内容,开发者能够深入理解并实现Vue与Spring Boot的无缝整合。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐