Spring基础分析14-用户认证与授权

大家好,今天和大家一起分析一下spring用户认证与授权的内容~

应用程序的安全性是至关重要的考量因素。无论是保护用户的个人信息还是确保业务逻辑不被滥用,安全措施都是不可或缺的一部分。Spring Security作为Spring框架下的安全组件,提供了强大的工具来帮助开发者构建安全的应用程序。

Spring Security简介

Spring Security是一个功能强大、高度可配置的安全框架,它允许我们轻松地向Spring应用程序添加身份验证和授权功能。该框架支持多种安全协议和技术,如LDAP、OAuth2、SAML等,并提供了灵活的配置选项以适应不同的需求。其核心特性包括但不限于:

  • 认证:通过用户名/密码、社交登录等方式验证用户身份。
  • 授权:根据用户的角色和权限决定他们可以执行的操作。
  • CSRF防护:防止跨站请求伪造攻击。
  • Session管理:控制用户会话生命周期。
  • 密码加密:对存储的密码进行加密处理。

用户认证基础

1 认证流程概述

认证过程通常涉及以下几个步骤:

  1. 提交凭证:客户端(如Web浏览器)向服务器发送包含用户名和密码的HTTP请求。
  2. 验证凭证:服务器端接收到请求后,检查提供的凭证是否有效。这可能涉及到查询数据库或其他形式的身份验证服务。
  3. 创建认证对象:如果凭证有效,则创建一个新的Authentication对象,并将其与当前线程关联。
  4. 存储认证状态:将认证信息保存在HTTP Session中,以便后续请求可以直接使用而无需再次验证。
  5. 响应客户端:返回给客户端表示成功登录的信息,同时设置必要的Cookie或Token用于维持会话。

2 实现基本的表单登录

为了让用户能够登录到我们的应用,我们需要配置Spring Security来处理表单登录。下面是一个具体的例子,展示了如何配置HttpSecurity以启用表单登录,并允许匿名访问某些页面。

import org.springframework.context.annotation.Bean;
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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http// 定义哪些URL需要认证,哪些不需要.authorizeRequests().antMatchers("/", "/home").permitAll() // 允许所有人访问主页.anyRequest().authenticated()          // 所有其他请求都需要认证.and()// 启用表单登录,并指定自定义登录页面.formLogin().loginPage("/login").permitAll()                            // 登录页面无需认证.defaultSuccessUrl("/dashboard")        // 登录成功后的默认跳转页面.failureUrl("/login?error=true")        // 登录失败后的跳转页面.and()// 配置注销功能.logout().permitAll();                           // 注销链接也无需认证}@Bean@Overridepublic UserDetailsService userDetailsService() {UserDetails user =User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();return new InMemoryUserDetailsManager(user);}
}

在这个例子中,我们首先指定了哪些URL路径是公开的(例如首页),哪些需要经过认证才能访问。然后,我们启用了表单登录,并指定了自定义的登录页面。最后,我们还设置了登录成功和失败后的跳转页面,以及启用了注销功能。

3 使用内存中的用户数据进行认证

对于开发环境来说,有时我们希望快速地添加一些用户来进行测试。这可以通过InMemoryUserDetailsManager来实现,它允许我们在内存中直接定义用户及其角色。上面的例子已经展示了如何配置一个简单的内存用户。

请注意,在生产环境中,我们应该避免使用未加密的密码。因此,推荐使用强密码编码器,比如BCrypt,来对用户密码进行加密存储。以下是修改后的userDetailsService()方法,使用了BCrypt编码器:

@Bean
public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
}@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());
}@Bean
@Override
public UserDetailsService userDetailsService() {UserDetails user =User.withUsername("user").password(passwordEncoder().encode("password")).roles("USER").build();return new InMemoryUserDetailsManager(user);
}

这段代码中,我们首先定义了一个PasswordEncoder Bean,用来生成和验证加密后的密码。接着,在configure()方法中,我们将这个编码器绑定到了UserDetailsService上,从而确保所有用户的密码都会被正确加密,欢迎大家一起讨论~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安全编码】Web平台如何设计防止重放攻击

我们先来做一道关于防重放的题,答案在文末 防止重放攻击最有效的方法是( )。 A.对用户密码进行加密存储使用 B.使用一次一密的加密方式 C.强制用户经常修改用户密码 D.强制用户设置复杂度高的密码 如果这道题目自己拿不准,或者…

GJB289A总线典型网络理论分析

1.GJB289A总线典型网络理论分析 根据相关标准,“某个支路的故障不影响整个系统”及耦合变压器特性,本文在仿真与实测时均采用典型的一发一收两端口总线网络。 典型两端口总线网络电气结构如图1所示,包含终端匹配电阻、故障隔离电阻、耦合变…

基于SpringBoot的4S店汽车销售管理系统的设计与实现

一、课题背景 为汽车销售公司设计了一个汽车管理系统 技术:前台采用网页技术,后端采用SpringBoottMybatistvue 项目 描述:随着人们生活水平的不断提高,人们对汽车的消费和需求也越来越旺盛。多汽车销售公司仍然采用人工记账的传…

SQL子查询和having实例

有2个表如下;一个是站点信息,一个是站点不同时间的访问量, 现在要获取总访问量大于200的网站; 先执行如下sql,不包括having子句看一下,获得的是所有站点的总访问量; 这应是一个子查询&#xf…

SpringAI人工智能开发框架006---SpringAI多模态接口_编程测试springai多模态接口支持

可以看到springai对多模态的支持. 同样去创建一个项目 也是跟之前的项目一样,修改版本1.0.0 这里 然后修改仓库地址,为springai的地址 然后开始写代码

