SpringBoot中如何使用Spring Security安全框架

在Spring Boot中使用Spring Security的基本步骤如下:

1,添加Spring Security依赖到你的 pom.xml 文件中:

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

2,配置WebSecurityConfigurerAdapter来定义安全策略。
如,你可以设置哪些URL是公开的,哪些需要认证等。

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/home").permitAll()  // 所有人都可访问.antMatchers("/500","/403","/404").permitAll()  // 所有人都可访问.antMatchers("/sell/*").hasRole("sell") 	// 仅有sell角色可访问的URL.antMatchers("/admin/**").hasRole("admin") 	// 仅有admin角色访问的URL.anyRequest().authenticated() // 任何其它请求,都需要身份认证.and()//2、登录配置表单认证方式.formLogin().loginPage("/login") // 自定义的登录页面.usernameParameter("username") // 自定义登录页面的入参用户名.usernameParameter("password") // 自定义登录页面的入参密码.loginProcessingUrl("/doLogin") //上面登录表单提交url,不需要再控制层写/doLogin.permitAll().defaultSuccessUrl("/index") //登录成功后默认的跳转页面路径.failureUrl("/login?error=true").successHandler(loginSuccessHandler) //使用自定义的成功结果处理器.failureHandler(loginFailureHandler) //使用自定义失败的结果处理器.and() //3、退出.logout().logOutPage("logout") // 默认对应 logout.html.permitAll().and().rememberMe() // 登录之后记住我,即将cookie发送给客户端保存.rememberMeParameter("myPage") //自定义页面参数.and()//4、session管理.sessionManagement().invalidSessionUrl("/login") //失效后跳转到登陆页面//单用户登录,如果有一个登录了,同一个用户在其他地方登录将前一个剔除下线//.maximumSessions(1).expiredSessionStrategy(expiredSessionStrategy())//单用户登录,如果有一个登录了,同一个用户在其他地方不能登录//.maximumSessions(1).maxSessionsPreventsLogin(true) ;.and()//5、禁用跨站csrf攻击防御.csrf().disable();}@Overridepublic void configure(HttpSecurity http) throws Exception {superconfigure(http);//配置静态文件(css,js,git/png等图片)不需要认证http.ignoring().antMatchers("/static/**");// ...更多设置...}/** 加密对象,对用户密码进行加密用*/@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}}

3,创建一个Controller来处理登录和注销请求。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class SecurityController {@GetMapping("/login")public String login() {return "login";}@GetMapping("/logout")public String logout() {return "logout";}/**方式一,获取登录用户信息, 通过 SecurityContext 对象获取SecurityContext 对象,用该对象获取登录用户信息 */@GetMapping("/userInfo")@ResponseBodypublic Map<String, String> getUserInfo() {SecurityContext context = SecurityContextHolder.getContext();Authentication authentication = context.getAuthentication();// org.springframework.security.core.userdetails.UserUser user = (User) authentication.getPrincipal();Map<String, String> map = new HashMap<>();map.put("username",user.getUsername());map.put("authorities",user.getAuthorities());return map;}/**方式二,获取登录用户信息, 通过 @SessionAttribute 从Session中获取 */@GetMapping("/userInfo2")@ResponseBodypublic Map<String, String> getUserInfo2(@SessionAttribute("SPRING_SECURITY_CONTEXT") SecurityContext context) {		Authentication authentication = context.getAuthentication();// org.springframework.security.core.userdetails.UserUser user = (User) authentication.getPrincipal();Map<String, String> map = new HashMap<>();map.put("username",user.getUsername());map.put("authorities",user.getAuthorities());return map;}}

4,创建对应的登录页面和注销页面的HTML模板。

登录页面 (login.html):

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:th="http://www.thymeleaf.org">
<head><title>Login Page</title>
</head>
<body>
<h2>Login</h2>
<form th:action="@{/login}" method="post"><div><label> Username: <input type="text" name="username"/> </label></div><div><label> Password: <input type="password" name="password"/> </label></div><div><input type="submit" value="Login"/></div>
</form>
</body>
</html>

注销或退出页面 (logout.html):

<!DOCTYPE html>
<html>
<head><title>登出页面</title>
</head>
<body>
<h2>你已经退出系统.</h2>
</body>
</html>

5,创建一个启动类SpringBootJpaApplication:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);}
}

