当前位置: 首页 > news >正文

Spring Security实现登录

前言

Spring Security是Spring框架下的一个用于身份验证和授权的框架,它可以帮忙管理web应用中的用户认证、授权以及安全性问题。本文将介绍如何使用Spring Security实现用户登录功能,本文主要包括以下内容:

  1. 环境准备
  2. Spring Security核心概念
  3. 实现基本登录功能
  4. 添加Spring Security的数据库认证

环境准备

在开始写Spring Security之前,我们需要配置好以下环境:

  1. JDK 1.8或以上
  2. Maven 3.0或以上
  3. Spring Boot 2.1.4或以上
  4. IDE(推荐使用IntelliJ IDEA)

在完成以上步骤后,我们可以开始编写代码。

Spring Security核心概念

在使用Spring Security时,需要了解一些核心概念:

  1. Authentication: 安全认证对象,包括用户名、密码以及权限等信息。
  2. Authorization: 安全授权对象,授权某个用户拥有访问某个资源的权限。
  3. Filter: 安全过滤器,过滤请求,并传递继续处理请求的权限。
  4. Provider: 安全认证提供者,获取认证信息,并返回持久化信息等内容。

实现基本登录功能

添加依赖

首先需要添加Spring Security的依赖到项目中:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId><version>${spring-boot.version}</version>
</dependency>

开启Spring Security

在Spring Boot启动类上添加@EnableWebSecurity@Configuration注解,并继承WebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {//...
}

添加用户信息

我们需要添加两个用户信息,一个是普通用户,一个是管理员用户。

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {// 普通用户auth.inMemoryAuthentication().withUser("user").password("123456").roles("USER");// 管理员用户auth.inMemoryAuthentication().withUser("admin").password("123456").roles("USER", "ADMIN");
}

配置授权规则

我们需要在配置类中配置哪些路径需要哪些权限才能访问,以及哪些路径不需要进行安全认证。

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

其中:

  • /admin路径需要ADMIN权限。
  • /user路径需要USER和ADMIN权限。
  • 其他请求需要通过认证后才能访问。
  • 添加**formLogin()**方法开启默认登录界面。

运行程序

现在我们已经完成了一个简单的登录功能,可以运行程序并使用添加的用户进行登录操作。

添加Spring Security的数据库认证

在上面的例子中,我们将用户信息存储在了内存中,但在实际应用中,用户信息往往是存储在数据库中的。

首先我们要创建一张用户表来存储用户信息。

创建用户表

在数据库中创建一个名为 users 的数据表,表的结构如下:

CREATE TABLE `users` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(45) NOT NULL,`password` varchar(255) DEFAULT NULL,`enabled` tinyint(1) DEFAULT '1',PRIMARY KEY (`id`)
);

在该表中,字段含义如下:

  • id:自增主键。
  • username:用户用户名。
  • password:用户密码(使用BCrypt加密)。
  • enabled:标记用户是否启用,1为启用,0为禁用。

添加依赖

我们需要添加Spring Security的数据库认证依赖到项目中:

<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>${spring-security.version}</version>
</dependency>
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>${spring-security.version}</version>
</dependency>

添加配置

我们需要添加以下配置:

  1. 数据源配置
  2. UserDetailsService配置
  3. PasswordEncoder配置
  4. AuthenticationProvider配置
  5. HttpSecurity配置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate DataSource dataSource;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());}@Beanpublic UserDetailsService userDetailsService() {return new JdbcUserDetailsManager(dataSource);}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasAnyRole("USER", "ADMIN").anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();}@Beanpublic AuthenticationProvider authenticationProvider() {DaoAuthenticationProvider provider = new DaoAuthenticationProvider();provider.setUserDetailsService(userDetailsService());provider.setPasswordEncoder(passwordEncoder());return provider;}
}

在代码中,userDetailsService()方法返回一个JdbcUserDetailsManager对象,该对象用于从数据库中加载用户信息。

PasswordEncoder是用于加密密码的,我们使用了BCryptPasswordEncoder来加密密码。

最后,我们还需要配置一个AuthenticationProvider用于处理认证请求。

添加用户信息到数据库

