【Spring Boot】用 Spring Security 实现后台登录及权限认证功能

news2024/11/14 15:25:51

用 Spring Security 实现后台登录及权限认证功能

  • 1.引入依赖
  • 2.创建权限开放的页面
  • 3.创建需要权限验证的页面
  • 4.配置 Spring Security
    • 4.1 配置 Spring MVC
    • 4.2 配置 Spring Security
  • 5.创建登录页面
  • 6.测试权限

1.引入依赖

使用前需要引入相关依赖,见以下代码:

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-security</artifactId>
	</dependency>
	
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-thymeleaf</artifactId>
	</dependency>
	
	<dependency>
		<groupId>org.thymeleaf.extras</groupId>
		<artifactId>thymeleaf-extras-springsecurity5</artifactId>
	</dependency>
</dependencies>

2.创建权限开放的页面

这个页面(welcome.html)是不需要鉴权即可访问的,以区别演示需要鉴权的页面,见以下代码:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
	<head><title>Spring Security 案例</title></head>
	<body>
		<h1>Welcome!</h1>
		<p><a th:href="@{/home}">会员中心</a></p>
	</body>
</html>

3.创建需要权限验证的页面

其实可以和不需要鉴权的页面一样,鉴权可以不在 HTML 页面中进行,见以下代码:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
	<head><title>home</title></head>
	<body>
		<p>会员中心</p>
		<p th:inline="text">Hello <span sec:authentication="name"></span></p>
		<form th:action="@{/logout}" method="post">
		    <input type="submit" value="登出"/>
		</form>
	</body>
</html>

使用 Spring Security 5 之后,可以在模板中用 <span sec:authentication="name"></span>[[${#httpServletRequest.remoteUser}]] 来获取用户名。登岀请求将被发送到 /logout。成功注销后,会将用户重定向到 /login?logout

4.配置 Spring Security

4.1 配置 Spring MVC

可以继承 WebMvcConfigurer,具体使用见以下代码:

package com.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //设置登录处理操作
        registry.addViewController("/home").setViewName("springsecurity/home");
        registry.addViewController("/").setViewName("springsecurity/welcome");
        registry.addViewController("/login").setViewName("springsecurity/login");
    }
}

在这里插入图片描述

4.2 配置 Spring Security

Spring Security 的安全配置需要继承 WebSecurityConfigurerAdapter,然后重写其方法, 见以下代码:

package com.example.demo.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
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;

@Configuration
// 指定为 Spring Security 配置类
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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


    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("admin").password("$2a$10$AlpMTGDkUfYJMnb3/uNT1.mLxLJng7Uplfzpv5yIqZTkYtYsiiYbO").roles("USER");
    }
}
  • @EnableWebSecurity 注解:集成了 Spring Security 的 Web 安全支持。
  • @WebSecurityConfig:在配置类的同时集成了 WebSecurityConfigurerAdapter,重写了其中的特定方法,用于自定义 Spring Security 配置。Spring Security 的工作量都集中在该配置类。
  • configure(HttpSecurity):定义了哪些 URL 路径应该被拦截。
  • configureGlobaI(AuthenticationManagerBuiIder):在内存中配置一个用户,admin / pipi,这个用户拥有 User 角色。
  • 确保 antMatchers(xxx).permitAll() 的配置在需要认证和授权的 URL 路径之前。因为 Spring Security 会按照配置文件的顺序来匹配 URL 路径,如果 antMatchers(xxx).permitAll() 在后面,那么前面的认证和授权规则会覆盖掉它。
  • .logout().permitAll() 表示在 Spring Security 配置中,‌无论用户是否经过身份验证,‌都可以访问注销(‌logout)‌页面。‌这意味着,‌即使是一个未经过身份验证的用户也可以访问注销功能,‌这在某些情况下可能是一个安全隐患。‌因此,‌这个配置通常用于开发环境或测试环境,‌以确保用户可以轻松地测试注销功能,‌而在生产环境中,‌出于安全考虑,‌通常会更加限制对注销页面的访问权限。‌

5.创建登录页面

登录页面要特别注意是否开启了 CSRF 功能。如果开启了,则需要提交 token 信息。创建的登录页面见以下代码:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
	<head><title>Spring Security Example </title></head>
	<body>
		<div th:if="${param.error}">
		    无效的用户名或者密码
		</div>
		<div th:if="${param.logout}">
		    你已经登出
		</div>
		<form th:action="@{/login}" method="post">
		    <div><label> 用户名: <input type="text" name="username"/> </label></div>
		    <div><label> 密码: <input type="password" name="password"/> </label></div>
		    <div><input type="submit" value="登录"/></div>
		</form>
	</body>
