Spring Security- 基于角色的访问控制

基于角色 或权限 进行访问控制

hasAuthority方法

如果当前的主体具有指定的权限,则返回true,否则返回false

修改配置类
  //当前登录用户 只有具备admins权限才可以访问这个路径.antMatchers("/test/index").hasAuthority("admins")

代码如下:

 package com.config;​import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;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.WebSecurityConfigurerAdapter;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.security.crypto.password.PasswordEncoder;​@Configuration    //配置类public class SecurityConfig extends WebSecurityConfigurerAdapter {​@AutowiredUserDetailsService userDetailsService;​​@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@BeanPasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}​@Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin().loginPage("/login.html")   // 自定义登录页面.loginProcessingUrl("/user/login")     //登录访问路径.defaultSuccessUrl("/test/index").permitAll()      //登录成功后 跳转路径.and().authorizeRequests().antMatchers("/","/user/login","/test/add").permitAll() //设置哪些路径可以不认证 直接访问//当前登录用户 只有具备admins权限才可以访问这个路径.antMatchers("/test/index").hasAuthority("admins").and().csrf().disable() ; // 关闭csrf的防护}}
修改 UserDetailsService, 把 返回的对象 设置权限

代码如下:

 
package com.service;​import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.entity.UserInfo;import com.mapper.UserInfoMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.core.GrantedAuthority;import org.springframework.security.core.authority.AuthorityUtils;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.core.userdetails.UsernameNotFoundException;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.stereotype.Service;​import java.util.ArrayList;import java.util.List;​@Service("userDetailsService")public class MyUserDetailsService implements UserDetailsService {​@Autowiredprivate UserInfoMapper userInfoMapper;​​​@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {​//根据用户名 查询QueryWrapper<UserInfo> wrapper=new QueryWrapper<>();wrapper.eq("name",username);   //查询 name列 的值 为 username的 数据UserInfo info = userInfoMapper.selectOne(wrapper);//判断if(info==null){   //没有用户 验证失败throw new UsernameNotFoundException("用户名不存在");}​List<GrantedAuthority> list = AuthorityUtils.commaSeparatedStringToAuthorityList("admins");  //这里与配置类一致//返回数据库的用户名及密码return new User(info.getName(), new BCryptPasswordEncoder().encode(info.getPwd()),list);}}

启动测试: 输入正确的用户名及密码, 当前返回的用户 具有admins 权限, 因此可以看到 hello index

接下来 将 上面UserDetailsService的 权限 由 admins改为其他 , 还是输入 正确的用户名及密码则There was an unexpected error (type=Forbidden, status=403).

hasAnyAuthority方法

如果当前的主体由任何提供的角色的话 返回true

修改配置类

具备 admins 或 abc 的 都可以 访问 /test/index

修改UserDetailsService

启动测试:

输入正确的用户名及密码 : 看到 hello index

hasRole

如果用户具备给定角色就允许访问 否则出现403

如果当前主体具有指定的角色则返回true

修改配置类

 package com.config;​import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;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.WebSecurityConfigurerAdapter;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.security.crypto.password.PasswordEncoder;​@Configuration    //配置类public class SecurityConfig extends WebSecurityConfigurerAdapter {​@AutowiredUserDetailsService userDetailsService;​​@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@BeanPasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}​@Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin().loginPage("/login.html")   // 自定义登录页面.loginProcessingUrl("/user/login")     //登录访问路径.defaultSuccessUrl("/test/index").permitAll()      //登录成功后 跳转路径.and().authorizeRequests()//       /user/login","/test/add" 面允许任意访问.antMatchers("/","/user/login","/test/add").permitAll() //设置哪些路径可以不认证 直接访问//当前登录用户 只有具备admins权限才可以访问这个路径//.antMatchers("/test/index").hasAnyAuthority("admins","abc").antMatchers("/test/index").hasRole("sale").anyRequest().permitAll().and().csrf().disable() ; // 关闭csrf的防护}}
修改UserDetailsService

注意 配置类 写 sale , 这里需要增加前缀 ROLE_

 List<GrantedAuthority> list = AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_sale");

启动 访问 输入正确 用户名 /密码 看到 hello index

hasAnyRole

表示用户具备任何一个条件都可以访问

修改配置类
 .antMatchers("/test/index").hasAnyRole("sale","p2")
修改UserDetailsService
 List<GrantedAuthority> list = AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_p2");

启动访问 ,输入正确用户名/密码 可以看到 页面 hello index

自定义403页面

在static 下 建立 403.html

 <h1>未授权</h1>

在配置类进行配置:

 //配置没有权限访问跳转的页面
 http.exceptionHandling().accessDeniedPage("/403.html");

完整代码

 package com.config;​import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;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.WebSecurityConfigurerAdapter;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.security.crypto.password.PasswordEncoder;​@Configuration    //配置类public class SecurityConfig extends WebSecurityConfigurerAdapter {​@AutowiredUserDetailsService userDetailsService;​​@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@BeanPasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}​@Overrideprotected void configure(HttpSecurity http) throws Exception {​//配置没有权限访问跳转的页面http.exceptionHandling().accessDeniedPage("/403.html");​http.formLogin().loginPage("/login.html")   // 自定义登录页面.loginProcessingUrl("/user/login")     //登录访问路径.defaultSuccessUrl("/test/index").permitAll()      //登录成功后 跳转路径.and().authorizeRequests()//       /user/login","/test/add" 面允许任意访问.antMatchers("/","/user/login","/test/add").permitAll() //设置哪些路径可以不认证 直接访问//当前登录用户 只有具备admins权限才可以访问这个路径//.antMatchers("/test/index").hasAnyAuthority("admins","abc")//.antMatchers("/test/index").hasRole("sale").antMatchers("/test/index").hasAnyRole("sale","p2").anyRequest().permitAll().and().csrf().disable() ; // 关闭csrf的防护}}

修改 代码 让 其 没有权限 ,输入正确的用户名与密码

4注解方式

@secured

判断是否具有角色,另外需要注意的是这里匹配的字符串需要添加前缀 “ROLE"

使用注解先要开启注解功能!,

@EnableGlobalMethodSecurity(securedEnabled=true)

修改启动类或配置类 开启注解

选择 启动类

 @SpringBootApplication@MapperScan(basePackages = "com.mapper")@EnableGlobalMethodSecurity(securedEnabled = true)public class SSApp {public static void main(String[] args) {SpringApplication.run(SSApp.class,args);}}

在controller 方法上 使用注解 ,设置 角色

 
package com.controller;​import org.springframework.security.access.annotation.Secured;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;​@RestController@RequestMapping("/test")public class TestController {​@GetMapping("/index")public String index(){return "hello index";}​​@GetMapping("/add")public String add(){return "hello security";}​​​@GetMapping("/update") @Secured({"ROLE_sale","ROLE_manager"})    ---- 注解访问 ,需要在启动类 开启注解  ,注意前缀public String update(){return "hello update";}​​}

在UserDetailsService 中 配置角色

 List<GrantedAuthority> list = AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_sale");

启动 测试: 地址栏 输入 localhost:8080/test/update

然后输入 正确的用户名/密码 , 然后看到页面

@PreAuthorize

先开启注解功能

@EnableGlobalMethodSecurity(prePostEnabled = true)

@PreAuthorize:注解适合进入方法前的权限验证

@PreAuthorize可以将登录用户的roles/permissions参数传到方法中。。

使用方式:

在启动类开启注解

 @SpringBootApplication@MapperScan(basePackages = "com.mapper")@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled=true)public class SSApp {public static void main(String[] args) {SpringApplication.run(SSApp.class,args);}}

在controller方法上添加注解

 @GetMapping("/update")//@Secured({"ROLE_sale","ROLE_manager"})@PreAuthorize("hasAnyAuthority('admins','abc')")public String update(){return "hello update";}

在UserDetailsService 中 配置角色或权限

 List<GrantedAuthority> list = AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_sale");

启动测试:

@PostAuthorize

先开启注解功能

@EnableGlobalMethodSecurity(prePostEnabled = true)

@PostAuthorize 注解使用并不多, 在方法执行后进行权限验证,适合验证带有返回值的权限

开启注解

 
@SpringBootApplication@MapperScan(basePackages = "com.mapper")@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled=true)public class SSApp {public static void main(String[] args) {SpringApplication.run(SSApp.class,args);}}

