【Spring Security】Spring Security 认证与授权

在前面的章节中,我们沿用了Spring Security默认的安全机制:仅有一个用户,仅有一种角色。在实际开发中,这自然是无法满足需求的。本章将更加深入地对Spring Security迚行配置,且初步使用授权机制。

3.1 默认数据库模型的认证与授权

3.1.1、资源准备

首先,在controller包下新建三个控制器,如图所示。

其次,分别建立一些测试路由。

package com.boot.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/admin/api")
public class AdminController {@GetMapping("/hello")public String hello(){return "hello,admin";}}
package com.boot.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/app/api")
public class AppController {@GetMapping("/hello")public String hello(){return "hello,app";}}
package com.boot.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user/api")
public class UserController {@GetMapping("/hello")public String hello(){return "hello,user";}}

假设在/admin/api/下的内容是系统后台管理相关的API,在/app/api 下的内容是面向客户端公开访问的API,在/user/api/下的内容是用户操作自身数据相关的API;显然,/admin/api必须拥有管理员权限才能进行操作,而/user/api必须在用户登录后才能进行操作。

3.1.2、资源授权的配置

为了能正常访问前面的路由,我们需要进一步地配置Spring Security。

package com.boot.config;import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
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.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.util.StringUtils;import java.util.List;import static org.springframework.security.config.Customizer.withDefaults;//@EnableWebSecurity:开启SpringSecurity 之后会默认注册大量的过滤器servlet filter
//过滤器链【责任链模式】SecurityFilterChain
@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {//authorizeHttpRequests:针对http请求进行授权配置//login登录页面需要匿名访问//permitAll:具有所有权限 也就可以匿名可以访问//anyRequest:任何请求 所有请求//authenticated:认证【登录】http.authorizeHttpRequests(authorizeHttpRequests->authorizeHttpRequests//********************************角色****************************************//.requestMatchers("/admin/api").hasRole("admin") //必须有admin角色才能访问到//.requestMatchers("/user/api").hasAnyRole("admin","user") // /user/api:admin、user都是可以访问//********************************权限****************************************.requestMatchers("/admin/api").hasAuthority("admin:api") //必须有admin:api权限才能访问到.requestMatchers("/user/api").hasAnyAuthority("admin:api","user:api") //有admin:api、user:api权限能访问到//********************************匹配模式****************************************.requestMatchers("/admin/api/?").hasAuthority("admin:api") //必须有admin:api权限才能访问到.requestMatchers("/user/api/my/*").hasAuthority("admin:api") //必须有admin:api权限才能访问到.requestMatchers("/admin/api/a/b/**").hasAuthority("admin:api") //必须有admin:api权限才能访问到.requestMatchers("/app/api").permitAll() //匿名可以访问.requestMatchers("/login").permitAll().anyRequest().authenticated());//现在我们借助异常处理配置一个未授权页面:【实际上是不合理的 我们应该捕获异常信息 通过异常类型来判断是什么异常】http.exceptionHandling(e->e.accessDeniedPage("/noAuth"));//http:后面可以一直点 但是太多内容之后不美

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

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

相关文章

使用Gradle创建SpringBoot项目

Spring Boot Gradle 插件在Gradle 提供Spring Boot 支持。它允许您打包可执行jar 或war 归档文件,运行SpringBoot 应用程序,并使用Spring-Boot-dependencies 提供的依赖管理。相关文档请参考: https://docs.spring.io/spring-boot/docs/curre…

CSAPP BOMB LAB part3

CSAPP BOMB LAB part3 phase_4 bomb.s phase_4的代码: 格式: 40102e行,比较0x8rsp的值和0xe, 需要让0x8rsp小于0xe, 然后跳转到40103a, func函数根据bomb.s 转化为c代码: 这个直接参考了知乎网友的翻译, func4的返回值等于0, 跳转到40…

【SpringSecurity】简介

SpringSecurity简介 Spring Security 的前身是Acegi Security,在被收纳为Spring 子项目后正式更名为Spring Security。Spring Security目前已经到了6.x,并且加入了原生OAuth2.0框架,支持更加现代化的密码加密方式。可以预见,在Ja…

翻页电子杂志制作功略,快收藏,保管好用!

翻页电子杂志,我相信这对大家很熟悉吧,大家也都经常看电子杂志吧。它和我们的生活紧密相关,也极大地改变了我们的阅读方式。听到这“翻页电子杂志”,是不是觉得制作起来肯定很难很复杂,需要专业的人才能制作呢&#xf…

第 370 周赛 100112. 平衡子序列的最大和(困难,离散化,权值树状数组)

太难了,看答案理解了半天 题目的要求可以理解为 nums[ij] - ij > nums[ii] - ii ,所以问题化为求序列 bi nums[i] - i 的非递减子序列的最大元素和需要前置知识,离散化,树状数组离散化:将分布大却数量少(即稀疏)的…

0X02

web9 阐释一波密码&#xff0c;依然没有什么 发现&#xff0c;要不扫一下&#xff0c;或者看一看可不可以去爆破密码 就先扫了看看&#xff0c;发现robots.txt 访问看看,出现不允许被访问的目录 还是继续尝试访问看看 就可以下载源码&#xff0c;看看源码 <?php $fl…

旅游业为什么要选择VR全景,VR全景在景区旅游上有哪些应用

引言&#xff1a; VR全景技术的引入为旅游业带来了一场变革。这项先进技术不仅提供了前所未有的互动体验&#xff0c;还为景区旅游文化注入了新的生机。 一&#xff0e;VR全景技术&#xff1a;革新旅游体验 1.什么是VR全景技术&#xff1f; VR全景技术是一种虚拟现实技术&am…

第12章_MySQL数据类型精讲

文章目录 1 MySQL中的数据类型2 整数类型2.1 类型介绍2.2 可选属性2.2.1 M2.2.2 UNSIGNED2.2.3 ZEROFILL 2.3 适用场景2.4 如何选择演示代码 3 浮点类型3.1 类型介绍 本章的内容测试建议使用 MySQL5.7进行测试。3.2 数据精度说明3.3 精度误差说明 4 定点数类型4.1 类型介绍4.2 …

ZZ038 物联网应用与服务赛题第D套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 (D卷) 赛位号:______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用的各类软件工具、软件安装文件等,都…

1、Flink基础概念

1、基础知识 &#xff08;1&#xff09;、数据流上的有状态计算 &#xff08;2&#xff09;、框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。 &#xff08;3&#xff09;、事件驱动型应用&#xff0c;有数据流就进行处理&#xff0c;无数据流就不…

Android MVI架构的深入解析与对比

什么是MVI&#xff1f; M&#xff1a;model&#xff0c;此处的model并不是传统的数据模块&#xff0c;它是指用来存储视图状态UI State的一个模块 。比如请求数据时的loading、请求失败的提示页面等UI层面的变化状态。 V&#xff1a;view&#xff0c;视图模块 I&#xff1a;…

MongoDB设置密码

关于为什么要设置密码 公司的测试服务器MongoDB服务对外网开放的&#xff0c;结果这几天发现数据库被每天晚上被人清空的了&#xff0c;还新建了个数据库&#xff0c;说是要支付比特币。查了日志看到有个境外的IP登录且删除了所有的集合。所以为了安全起见&#xff0c;我们给m…