</html>

6.测试权限

启动项目,访问首页 http://localhost:8080

在这里插入图片描述

单击 “会员中心”,尝试访问受限的页面 http://localhost:8080/home。由于未登录,结果被强制跳转到登录页面 http://localhost:8080/login

在这里插入图片描述

输入正确的用户名和密码 (admin, pipi) 之后,跳转到之前想要访问的 /home, 显示用户名 admin

在这里插入图片描述

单击 “登出” 按钮,回到登录页面。

在这里插入图片描述

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

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

相关文章

DeDe-cms 漏洞

一、文件管理上传shell 我们写一个一句话木马&#xff0c; 上传 点击访问后使用工具连接 连接成功 二、修改模板文件拿shell 找到index.html修改 保存,进行如下操作 更新html 访问返回的地址 拿工具连接 三、后台任意命令执行拿shell 写入一个木马 添加成功后点击代码 这里是文…

python-鼠标绘画线条程序

闲来无聊简单编写了一个绘图小程序。 主要思路 主要是基于Python中的内置模块turtle编写的&#xff0c;简单扩展了一下&#xff0c;通过绑定事件能够达到鼠标绘制、删除、存储已经绘制图案的线条这几个功能。 路径结构 -draw- define.py- main.py- myturtle.py使用 点住鼠…

zabbix7.0TLS-01-部署

文章目录 1 介绍1.1 架构1.2 主要概念和名词1.3 最新 7.0 TLS 版本的部分新特性更灵活的资源发现和管理 2 官方部署指导地址3 在 Rocky Linux 9 上安装 zabbix3.1 安装软件包3.2 创建初始化数据库3.3 配置zabbix-server3.4 启动Zabbix server和agent进程3.5 默认监听端口3.6 访…

电脑新加的硬盘如何分区?新加硬盘分区选MBR还是GPT

最近有网友问我,电脑新加的硬盘如何分区?电脑新加的硬盘分区选MBR还是GPT要看引导模式采用uefi还是传统的legacy模式&#xff0c;如果采用的是uefi引导模式&#xff0c;分区类型对应的就是gpt分区(guid)&#xff0c;如果引导模式采用的是legacy&#xff0c;对应的分区类型为mb…

springboot专家门诊预约管理平台-计算机毕业设计源码79775

摘要 随着互联网技术的快速发展&#xff0c;医疗健康领域数字化需求日益增长&#xff0c;专家门诊预约管理平台应运而生。本研究基于Spring Boot框架开发了一款专家门诊预约管理平台。该平台涵盖了患者用户、专家用户和管理员三个角色&#xff0c;实现了患者的预约、评价、信息…

Java:进程和线程

文章目录 进程线程的概念和区别总结如何创建线程1.继承Thread重写run2.实现Runnable重写run3.继承Thread重写run,通过匿名内部类来实现4. 实现Runnable重写run,通过匿名内部类来实现5.基于lambda表达式来创建 虚拟线程 并发编程: 通过写特殊的代码&#xff0c;把多个CPU核心都利…

C# OpenCvSharp 打开4K高清摄像头

一、前言 整了个1200w像素的usb摄像头&#xff0c;使用 OpenCvSharp读取&#xff0c;读取和设置分辨率代码耗时居然10几秒&#xff0c;查询资料发现&#xff0c;必须对VideoCapture进行设置&#xff0c;使用DSHOW模式打开&#xff0c;并且设置分辨率代码下必须增加 指定MJPG编码…

php的mysql操作可实现简单登录功能

文章目录 1. 表单和请求(1) 表单操作(2) 网络请求(3) $_REQUEST超全局变量 2. mysql数据库操作1) mysqli连接操作2) 操作数据库3) 预处理语句4) pdo操作数据库5) 创建连接并执行查询语句 1. 表单和请求 主要使用到**$_GET** 和 $_POST这两个超全局变量,分别对应两种请求 (1) …

【2024蓝桥杯/C++/B组/小球反弹】

题目 分析 Sx 2 * k1 * x; Sy 2 * k2 * y; &#xff08;其中k1, k2为整数&#xff09; Vx * t Sx; Vy * t Sy; k1 / k2 (15 * y) / (17 * x)&#xff1b; 目标1&#xff1a;根据k1与k2的关系&#xff0c;找出一组最小整数组&#xff08;k1, k2&#xff09;&#xff…