编写controller , 判断是否 具备 'admins','ROLE_abc'

 @GetMapping("/update")//@Secured({"ROLE_sale","ROLE_manager"})//@PreAuthorize("hasAnyAuthority('admins','abc')")@PostAuthorize("hasAnyAuthority('admins','abc')")public String update(){System.out.println("update.......");return "hello update";}

修改UserDetailsService , 让其拥有 admin 与 上面的 admins 不同

 List<GrantedAuthority> list = AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_sale");

启动测试 ,输入正确的用户名及密码 , 发现 具备admin 但没有 admins 权限, 控制台会打印 update.... ,然后显示 跳转到未授权页面403.html

@PostFilter 对返回数据做过滤

@PostFilter:权限验证之后对数据进行过滤,留下用户名是admin1的数据.

表达式中的 filterObject 引用的是方法返回值List中的某一个元素-

@PreFilter 对传入参数做过滤

@PreFilter 进入控制器之前对数据进行过滤

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

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

相关文章

transbigdata笔记:栅格参数优化

在transbigdata中&#xff0c;栅格参数有如下几个 params(lonStart,latStart,deltaLon,deltaLat,theta) 如何选择合适的栅格参数是很重要的事情&#xff0c;这会对最终的分析结果产生很大的影响。 怎么选择参数&#xff0c;和数据以及分析的目的息息相关&#xff0c;transbi…

