Spring Boot整合新版Spring Security:Lambda表达式配置优雅安全

文章目录

    • 1. 引言
    • 2. 项目依赖配置
    • 3. 使用Lambda表达式配置Spring Security
    • 4. 自定义身份验证逻辑
    • 5. 认证与授权注解
      • 5.1 @Secured注解
      • 5.2 @PreAuthorize和@PostAuthorize注解
    • 6. 总结

在这里插入图片描述

🎉Spring Boot整合新版Spring Security:Lambda表达式配置优雅安全


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:架构设计
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

Spring Security是保障Spring应用程序安全的强大框架,而新版的Spring Security引入了lambda表达式来配置,使得安全配置更加简洁、优雅。本文将介绍如何在Spring Boot项目中整合新版Spring Security,并通过lambda表达式进行安全配置,提供更好的开发体验。

1. 引言

Spring Security是一个用于身份验证和授权的框架,它提供了一套全面的安全服务,可轻松集成到Spring应用程序中。新版Spring Security引入了lambda表达式的配置方式,取代了之前的繁琐XML配置和方法调用链式配置,使得配置更加清晰、简洁。在这里插入图片描述

2. 项目依赖配置

首先,确保你的Spring Boot项目中包含了Spring Security的依赖。在pom.xml中添加以下依赖:

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

3. 使用Lambda表达式配置Spring Security

在新版Spring Security中,使用lambda表达式配置可以显著提高配置的可读性和可维护性。以下是一个简单的例子,展示如何使用lambda表达式配置基本的身份验证和授权。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();

        return new InMemoryUserDetailsManager(user);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

    @Configuration
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

上述配置中,我们使用lambda表达式配置了一个简单的身份验证和授权。userDetailsService方法配置了一个内存中的用户,configure方法配置了访问权限和登录页面。

4. 自定义身份验证逻辑

在实际项目中,我们通常需要实现自定义的身份验证逻辑。通过lambda表达式,我们可以更清晰地定义自己的UserDetailsServiceAuthenticationProvider

@Configuration
@EnableWebSecurity
public class CustomSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

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

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

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        provider.setUserDetailsService(customUserDetailsService);
        provider.setPasswordEncoder(passwordEncoder());
        return provider;
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }
}

在上述配置中,我们注入了一个自定义的UserDetailsService,并通过lambda表达式配置了AuthenticationProvider。这样我们可以更灵活地定义用户信息的获取和身份验证逻辑。

5. 认证与授权注解

新版Spring Security还引入了一系列基于注解的认证与授权。通过lambda表达式,我们可以更直观地配置这些注解。

5.1 @Secured注解

@Configuration
@EnableWebSecurity
public class SecuredSecurityConfig extends WebSecurityConfigurerAdapter {

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

    @Secured("ROLE_ADMIN")
    @GetMapping("/admin")
    public String adminPage() {
        return "admin";
    }
}

在上述代码中,通过@Secured("ROLE_ADMIN")注解配置了访问路径/admin需要具备ROLE_ADMIN角色。

5.2 @PreAuthorize和@PostAuthorize注解

@Configuration
@EnableWebSecurity
public class PrePostSecurityConfig extends WebSecurityConfigurerAdapter {

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

    @PreAuthorize("hasRole('ADMIN')")
    @GetMapping("/admin")
    public String adminPage() {
        return "admin";
    }

    @PostAuthorize("hasRole('USER')")
    @GetMapping("/user")
    public String userPage() {
        return "user";
    }
}

在上述代码中,通过@PreAuthorize@PostAuthorize注解分别配置了方法的前置和后置授权规则。

6. 总结

通过本文的介绍,我们学习了如何在Spring Boot项目中整合新版Spring Security,并通过lambda表达式进行简洁、优雅的安全配置。新版Spring Security的引入使得配置更加直观,开发者可以更轻松地实现自定义的身份验证逻辑和授权规则。希望通过本文的学习,读者能够更加熟练地使用Spring Security保障应用程序的安全性。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

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

相关文章

STM32F1 - 点灯-寄存器模式

点灯 实验概述&#xff1a;Step1> 建立工程Step2> 宏定义 - 寄存器地址 实验概述&#xff1a; 用配置寄存器的方式&#xff0c;开关一个LED灯&#xff0c; 只用标准库中提供的启动文件&#xff0c; Step1> 建立工程 出现错误&#xff1a;导入文件类型错误 keil5编译中…

QT Linux下无法使用CTRL+ALT+P快捷键,不生效

文章目录 一、背景二、排查&#xff08;1&#xff09;检查创建&#xff0c;发现没问题。&#xff08;2&#xff09;查看 shortcutMap 是否注册&#xff08;3&#xff09;排查xcb有没有获取到该事件&#xff08;4&#xff09;排查是否是系统的问题&#xff08;5&#xff09;www.…

10英寸安卓车载平板电脑丨ONERugged车载工业平板:解决农业工作效率

农业是人类社会的基石之一&#xff0c;而农业工作效率的提升一直是农民和农业专业人士关注的重要议题。随着技术的不断进步&#xff0c;车载工业平板成为了解决农业工作效率的创新解决方案。本文将探讨车载工业平板如何为农业带来巨大的改变&#xff0c;提高农民的工作效率和农…

Fink CDC数据同步(六)数据入湖Hudi