6,确保你的应用程序使用了Spring Security的自动配置。如果你需要自定义更多的安全特性,
你可以创建一个 @Configuration 类来扩展或覆盖默认配置。

以上步骤提供了一个基本的安全配置,允许你开始在Spring Boot应用程序中使用Spring Security。
根据你的具体需求,你可能需要进一步定制安全配置。

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

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

相关文章

如何学习Python:糙快猛的大数据之路(学习地图)

在这个AI和大数据主宰的时代,Python无疑是最炙手可热的编程语言之一。无论你是想转行还是提升技能,学习Python都是一个明智之选。但是,该如何开始呢?今天,让我们聊聊"糙快猛"的Python学习之道。 什么是"糙快猛"学习法? "糙快猛"学习法,顾名思…

Spark SQL----JOIN

Spark SQL----JOIN 一、描述二、语法三、参数四、Join类型4.1 Inner Join4.2 Left Join4.3 Right Join4.4 Full Join4.5 Cross Join4.6 Semi Join4.7 Anti Join 五、例子 一、描述 SQL连接用于根据join criteria组合来自两个关系的行。以下部分描述了整个join语法&#xff0c;…

OpenGL笔记十四之GLM数学库的配置与使用

OpenGL笔记十四之GLM数学库的配置与使用 —— 2024-07-20 中午 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记十四之GLM数学库的配置与使用1.旋转变换运行效果2.平移变换运行效果3.缩放变换运行效果4.复合变换&#xff1a;先旋转 再平移运行效果5.复合…

OpenTeleVision复现及机器人迁移

相关信息 标题 Open-TeleVision: Teleoperation with Immersive Active Visual Feedback作者 Xuxin Cheng1 Jialong Li1 Shiqi Yang1 Ge Yang2 Xiaolong Wang1 UC San Diego1 MIT2主页 https://robot-tv.github.io/链接 https://robot-tv.github.io/resources/television.pdf代…

八股文之java基础

jdk9中对字符串进行了一个什么优化&#xff1f; jdk9之前 字符串的拼接通常都是使用进行拼接 但是的实现我们是基于stringbuilder进行的 这个过程通常比较低效 包含了创建stringbuilder对象 通过append方法去将stringbuilder对象进行拼接 最后使用tostring方法去转换成最终的…

c++线程传参

在C中&#xff0c;可以使用std::thread的构造函数来向线程传递参数。这里有一个示例&#xff1a; #include <iostream> #include <thread>// 定义一个被线程调用的函数 void threadFunc(int arg1, double arg2, std::string arg3) {std::cout << "arg1…

filebeat把日志文件上传到Es中配置(ES7版本)

默认的filebeat配置会把所有的索引都放到一个文件中&#xff0c;通过摸索发现可以自定义索引的名字、模板、生命周期 &#xff08;重点注意&#xff09;该配置文件只适应于ES版本是7&#xff0c;不适应于8的版本&#xff0c;两个版本的配置文件差异很大 /app/logs/info.log日…

glibc: getifaddrs_internal 占用大量cpu

Samples: 60K of event cpu-clock:pppH, Event count (approx.): 15027000000Overhead Command Shared Object Symbol - 34.84% arping libc-2.28.so [.] getifaddrs_internal getifaddrs_internal__GI___getifaddrs

独立开发者系列(31)——fastadmin项目的二次开发

在前面构建项目的fastadmin入门 里面&#xff0c;我们已经能快速搭建该体系和根据数据表建立最简单的CURD项目。类似练手的图书管理系统&#xff0c;内部项目修改管理&#xff0c;也对系统进行了简单的部署。这梳理拿到真正项目的开发流程。 默认的开发目录和代码程序运行的是p…

【Linux系统化学习】数据链路层

