Spring boot之身份验证和访问控制

本文笔记跟随于遇见狂神说老师的视频

一.SpringSecurity(安全)

1.相关概念

在web开发中,安全第一位,有简单的方法,比如:拦截器,过滤器

也有安全框架,比如:SpringSecurity,shiro,两者很像,名字和类不一样。

都是做认证授权两个部分!

常见的权限有:功能权限,访问权限,菜单权限。以前做这些用拦截器,过滤器(大量的原生代码~)

 2.代码前期准备阶段

2.1导入静态资源

2.2导入security依赖

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

2.3创建controller层

package com.zhang.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@Controller
public class RouterController {@GetMapping("/index")public String index(){return "index";}@GetMapping("/tologin")public String toLogin(){return "views/login";}@GetMapping("/level1/{id}")public String level1(@PathVariable("id") int id){return "views/level1/"+id;}@GetMapping("/level2/{id}")public String level2(@PathVariable("id") int id){return "views/level2/"+id;}@GetMapping("/level3/{id}")public String level3(@PathVariable("id") int id){return "views/level3/"+id;}
}

3.认证和授权实现

 创建一个配置类,用来设置用户的访问权限,以及认证用户的身份信息

package com.zhang.config;import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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.crypto.bcrypt.BCryptPasswordEncoder;@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter {//授权@Overrideprotected void configure(HttpSecurity http) throws Exception {//给传过来的url设置访问权限,首页所有人都可以访问,功能页只能是有权限的人可以访问//请求授权的规则http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/level1/**").hasRole("vip1").antMatchers("/level2/**").hasRole("vip2").antMatchers("/level3/**").hasRole("vip3");//没有权限自动跳到登录页面http.formLogin();}//认证  springboot 2.1.x可以直接使用//Spring security 5.0中新增了多种加密方式,也改变了密码的格式。//要想我们的项目还能够正常登陆,需要修改一下configure中的代码。我们要将前端传过来的密码进行某种方式加密//spring security 官方推荐的是使用bcrypt加密方式。@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//可以从内存也可以从数据库中取数据认证auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser("zhangsan").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1").and().withUser("lisi").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2").and().withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3");}
}

4.注销功能实现

在配置类中实现注销功能

在前端index.xml主页面中增加注销按钮

经测试,注销成功后会跳转到登录页面,如果想要注销成功后跳转到主页面,需要在配置类中改进一下开启注销功能

 //开启注销功能    .logoutSuccessUrl("/"); 注销成功来到首页http.logout().logoutSuccessUrl("/");

如果用户没有登录时在导航栏只显示登录按钮,登录后在导航栏显示用户的登录信息和注销按钮并且如何根据用户的权限不同在菜单栏显示的功能也不同?

我们需要结合thymeleaf中的一些功能

sec:authorize=“isAuthenticated()”:是否认证登录!来显示不同的页面

导入maven依赖

 <!--security-thymeleaf整合包--><dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity4</artifactId><version>2.1.2.RELEASE</version></dependency>

导入以上依赖后,可以在thymeleaf中进行一些security的操作

修改前端index.xml主页面

导入命名空间:

xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"

修改导航栏,增加认证判断: 

<!--主容器-->
<div class="ui container"><div class="ui segment" id="index-header-nav" th:fragment="nav-menu"><div class="ui secondary menu"><a class="item"  th:href="@{/index}">首页</a><!--登录注销--><div class="right menu"><!--如果未登录--><div sec:authorize="!isAuthenticated()"><a class="item" th:href="@{/toLogin}"><el-button type="success" icon="el-icon-check" circle></el-button> 登录</a></div><!--如果已登录--><div sec:authorize="isAuthenticated()"><a class="item"><el-button type="primary" icon="el-icon-edit" circle></el-button>用户名:<span sec:authentication="principal.username"></span></a></div><a class="item" th:href="@{/logout}"><el-button type="danger" icon="el-icon-delete" circle></el-button> 注销</a></div></div></div>

重启后点击注销会报404的错误,是因为它默认防止csrf跨站请求伪造,因为会产生安全问题,我们可以将请求改为post表单提交,或者在spring security中关闭csrf功能

        http.csrf().disable();//关闭csrf功能:跨站请求伪造,默认只能通过post方式提交logout请求

到此,可以在导航栏正确的显示登录前后的信息,接下来实现根据用户权限不同,在菜单栏显示不同页面。

修改前端index.xml主页面