我们需要向数据库中添加一些测试用的用户信息,可以使用以下代码:

@Autowired
private DataSource dataSource;@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {auth.jdbcAuthentication().dataSource(dataSource).withUser("user").password(passwordEncoder().encode("password")).roles("USER").and().withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN");
}

运行程序

现在我们已经完成了数据库认证功能,可以运行程序并使用添加的用户进行登录操作,Spring Security会从数据库中读取用户信息并进行认证。

总结

Spring Security是一个非常好用的身份认证和授权框架,可以有效保证应用的安全性。本文介绍了如何使用Spring Security实现基本的登录功能和数据库认证,希望这篇文章能够帮助到你。

相关文章:

Spring Security实现登录

前言 Spring Security是Spring框架下的一个用于身份验证和授权的框架&#xff0c;它可以帮忙管理web应用中的用户认证、授权以及安全性问题。本文将介绍如何使用Spring Security实现用户登录功能&#xff0c;本文主要包括以下内容&#xff1a; 环境准备Spring Security核心概…...

小狐狸ChatGPT付费创作系统1.9.7独立版 + H5端 + 小程序前端增加AI绘画+GPT4接口

小狐狸ChatGPT 1.9.7独立版经播播资源测试了版本比较&#xff0c;本版核心增加了GPT4.0接口功能&#xff0c;小程序端内置了AI绘画功能。体验下来问答速度感觉体验更好。小程序端有更新请对应开发工具更新上传&#xff0c;本版无开源端。播播资源提供的安装教程详见下方&#x…...

双目测距联合YOLOv8 项目总结

代码贴&#xff1a;双目测距--5 双目相机 联合 YOLOv8_爱钓鱼的歪猴的博客-CSDN博客 0、图片筛选 可以用matlab,对双目图像做个一个筛选&#xff0c;也就是做双目标定。 熟悉matlab的小伙伴完全可以用matlab做双目标定&#xff0c;我是没咋接触过不知道怎么导出标定结果&#…...

Windows提权:利用MSSQL数据库,Oracle数据库

目录 MSSQL提权&#xff1a;使用xp_cmdshell进行提权 MSSQL&#xff1a;使用sp_OACreate进行提权 MSSQL&#xff1a;使用沙盒提权 Oracle提权&#xff1a;工具一把梭哈 总结 MSSQL在Windows server类的操作系统上&#xff0c;默认具有system权限。 MSSQL提权&#xff1a;使…...

linux常见的二十多个指令

目录 一、指令的概念 二、28个常见的指令 ⭐2.1 ls指令 ⭐2.2 pwd指令 ⭐2.3 cd指令 ⭐2.4tree指令 ⭐2.5 mkdir指令 ⭐2.6 touch指令 ⭐2.7 rmdir指令 ⭐2.8 rm指令 ⭐2.9 clear指令 ⭐2.10 man指令 ⭐2.11 cp指令 ⭐2.12 mv指令 ⭐2.13 cat指令&#xff08;适…...

内蒙古自治区住房和城乡建设分析及解决方案

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘 要&#xff1a;为深入贯彻落实《国务院办公厅关于印发新能源汽车产业发展规划&#xff08;2021—2035年&#xff09;的通知》&#xff08;国办发 ﹝2020﹞39号&#xff09;、《国家发展改革委等部门关于进一步提升…...

JavaEE进阶5/25(属性注入)

目录 1.更简单的存取Spring对象 2.获取Bean对象&#xff08;对象装配&#xff09;DI 3. Resource注入 4.Resource注入和Autowired注入的区别 1.更简单的存取Spring对象 2.获取Bean对象&#xff08;对象装配&#xff09;DI 对象装配&#xff08;对象注入&#xff09;有三种方…...

【Java学习记录-4】相关名词和概念记录(持续更新)

目录 1 注解2 包3 权限修饰符4 状态修饰符1. final2. static 5. 多态6.抽象类7.接口 1 注解 Override是一个注解&#xff0c;可以帮助我们检查重写方法的方法声明的正确性 注意&#xff1a; 私有方法不能被重写&#xff08;父类私有成员子类是不能继承的&#xff09;子类方法…...