【驱动】TI AM437x(内核调试-06):网卡(PHY和MAC)、七层OSI

1、网络基础知识 1.1 七层OSI 第一层:物理层。 1)需求: 两个电脑之间如何进行通信? 具体就是一台发比特流,另一台能够收到。于是就有了物理层:主要是定义设备标准,如网线的额接口类型、管线的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流,就是从1/0…

Spring IOC 之加载 BeanDefinition

1、前言 前面的文章我们已经对IOC之Spring统一资源加载策略有了一定的了解&#xff0c;本文我们将探讨Spring IOC 加载 BeanDefinition的整个过程。 我们先先看一段熟悉的代码&#xff1a; ClassPathResource resource new ClassPathResource("bean.xml"); // &l…

USB8814动态信号采集卡——声音振动类信号处理的理想之选!

背景介绍&#xff1a; 科技的发展在一定程度上依赖于对信号的处理&#xff0c;信号处理技术的先进性在很大程度上决定了科技发展的速度和方向。数字信号处理技术的崛起&#xff0c;彻底改变了传统的信息与信号处理方式&#xff0c;使得数据采集这一前期工作在数字系统中发挥着…

Oracle-java下载、开源/商业许可证(收费、免费说明)、版本发布日志

Oracle-java下载、开源/商业许可证&#xff08;收费、免费说明&#xff09;、版本发布日志 下载开源/商业许可证&#xff08;收费、免费说明&#xff09;java8版本发布日志以上是一般情况&#xff0c;具体的以官网发布信息为准例如&#xff1a; JDK17某些特定版本是免费的&…

极狐GitLab 线下『 DevOps专家训练营』成都站开班在即

成都机器人创新中心联合极狐(GitLab)隆重推出极狐GitLab DevOps系列认证培训课程。该课程主要面向使用极狐GitLab的DevOps工程师、安全审计人员、系统运维工程师、系统管理员、项目经理或项目管理人员&#xff0c;完成该课程后&#xff0c;学员将达到DevOps的专家级水平&#x…

【JVM调优系列】如何导出堆内存文件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【Docker构建MySQL8.0镜像】

Docker构建MySQL8.0镜像 部署流程1. 拉取docker镜像2. 创建数据卷&#xff0c;存放MySQL数据3. 启动MySQL镜像4. 初始化sql放入MySQL镜像5. 执行MySQL脚本6. MySQL镜像打包7. MySQL镜像迁移 部署流程 1. 拉取docker镜像 docker pull mysql:8.0.35拉取成功后就可以看到镜像了&…

windows项目部署

目录 一、jdk安装&配置 配置jdk的环境配置 二、Tomcat安装 三、MySQL的安装 3.1 Navicat Premium 12 测试连接 3.2 外部访问MySQL测试连接 四、部署项目 4.1 修改mysql的用户密码 一、jdk安装&配置 1.1 双击jdk&#xff0c;进行一个傻瓜式安装 1.2 安装成功…