sec:authorize=“hasRole()”,为具有相应权限的用户设置可访问的页面

5.记住我及首页定制

5.1记住我功能实现

登录之后,关闭浏览器,登录记录就没了,如果关闭浏览器再打开,还要显示登录的记录,我们需要设置一个记住我的功能。

在配置类中添加以下代码:

//实现记住我的功能http.rememberMe();

重启项目,登录页多了一个记住我功能,关闭浏览器后重新打开,发现登录记录还存在。

检查cookie发现,记住我被保存在cookie中,点击注销按钮后,cookie中的记住我被删除

结论:登录成功后,将cookie发送给浏览器保存,以后登录带上这个cookie,只要通过检查就可以免登录了。如果点击注销,则会删除这个cookie 。

5.2定制登录页

改变spring security默认的登录页为自定义的登录页

在刚才的登录配置功能后添加logininpage

 //没有权限自动跳到登录页面http.formLogin().loginPage("/tologin");

前端也要指向我们自定义的login请求

 我们登录,需要将这些信息发送到哪里,我们也需要配置,login.html 配置提交请求及方式,方式必须为post:

 <form th:action="@{/usr/tologin}" method="post">

图片实例:

 如果前端传递的参数username和password不是默认的,需要我们后台处理一下

如果username和password是以下的内容

需要在配置类中设置一下,将对应的字段进行连接

 //没有权限自动跳到登录页面http.formLogin().usernameParameter("/name").passwordParameter("/pwd").loginPage("/tologin");

 在登录页中增加记住我的按钮

 <div class="field"><input type="checkbox" name="remeber">记住我</div>
//实现记住我的功能http.rememberMe().rememberMeParameter("remeber");

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

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

相关文章

C#使用开源框架NetronLight绘制流程图

之前使用MindFusion.Diagramming绘制流程图确认很方便&#xff0c;只能试用版&#xff0c;如果长期使用&#xff0c;需要收费。 C#使用MindFusion.Diagramming框架绘制流程图(2):流程图示例_c# 画流程图控件-CSDN博客 这里找一个简易开源框架NetronLight&#xff0c;GIT下载地…

支持向量机(SVM)在脑部MRI分类中的深入应用与实现

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

AtCoder AT_abc413_c [ABC413C] Large Queue 题解

题目大意 有一个初始为空的序列 A A A&#xff0c; Q Q Q 次操作分为两类&#xff1a; 第一类&#xff1a;将 c c c 个 x x x 放到 A A A 的末尾。第二类&#xff1a;将前 k k k 个数的和输出并移除它们。 思路 这是一个求和问题&#xff0c;想到的第一个思路是前缀和…

「源力觉醒 创作者计划」_文心大模型开源:开启 AI 新时代的大门

在人工智能的浩瀚星空中&#xff0c;大模型技术宛如一颗璀璨的巨星&#xff0c;照亮了无数行业前行的道路。自诞生以来&#xff0c;大模型凭借其强大的语言理解与生成能力&#xff0c;引发了全球范围内的技术变革与创新浪潮。百度宣布于 6 月 30 日开源文心大模型 4.5 系列&…

Git 怎么判断是否冲突?

&#x1f4cc; [Q&A] Git 怎么判断是否冲突&#xff1f; Git 使用的是三路合并算法&#xff08;Three-way Merge&#xff09;&#xff0c;它比较&#xff1a; 共同祖先提交&#xff08;base&#xff09; 当前分支的改动&#xff08;ours&#xff09; 被合并分支的改动&am…

在sf=0.1时测试fireducks、duckdb、polars的tpch

首先&#xff0c;从https://github.1git.de/fireducks-dev/polars-tpch下载源代码包&#xff0c;将其解压缩到/par/fire目录。 然后进入此目录&#xff0c;运行 SCALE_FACTOR0.1 ./run-fireducks.sh&#xff0c;脚本会首先安装所需的包&#xff0c;编译tpch的数据生成器&#x…

AWS多账号管理终极指南:从安装配置到高效使用

引言:为什么需要多账号管理? 在云计算时代,企业使用多个AWS账号已成为最佳实践。根据AWS Well-Architected Framework,多账号架构可以: 实现环境隔离(生产/测试/开发)满足不同业务单元的安全要求简化资源管理和成本分配符合合规性要求(如SOC2、ISO27001)本文将手把手…

UE5音频技术