《程序员面试金典(第6版)》面试题 16.25. LRU 缓存(自定义双向链表,list库函数,哈希映射)

题目描述 设计和构建一个“最近最少使用”缓存&#xff0c;该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值)&#xff0c;并在初始化时指定最大容量。当缓存被填满时&#xff0c;它应该删除最近最少使用的项目。 题目传送门&#xff1a;…...

kong网关启用jwt认证插件

认证流程&#xff1a; 1、创建一个用户 2、生成jwt的所需要的key和密钥 3、在https://jwt.io/的生成jwt token 4、启用jwt插件 5、发送请求的时候携带jwt的token信息 官方指导&#xff1a;https://docs.konghq.com/hub/kong-inc/jwt/configuration/examples/ 一、创建一个新的…...

day12 - 图像修复

在图像处理的过程中&#xff0c;经常会遇到图像存在多余的线条或者噪声的情况&#xff0c;对于这种情况我们会先对图像进行预处理&#xff0c;去除掉对图形内容有影响的噪声&#xff0c;在进行后续的处理。 本节实验我们介绍使用图像膨胀来处理图形的多余线条&#xff0c;进行…...

1720_Linux学习中的问题处理

全部学习汇总&#xff1a;GreyZhang/little_bits_of_linux: My notes on the trip of learning linux. (github.com) 这个有点学习的方法论的意思&#xff0c;画个滋味导图顺便整理一下。 遇到问题的时候&#xff0c;解决的方法大致有3中&#xff0c;而针对学习的建议有一部分是…...

七人拼团系统开发模式详解

七人拼团是最近兴起的一个模式&#xff0c;它通过更人性化的奖励机制&#xff0c;将产品利润最大化让利给参与拼团的用户&#xff0c;达到促进用户主动积极裂变和团队平台引流提升销量的效果&#xff0c;下面就来详细说一下这个模式。 七人拼团最大的特点&#xff0c;就是结合了…...

CPU性能优化:分支预测

条件跳转引起的控制冒险虽然也可以通过在流水线中插入空泡来避免&#xff0c;但是当流水线很深时&#xff0c;需要插入更多的空泡。一个20级的流水线为例&#xff0c;如果一条指令需要上一条指令的执行结束才能执行&#xff0c;则需要在这两条指令之间插入19个空泡&#xff0c;…...

过滤器Filter,拦截器Interceptor

过滤器Filter 快速入门 详情 登录校验-Filter package com.itheima.filter;import com.alibaba.fastjson.JSONObject; import com.itheima.pojo.Result; import com.itheima.utils.JwtUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils…...

kafka整理

kafka整理 一、kafka概述 kafka是apache旗下一款开源的顶级的消息队列的系统, 最早是来源于领英, 后期将其贡献给apache, 采用语言是scala.基于zookeeper, 启动kafka集群需要先启动zookeeper集群, 同时在zookeeper记录kafka相关的元数据 kafka本质上就是消息队列的中间件产品…...

为什么有些情况下需要重写equals()和hashCode()方法?

目录 方法作用实战案例 方法作用 equals()&#xff1a;判断对象是否相等&#xff0c;比如判断是否能放入Set集合中 情况1&#xff1a;没有重写equals()方法&#xff1a;由于所有类的默认基类都是Object类&#xff0c;所以默认使用Object类的equals()方法&#xff0c;那就是对象…...

14-Vue技术栈之Vue3快速上手

目录 1.Vue3简介2. Vue3带来了什么2.1 性能的提升2.2 源码的升级2.3 拥抱TypeScript2.4 新的特性 1、海贼王&#xff0c;我当定了&#xff01;——路飞 2、人&#xff0c;最重要的是“心”啊&#xff01;——山治 3、如果放弃&#xff0c;我将终身遗憾。——路飞 4、人的梦想是…...

JavaScript高级三、深入面向对象

零、文章目录 JavaScript高级三、深入面向对象 1、编程思想 &#xff08;1&#xff09;面向过程介绍 面向过程&#xff1a;分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次调用就可以了。 &#xff08;2&…...

static