目录 数据链路层解决的问题 以太网 认识局域网 以太网帧格式 两个问题 认识MAC地址 认识MTU ARP协议 ARP协议的作用 ARP数据报格式 ARP协议的工作流程 数据链路层解决的问题 对于TCP/IP四层协议来说&#xff0c;数据链路层才是真正从传送数据进行跑腿办事情的&…

设计模式简述(一)

定义&#xff1a;设计模式指的是在软件开发过程中&#xff0c;经过验证的&#xff0c;用于解决在特定环境下&#xff0c;重复出现的&#xff0c;特定问题的解决方案。创建型设计模式关注对象的创建过程&#xff0c;提供了更灵活、可扩展的对象创建机制。结构型设计模式用于解决…

excel批量新建多个同类型的表格

背景引入 比如&#xff0c;一个企业有多个部门&#xff0c;现在需要按照某一个excel表模板收集各个部门的信息&#xff0c;需要创建数十个同类型表格&#xff0c;且标题要包含部门名称。 1.修改模板表格标题 在一个文件夹下面放入需要发放给各个部门的表格&#xff0c;将标题…

微软蓝屏事件暴露的网络安全问题

目录 1.概述 2.软件更新流程中的风险管理和质量控制机制 2.1.测试流程 2.2.风险管理策略 2.3.质量控制措施 2.4.小结 3.预防类似大规模故障的最佳方案或应急响应对策 3.1. 设计冗余系统 3.2. 实施灾难恢复计划 3.3. 建立高可用架构 3.4. 类似规模的紧急故障下的响应…

Kotlin泛型实化

内联函数 reified实现 1. 内联函数 内联函数中的代码会在编译的时候自动被替换到调用它的地方&#xff0c;这样的话也就不存在什么泛型擦除的问题了&#xff0c;因为代码在编译之后会直接使用实际的类型来替代内联函数中的泛型声明。 2. reified关键字 在Kotlin中&#xff0…

秒杀优化: 记录一次bug排查

现象 做一人一单的时候&#xff0c;为了提升性能&#xff0c;需要将原来的业务改造成Lua脚本加Stream流的方式实现异步秒杀。 代码改造完成&#xff0c;使用Jmeter进行并发测试&#xff0c;发现redis中的数据和预期相同&#xff0c;库存减1&#xff0c;该用户也成功添加了进去…

React前端面试每日一试 1.虚拟DOM是什么?

** 虚拟DOM&#xff08;Virtual DOM&#xff09;是什么&#xff1f; 虚拟DOM其实是React中的一个核心概念&#xff0c;它是一种编程概念&#xff0c;指的是在内存中以JavaScript对象的形式表示UI结构。当组件状态发生变化时&#xff0c;React首先会创建一个新的虚拟DOM&#…

【Node】npm i --legacy-peer-deps,解决依赖冲突问题

文章目录 &#x1f356; 前言&#x1f3b6; 一、问题描述✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 npm i --legacy-peer-deps&#xff0c;解决依赖冲突问题 &#x1f3b6; 一、问题描述 node执行安装指令时出现报错&#xff…

【车辆轨迹处理】python实现轨迹点的聚类(一)——DBSCAN算法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、单辆车轨迹的聚类与分析1.引入库2.聚类3.聚类评价 二、整个数据集多辆车聚类1.聚类2.整体评价 前言 空间聚类是基于一定的相似性度量对空间大数据集进行分组…

Hopfield 网络简介

引入 Hopfield网络的概念 Hopfield 网络的应用 Hopfield 网络由于能够非常有效地存储和检索信息&#xff0c;因此在各个领域都很有用。 尽管它们如今并不像用于一般机器学习任务的其他类型的人工神经网络那样常见&#xff0c;但它们仍然具有重要的特定应用&#xff1a; 1.联…

ES中的数据类型学习之ALIAS

Alias field type | Elasticsearch Guide [7.17] | Elastic 这里只针对data type的alias&#xff0c;暂时不说 index的alias。直接实战开始 PUT trips { "mappings": { "properties": { "distance": { "type": &…