Linux CentOS 7.6安装nginx详细保姆级教程

一、通过wget下载nginx压缩包 1、进入home文件并创建nginx文件夹用来存放nginx压缩包 cd /home //进入home文件夹 mkdir nginx //创建nginx文件夹 cd nginx //进入nginx文件夹2、下载nginx,我这里下载的是Nginx 1.24.0版本&#xff0c;如果要下载新版本可以去官网进行下载:…

vs2022配置OpenCV测试

1&#xff0c;下载Opencv安装包 OpenCV官网下载地址&#xff1a;Releases - OpenCV 大家可以按需选择版本进行下载&#xff0c;官网下载速度还是比较慢的&#xff0c;推荐大家使用迅雷进行下载 下载安装包到自定义文件夹下 双击安装 按以下图示进行安装 2、 添加环境变量 打…

DWM1000 MAC层

DWM1000 MAC层 MAC层 概述 MAC层&#xff0c;即媒体访问控制层&#xff0c;是数据通信协议栈中的一个重要部分&#xff0c;位于链路层的下半部分&#xff0c;紧邻物理层。在OSI模型中&#xff0c;它属于第二层&#xff0c;即数据链路层的一部分。MAC层的主要职责是控制如何在…

【ArcGIS遇上Python】ArcGIS Python批量筛选多个shp中指定字段值的图斑(以土地利用数据为例)

文章目录 一、案例分析二、提取效果二、代码运行效果三、Python代码四、数据及代码下载一、案例分析 以土地利用数据为例,提取多个shp数据中的旱地。 二、提取效果 原始土地利用数据: 属性表: 提取的旱地:(以图层名称+地类名称命名)

python 爬虫 生成markdown文档

本文介绍的案例为使用python爬取网页内容并生成markdown文档&#xff0c;首先需要确定你所需要爬取的框架结构&#xff0c;根据网页写出对应的爬取代码 1.分析总网页的结构 我选用的是redis.net.com/order/xxx.html (如:Redis Setnx 命令_只有在 key 不存在时设置 key 的值。…

SpringMVC 文件上传和下载

文章目录 1、文件下载2、文件上传3. 应用 Spring MVC 提供了简单而强大的文件上传和下载功能。 下面是对两者的简要介绍&#xff1a; 文件上传&#xff1a; 在Spring MVC中进行文件上传的步骤如下&#xff1a; 在表单中设置 enctype“multipart/form-data”&#xff0c;这样…

大模型学习与实践笔记(六)

一、finetune 简介 两种微调模式&#xff1a;增量预训练 与指令跟随 1.增量预训练 2.指令微调 二、LoRA 与 QLoRA 介绍 三、XTuner 介绍 四、低显存玩转LLM的方法

这是一篇优雅的Springboot2.0使用手册

这是一篇优雅的Springboot2.0使用手册 最近再研究springboot的原理&#x1f60b;颇有收获&#xff0c;现在让我分享一下springboot如何使用吧~ 啥是Springboot 和书上理解的不同&#xff0c;我认为Springboot是一个优秀的快速搭建框架&#xff0c;他通过maven继承方式添加依…

最佳实践分享:SQL性能调优

SQL性能调优是一个需要不断探索和实践的过程&#xff0c;旨在确保数据库查询的高效运行。本文将分享一些SQL性能调优的最佳实践&#xff0c;帮助您提升数据库性能&#xff0c;减少查询响应时间。 一、索引优化 索引是提高查询性能的关键。以下是一些关于索引优化的建议&#…

<软考高项备考>《论文专题 - 71 风险管理(3)》

3 过程2-识别风险 3.1 问题 4W1H过程做什么是识别单个项目风险以及整体项目风险的来源&#xff0c;并记录风险特征的过程。作用:1、记录现有的单个项目风险&#xff0c;以及整体项目风险的来源:2、汇总相关信息&#xff0c;以便项目团队能够恰当地应对已识别的风险。为什么做…

数据结构之bool类

bool类 bool 是布尔类。它是最简单的一个类&#xff0c;其取值有两种&#xff0c;1和O&#xff0c;即 True 和 False。可以这样简单地理解&#xff0c;除了1和0以及 True 和 False 的情况之外&#xff0c;但凡有值&#xff08;非空&#xff09;即为真&#xff0c;但凡无值&…