北京崇文门中医院贾英才主任解读头晕:症状与根源

头晕是一种常见的症状&#xff0c;可能由多种原因引起。为了更深入地了解头晕这一症状&#xff0c;我们有幸邀请到了北京崇文门中医院的贾英才主任&#xff0c;听听他对于头晕的见解。 北京崇文门中医院贾英才主任指出&#xff0c;头晕并非一种单一的疾病&#xff0c;而是许多潜…

鉴权-RBAC模型

文章目录 1.技术选型1.网址2.Sa-Token介绍3.[Sa-Token 功能一览](https://sa-token.cc/doc.html#/?idsa-token-功能一览) 2.鉴权数据模型设计1.数据模型图2.SQL1.用户信息表2.角色表3.用户角色表&#xff08;关联表&#xff09;4.权限表5.角色权限表&#xff08;关联表&#x…

1518.换水问题

1.题目描述 超市正在促销&#xff0c;你可以用 numExchange 个空水瓶从超市兑换一瓶水。最开始&#xff0c;你一共购入了 numBottles 瓶水。 如果喝掉了水瓶中的水&#xff0c;那么水瓶就会变成空的。 给你两个整数 numBottles 和 numExchange &#xff0c;返回你 最多 可以喝到…

辩论赛评委依据什么标准进行评分呢

在辩论赛中&#xff0c;评委依据什么标准进行对参赛个人和团队进行评分呢&#xff1f;下面对这两部分介绍一些常用评分标准。 一、 个人评分标准 语言表达 1、普通话标准、语速适中&#xff1b; 2、语调平仄合理&#xff1b; 3、口头、肢体语言和谐&#xff1b; 4、修辞得当、…

C基础项目(学生成绩管理系统)

目录 一、项目要求 二、完整代码实例 三、分文件编写代码实例 一、项目要求 1.系统运行&#xff0c;打开如下界面。列出系统帮助菜单&#xff08;即命令菜单&#xff09;&#xff0c;提示输入命令 2.开始时还没有录入成绩&#xff0c;所以输入命令 L 也无法列出成绩。应提…

解决 Vue 页面中地址栏参数变更不刷新的问题

在一次Vue项目开发中&#xff0c;遇到了只改变路由中的参数&#xff0c;路由地址不改变页面数据不刷新的问题。造成这个问题的原因&#xff0c;是因为 vue-router 同一个页面地址栏参数改变&#xff08;比如文章的发布和编辑是同一个页面&#xff09;&#xff0c;不会触发vue的…

cms-wordpress 漏洞

登录后台 一、后台改模板 点击外观&#xff0c;编辑&#xff0c; 找一个php文件&#xff0c;在最开头加入一句话木马&#xff1b; 点击更新&#xff0c;访问模板类路径下的这个文件(不知道默认模板路径可以搜) 使用工具连接 二、上传主题拿shell 点击外观&#xff0c;主题&am…

NeRF学习——基于Pytorch代码复现的笔记

代码复现的框架是基于&#xff1a;pengsida 的 Learning NeRF 源代码框架是基于 Linux 的&#xff0c;我在 Windows 上进行复现有些许 bug&#xff0c;Windows 上 bug 修复的框架版本&#xff1a;Learning NeRF 希望各位可以通过学习 NeRF-Pytorch 的源码来自己复现一下试试看…

Lanproxy开箱即用的内网穿透工服务!!

Lanproxy快速上手配置服务器转发到内网!! 本教程云服务器推荐使用的开发环境如下&#xff1a;服务器端配置配置端口登录Web界面 内网客户端配置下载客户端配置客户端端口 最终效果测试 本文主要记录了使用Lanproxy搭建内网穿透服务的过程&#xff0c;其中包括服务端和客户端的详…

使用redis缓存文章浏览量

效果展示 好处 首先初始化所有浏览量 访问文章后增加的浏览量**不直接修改数据库&#xff0c;先存到redis然后访问也是获取redis的浏览量&#xff0c;做个定时任务&#xff0c;后续自定义时间同步数据库**&#xff0c;好像也就是一个集中处理罢了 CommandLineRunner实现项目…

鸿蒙系统学习指南

&#x1f41f;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢编程&#x1fab4; &#x1f421;&#x1f419;个人主页&#x1f947;&#xff1a;Aic山鱼 &#x1f420;WeChat&#xff1a;z7010cyy &#x1f988;系列专栏&#xff1a;&#x1f3de;️ 前端-JS基础专栏✨前…