1 . 调制器 Modulator 调整参数 调制器可以使声音每次音高都不一样 2. 随机 节点 3. 混音器 Mixer 混合两个音频 4. 串联器 Concatenator 按循序播放 5.多普勒 Doppler 根据距离音频变化 6.包络线 Enveloper 武器充能发射 7.混响

创客匠人视角:创始人 IP 打造与知识变现的培训赋能体系

在知识付费行业进入精耕期的当下&#xff0c;为何部分企业投入大量培训却收效甚微&#xff1f;创客匠人 CEO 老蒋通过服务 5W 知识博主的经验指出&#xff1a;唯有将创始人 IP 思维与培训体系深度融合&#xff0c;才能让培训成为知识变现的 “转换器”。一、内训体系重构&…

基于Java+SpringBoot的三国之家网站

源码编号&#xff1a;S591 源码名称&#xff1a;基于SpringBoot的三国之家网站 用户类型&#xff1a;双角色&#xff0c;用户、管理员 数据库表数量&#xff1a;20 张表 主要技术&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 运行环境&#xff1a;Windows/Mac、…

推荐算法系统系列五>推荐算法CF协同过滤用户行为挖掘(itembase+userbase)

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》&#xff08;跟我一起学人工智能&#xff09;【陈敬雷编著】【清华大学出版社】 配套视频 推荐算法系统实战全系列精品课【陈敬雷】 文章目录 推荐算…

pytest之fixture中yield详解

1. fixture——yield介绍 fixture的teardown操作并不是独立的函数&#xff0c;用yield关键字呼唤teardown操作。前面通过fixture实现了在每个用例之前执行初始化操作&#xff0c;那么用例执行完之后&#xff0c;如需要清除数据&#xff08;或还原&#xff09;操作&#xff0c;…

Nginx 动静分离原理与工作机制详解:从架构优化到性能提升

前言&#xff1a;在 Web 应用架构不断演进的今天&#xff0c;如何高效处理日益增长的访问量和复杂的业务逻辑&#xff0c;成为开发者必须面对的挑战。当我们在浏览器中打开一个网页&#xff0c;那些直观可见的 HTML 页面、精美绝伦的图片、流畅运行的 JavaScript 脚本&#xff…

介绍electron

一、Electron 是什么&#xff1f; Electron 是一个基于 Chromium 和 Node.js 的框架&#xff0c;允许开发者使用前端技术&#xff08;HTML/CSS/JavaScript&#xff09;构建原生桌面应用。其核心优势在于&#xff1a; 跨平台&#xff1a;一次开发&#xff0c;生成 Windows、ma…

DeepSeek与诡秘之主

1、大模型像个腐儒 其实从大模型的训练方式来看&#xff0c;它算不上天赋异禀。尤其在成长阶段&#xff0c;大模型那种种令人惊艳的表现&#xff0c;足够让人误以为这是个天才。 可人这种生物&#xff0c;注定是贪婪的。在大模型成长后期&#xff0c;伴随着各种技巧的验证&…

动手实践OpenHands系列学习笔记5:代理系统架构概述

笔记5&#xff1a;代理系统架构概述 一、引言 AI代理系统是一种能够自主执行任务的智能软件架构&#xff0c;OpenHands作为AI驱动的软件开发代理平台&#xff0c;拥有完整的代理系统架构设计。本笔记将探讨AI代理架构的基本原理&#xff0c;并通过分析OpenHands核心架构&…

智能电动汽车 --- 车辆网关路由缓存

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

Spring中实现依赖注入(DI)的三种方式

1. Autowired 字段注入&#xff08;不推荐&#xff09;​ Service public class UserService {Autowired // 直接在字段上注入private UserRepository userRepository; } ​​原理​​&#xff1a;Spring 启动时扫描所有 Component、Service 等注解的类&#xff0c;发现 Aut…

Alpha系统联结大数据、GPT两大功能,助力律所管理降本增效

如何通过AI工具实现法律服务的提质增效,是每一位法律人都积极关注和学习的课题。但从AI技术火爆一下,法律人一直缺乏系统、实用的学习资料,来掌握在法律场景下AI的使用技巧。 今年5月,iCourt携手贵阳律协大数据与人工智能专业委员会,联合举办了《人工智能助力律师行业高质量发…

UI前端与数字孪生融合新趋势:智慧家居的智能化控制与个性化服务

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;数字孪生重构智慧家居的技术范式在智能家居渗透率快速提升的今天&#xf…