1. 静态局部变量 &#xff1a; 用于函数体的内部修饰变量&#xff0c;这种变量的生存期长于该函数。 2. 静态全局变量&#xff1a; 定义在函数体外&#xff0c;用于修饰全局变量&#xff0c;表示该变量只在本文件可见。 3. 静态函数&#xff1a; 准确的说&#xff0c;静态函数跟…...

嵌入式开发中PC与嵌入式思维的融合实践

1. 嵌入式开发中的PC思维与嵌入式思维融合作为一名从PC端开发转向嵌入式领域的工程师&#xff0c;我深刻体会到两种思维方式的差异与互补。PC编程注重抽象层次和开发效率&#xff0c;而嵌入式编程则必须关注硬件特性和实时性。真正的高手往往能将二者有机结合。在嵌入式领域&am…...

4大技术方案解决WarcraftHelper工具的《魔兽争霸III》兼容性与性能优化问题

4大技术方案解决WarcraftHelper工具的《魔兽争霸III》兼容性与性能优化问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专注…...

SQLite NULL 值

SQLite NULL 值 SQLite 是一种轻量级的数据库管理系统,广泛用于嵌入式系统和移动应用中。在 SQLite 中,NULL 值是一个非常重要的概念,它表示未知、缺失或不确定的数据。本文将详细介绍 SQLite 中的 NULL 值,包括其定义、处理方法以及优化技巧。 什么是 NULL 值 在 SQLit…...

我被TRO了,到底该选和解还是应诉?

很多跨境卖家第一次遭遇TRO&#xff08;临时限制令&#xff09;时&#xff0c;往往是懵的&#xff1a;店铺被冻结、资金被锁、链接下架&#xff0c;一夜之间业务几乎停摆。这个时候最核心的问题只有一个——到底该和解&#xff0c;还是应诉&#xff1f;先说结论&#xff1a;没有…...

C++ 动态内存管理深度解析:new/delete 完全指南

引言在 C 语言中&#xff0c;我们使用 malloc()、calloc()、realloc() 和 free() 来管理动态内存。而 C 引入了全新的动态内存管理方式——new 和 delete。这不仅带来了语法上的简化&#xff0c;更重要的是引入了类型安全和初始化的概念。在学习过程中&#xff0c;我对 new 的理…...

星闪实战指南:10分钟掌握WS63 SDK任务调度与调试技巧

1. 星闪WS63 SDK任务调度基础 第一次接触星闪WS63 SDK的任务调度功能时&#xff0c;我完全被各种API搞晕了。经过几个项目的实战&#xff0c;才发现这套任务管理系统设计得非常巧妙。简单来说&#xff0c;它就像个智能管家&#xff0c;能帮你把各种工作安排得井井有条。 任务调…...

MedGemma X-Ray技术博文:医疗大模型在放射科的可信度验证实践

MedGemma X-Ray技术博文&#xff1a;医疗大模型在放射科的可信度验证实践 1. 引言&#xff1a;当AI走进放射科&#xff0c;我们如何相信它&#xff1f; 想象一下&#xff0c;一位放射科医生每天要面对上百张X光片&#xff0c;每一张都需要仔细查看、分析、撰写报告。长时间高…...

cv_unet_image-colorization多分辨率适配实测:手机扫描件/胶片扫描图效果对比

cv_unet_image-colorization多分辨率适配实测&#xff1a;手机扫描件/胶片扫描图效果对比 1. 项目背景与技术原理 基于UNet架构深度学习模型开发的本地化图像上色工具&#xff0c;采用了阿里魔搭开源的图像上色算法。这个工具能够智能识别黑白图像中的物体特征、自然场景和人…...

lvgl_v8之设置label背景颜色一种方式

void lv_label_demo() {static lv_style_t style;lv_style_init(&style);lv_style_set_radius...

OpenMS实战指南:如何用开源工具解决质谱数据分析三大难题

OpenMS实战指南&#xff1a;如何用开源工具解决质谱数据分析三大难题 【免费下载链接】OpenMS The codebase of the OpenMS project 项目地址: https://gitcode.com/gh_mirrors/op/OpenMS 你是否正在为复杂的质谱数据分析而烦恼&#xff1f;面对海量的LC-MS数据&#xf…...