【UE5 C++课程系列笔记】13——GameInstanceSubsystem的简单使用

目录 概念 基本使用案例 效果 步骤 概念 UGameInstanceSubsystem 类继承自 USubsystem,它与 GameInstance 紧密关联,旨在为游戏提供一种模块化、可方便扩展和管理的功能单元机制。在整个游戏运行期间,一个 GameInstance 可以包含多个 UGa…

mac_录屏

参考: mac m1上系统内录方法BlackHole代替soundflower录音(附安装包) https://blog.csdn.net/boildoctor/article/details/122765119录屏后没声音?这应该是 Mac(苹果电脑) 内录声音最优雅的解决方案了 https://www.bilibili.com/…

CTF MISC 简单的脚本的撰写 -- 进制转换篇

前言 为什么学习 脚本 ? 当脚本小子的基础也是需要看懂代码的好吧 虽然很多工具都可以解码 进制转换 ascii 但是 前 128位的ascii 可以转 那后 128位呢 一般工具是不识别的所以脚本还需自己学 【ASCII】完整ascii码表0-127 扩展表128-255-CSDN博客 前言知识…

我的Opencv

1.安装Opencv pip install opencv-python 2.读取图像 3.写图像 4. 显示图像 5.waitKey() 6.读视频并播放视频 7.写视频 8. 获取摄像头视频 9.色彩转换 # BGR to GRAY imgGRAY cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # BGR to RGB imgRGB cv2.cvtColor(img, cv2.COLOR_…

Go语言及MongoDB数据库安装配置详解!

Go语言安装 首先讲一下go语言的安装,这部分可直接从官网下载,基本上一键配置的: 官网地址:All releases - The Go Programming Language 选择自己对应系统的安装包,这里官网提供了5种不同的包可自行下载 之后便是默认…

Redis - Token JWT 概念解析及双token实现分布式session存储实战

Token 定义:令牌,访问资源接口(API)时所需要的资源凭证 一、Access Token 定义:访问资源接口(API)时所需要的资源凭证,存储在客户端 组成 组成部分说明uid用户唯一的身份标识time…

sentinel限流+其他

quick-start | Sentinel sentinel 作用 限流 熔断降级 1,限制什么 QPS 并发线程数 2,限制什么 资源,什么资源 服务,方法,接口,或者一段代码 3,实现方式 配置规则 注解 其他 Java常见5种限流…

JVM实战—2.JVM内存设置与对象分配流转

大纲 1.JVM内存划分的原理细节 2.对象在JVM内存中如何分配如何流转 3.部署线上系统时如何设置JVM内存大小 4.如何设置JVM堆内存大小 5.如何设置JVM栈内存与永久代大小 6.问题汇总 1.JVM内存划分的原理细节 (1)背景引入 (2)大部分对象的存活周期都是极短的 (3)少数对象…

Eclipse常用快捷键详解

文章目录 Eclipse常用快捷键详解一、引言二、编辑快捷键三、选择和移动快捷键四、行操作快捷键五、搜索和导航快捷键六、调试快捷键七、重构快捷键八、其他快捷键九、使用案例场景一:代码编写代码示例 场景二:代码调试场景三:代码重构代码示例…

oscp学习之路,Kioptix Level2靶场通关教程

oscp学习之路,Kioptix Level2靶场通关教程 靶场下载:Kioptrix Level 2.zip 链接: https://pan.baidu.com/s/1gxVRhrzLW1oI_MhcfWPn0w?pwd1111 提取码: 1111 搭建好靶场之后输入ip a看一下攻击机的IP。 确定好本机IP后,使用nmap扫描网段&…

linux系统上SQLPLUS的重“大”发现

SQL plus版本: [oraclepg-xc2 ~]$ sqlplus -v SQL*Plus: Release 19.0.0.0.0 - Production Version 19.3.0.0.0 操作系统:CentOS Linux 7 (Core) 数据库:Oracle 19c Version 19.3.0.0.0 同样的SQL脚本在windos CMD sqlplus 执行没问题。…

Qt使用QZipWriter和QZipReader来解压、压缩文件

首先感谢这位博主的无私奉献:Qt - 实现压缩文件、文件夹和解压缩操作 - [BORUTO] - 博客园 多文件和目录压缩时,不改变原始文件和目录的相对位置结构,需要在addFile和addDirectory时,需要带上相对路径,如下&#xff1…

命令行之巅:Linux Shell编程的至高艺术(中)

文章一览 前言一、输入/输出及重定向命令1.1 输入/输出命令1.1.1 read命令1.1.2 echo命令 1.2 输入/输出重定向1.3 重定向深入讲解1.4 Here Document1.4.1 /dev/null 文件 二、shell特殊字符和命令语法2.1 引号2.1.1 双引号2.1.2 单引号2.1.3 倒引号 2.2 注释、管道线和后台命令…

【ANGULAR网站开发】初始环境搭建

1. 初始化angular项目 1.1 创建angular项目 需要安装npm和nodejs,这边不在重新安装 直接安装最新版本的angular npm install -g angular/cli安装指定大版本的angular npm install -g angular/cli181.2 启动angular 使用idea启动 控制台启动 ng serve启动成功…

Unity3D仿星露谷物语开发8之角色移动

1、目标 通过键盘上的上下左右控制角色移动,默认情况下是run,按住Shift为walk。 2、流程 (1)优化Settings代码 此时的Settings.cs完整代码如下: using UnityEngine;public static class Settings {// Player Moveme…