数据入湖Hudi Apache Hudi(简称&#xff1a;Hudi)使得您能在hadoop兼容的存储之上存储大量数据&#xff0c;同时它还提供两种原语&#xff0c;使得除了经典的批处理之外&#xff0c;还可以在数据湖上进行流处理。这两种原语分别是&#xff1a; Update/Delete记录&#xff1a;H…

【Java 数据结构】泛型进阶

泛型 1 什么是泛型2 引出泛型2.1 语法 3 泛型类的使用3.1 语法3.2 示例3.3 类型推导(Type Inference) 泛型是如何编译的擦除机制裸类型4 泛型的上界4.1 语法4.2 示例4.3 复杂示例 5 泛型方法5.1 定义语法5.2 示例5.3 使用示例-可以类型推导5.4 使用示例-不使用类型推导 6 通配符…

编译原理与技术(三)——语法分析(五)自底向上-LR分析

一、自顶向下的LL(1)与自底向上的LR &#xff08;一&#xff09;LL(1)非递归预测分析器及分析表 &#xff08;二&#xff09;LR分析器及分析表 二、LR分析 举个例子。 从上面不难看出&#xff0c;LR分析也是由分析表驱动的。那么关键在于构造LR分析表。

眼动追踪系统体验实验(脑与认知期末考核)

实验名称&#xff1a;眼动追踪系统体验实验 实验目的&#xff1a; 本实验旨在通过体验脑与认知眼动追踪系统&#xff0c;了解该技术在心理学、认知科学等领域的应用&#xff0c;理解它是怎样工作的&#xff0c;探究眼动追踪技术如何揭示人类认知过程的奥秘。 实验环境&#…

1、将 ChatGPT 集成到数据科学工作流程中:提示和最佳实践

将 ChatGPT 集成到数据科学工作流程中:提示和最佳实践 希望将 ChatGPT 集成到您的数据科学工作流程中吗?这是一个利用 ChatGPT 进行数据科学的提示的实践。 ChatGPT、其继任者 GPT-4 及其开源替代品非常成功。开发人员和数据科学家都希望提高工作效率,并使用 ChatGPT 来简…

docker之程序镜像的制作

目录 一、每种资源的预安装&#xff08;基础&#xff09; 安装 nginx安装 redis 二、dockerfile文件制作&#xff08;基础&#xff09; 打包 redis 镜像 创建镜像制作空间制作dockerfile 打包 nginx 镜像 三、创建组合镜像&#xff08;方式一&#xff09; 生成centos容器并…

环境配置:Udacity的Self-Driving项目安装运行

前言 Udacity的自动驾驶工程师纳米学位项目&#xff08;Self-Driving Car Engineer Nanodegree Program&#xff09;是一项面向学习者的前沿技术项目&#xff0c;旨在提供全面的自动驾驶工程师培训。该项目由Udacity与自动驾驶领域的领先公司和专业人士合作开发&#xff0c;涵…

C++ STL精通之旅:向量、集合与映射等容器详解

目录 常用容器 顺序容器 向量vector 构造 尾接 & 尾删 中括号运算符 获取长度 清空 判空 改变长度 提前分配好空间 代码演示 运行结果 关联容器 集合set 构造 遍历 其他 代码演示 运行结果​编辑 映射map 常用方法 构造 遍历 其他 代码演示1​编…

安卓9宫格密码键盘

自定义组件 package com.zx.mocab.views;import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent…

adb push 将电脑中的文件传输到安卓开发板

1. adb remount 重新挂载设备的文件系统&#xff0c;以便可以对设备进行读写操作&#xff0c;通常情况下&#xff0c;安卓开发板在连接到计算机后&#xff0c;设备的文件系统会被挂载为只读文件系统&#xff0c;重新挂载后变成可读可写权限 C:\Users\Administrator>adb re…

工业笔记本丨行业三防笔记本丨亿道加固笔记本定制丨极端温度优势

工业笔记本是专为在恶劣环境条件下工作而设计的高度耐用的计算机设备。与传统消费者级笔记本电脑相比&#xff0c;工业笔记本在极端温度下展现出了许多优势。本文将探讨工业笔记本在极端温度环境中的表现&#xff0c;并介绍其优势。 耐高温性能: 工业笔记本具有更高的耐高温性…

2月6日作业

1.现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用快速排序实现升序排序 函数4:请使用插入排序实现升序排序 #include<stdio.h> #include<string.h&…

2024-01-06-AI 大模型全栈工程师 - 机器学习基础

摘要 2024-01-06 阴 杭州 晴 本节简介: a. 数学模型&算法名词相关概念; b. 学会数学建模相关知识&#xff1b; c. 学会自我思考&#xff0c;提升认知&#xff0c;不要只会模仿&#xff1b; 课程内容 1. Fine-Tuning 有什么作用&#xff1f; a. 什么是模型训练&#xff…

计算机毕业设计 基于SpringBoot的线上教育培训办公系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

掌握Pandas数据转换利器深入解析pd.to_numeric函数与实战技巧【第63篇—python:Pandas数据】

文章目录 引言pd.to_numeric函数简介参数详解实战案例进阶应用&#xff1a;处理缺失值与异常值1. 处理缺失值2. 处理异常值 高效利用downcast参数优化内存占用优化性能&#xff1a;使用apply函数批量处理数据实战案例&#xff1a;处理时间序列数据处理多列数据&#xff1a;结合…

知识管理平台有哪些?帮助企业高效发展

在现代商业环境中&#xff0c;知识被认为是推动企业高效发展的关键因素。一个有效的知识管理平台可以帮助企业收集、整理和分享知识&#xff0c;从而提高工作效率&#xff0c;增强竞争优势。接下来&#xff0c;我将向大家推荐三款优秀的知识管理平台&#xff1a;Helplook&#…

Python初学者学习记录——python基础综合案例:数据可视化——动态柱状图

一、案例效果 通过pyecharts可以实现数据的动态显示&#xff0c;直观的感受1960~2019年世界各国GDP的变化趋势 二、通过Bar构建基础柱状图 反转x轴和y轴 标签数值在右侧 from pyecharts.charts import Bar from pyecharts.options import LabelOpts# 构建柱状图对象 bar Bar()…