Spring-Security权限实例

基于springBoot项目

引入依赖配置文件

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

快速上手

不连接数据库

1.创建用户实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserTest {private String username;private String password;
}

2.Controller层(测试权限)

@RestController
@RequestMapping("/test")
public class MyController {@GetMappingpublic String test01() {return "hello security!!!";}
}
@RestController
public class SuccessController {@GetMapping("success")public String test02() {return "success";}@Secured({"ROLE_ADMIN"})@RequestMapping("testSecured")public String test03() {return  "testSecured";}@PreAuthorize("hasAnyAuthority('testpath')")@RequestMapping("")public String test04() {return "testSecured02";}
}

3.security配置文件 

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {
//        配置登录的form表单
//        路径前面必须加/http.formLogin().loginPage("/login.html").loginProcessingUrl("/userlogin").usernameParameter("myname").passwordParameter("mypwd").defaultSuccessUrl("/success");http.authorizeRequests().antMatchers("/login.html","/userlogin","/").permitAll();// 其他的路径  都需要认证http.authorizeRequests().anyRequest().authenticated();
//          权限不允许的时候http.exceptionHandling().accessDeniedPage("/403.html");//  csrf  方便html 文件  能够通过http.csrf().disable();}@Resourceprivate UserDetailsService userDetailsService;@Beanpublic PasswordEncoder getPassword() {return new BCryptPasswordEncoder();}//    自定义用户的信息@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(getPassword());}
}

4.service逻辑代码

@Service
public class MyUserDetailService implements UserDetailsService {//    根据用户的名字 加载用户的信息@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//        username 代表前端传递过来的名字BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();String encode = passwordEncoder.encode("root");UserTest userTest = new UserTest("root", encode);if(username.equals(userTest.getUsername())) {List<SimpleGrantedAuthority> authorities = new ArrayList<>();
//            authorities 代表所有资源的信息authorities.add(new SimpleGrantedAuthority("testpath"));authorities.add(new SimpleGrantedAuthority("ROLE_USER"));return new User(username,encode,authorities);}return null;}
}

连接数据库(权限实例)

sql文件顶部资源下载

1.引入相关依赖

        <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!-- mp--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3</version></dependency><!-- 自动生成--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3</version></dependency><!-- 模板--><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId></dependency>

2.通过mybatis-plus快速生成代码

public class MyTest {public static void main(String[] args) {FastAutoGenerator.create("jdbc:mysql:///test01?useSSL=false","root","root")// 全局配置.globalConfig((scanner, builder) -> builder.author("hp").outputDir("D:\\Idea-spring-security\\demo01\\src\\main\\java"))// 包配置.packageConfig((scanner, builder) ->builder.parent("com.security").pathInfo(Collections.singletonMap(OutputFile.xml, "D:\\Idea-spring-security\\demo01\\src\\main\\resources\\mapper")))// 策略配置.strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all"))).controllerBuilder().enableRestStyle().enableHyphenStyle().entityBuilder().enableLombok().addTableFills(new Column("create_time", FieldFill.INSERT)).build())/*模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker.templateEngine(new BeetlTemplateEngine()).templateEngine(new FreemarkerTemplateEngine())*/.execute();// 处理 all 情况}protected static List<String> getTables(String tables) {return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));}
}

3.application 文件

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:///test01?serverTimezone=UTCpassword: rootusername: rootjackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8serialization:write-date-keys-as-timestamps: falsemvc:pathmatch:matching-strategy: ant_path_matchermybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:/mapper/*.xmlglobal-config:db-config:logic-not-delete-value: 1logic-delete-value: 0type-aliases-package: com.security.entity

4.TabMenuMapper.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.security.mapper.TabMenuMapper"><select id="selectCodeByRids" resultType="TabMenu">select *from tab_menuwhere id in(select midfrom tab_role_menuwhere rid in<foreach collection="list" item="rid" open="(" close=")" separator=",">#{rid}</foreach>)</select>
</mapper>

5.TabMenuMapper

public interface TabMenuMapper extends BaseMapper<TabMenu> {List<TabMenu> selectCodeByRids(List<Integer> rids);
}

6.修改service文件

@Service
public class MyUserDetailService implements UserDetailsService {@Resourceprivate TabUserMapper userMapper;@Resourceprivate TabUserRoleMapper userRoleMapper;@Resourceprivate TabRoleMapper roleMapper;@Resourceprivate TabMenuMapper menuMapper;//    根据用户的名字 加载用户的信息@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//        username 代表前端传递过来的名字
//        根据名字去数据库查询一下有没有这个用户的信息QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.eq("username",username);TabUser tabUser = userMapper.selectOne(queryWrapper);if(tabUser != null) {
//            有值 查询用户对应的角色的idQueryWrapper queryWrapper1 = new QueryWrapper();queryWrapper1.eq("uid",tabUser.getId());List<TabUserRole> tabUserRoles = userRoleMapper.selectList(queryWrapper1);List<Integer> rids = tabUserRoles.stream().map(tabUserRole -> tabUserRole.getRid()).collect(Collectors.toList());
//            根据角色的id 查询rcodeList<TabRole> tabRoles = roleMapper.selectBatchIds(rids);
//            角色的修信息 角色管理 修改角色的名字List<SimpleGrantedAuthority> collect = tabRoles.stream().map(tabRole -> new SimpleGrantedAuthority("ROLE_" + tabRole.getRcode())).collect(Collectors.toList());
//            根据角色的id 查询菜单的mcodeList<TabMenu> menus = menuMapper.selectCodeByRids(rids);List<SimpleGrantedAuthority> resources = menus.stream().map(tabMenu -> new SimpleGrantedAuthority(tabMenu.getMcode())).collect(Collectors.toList());
//            将角色的所有信息,和资源信息合并在一起List<SimpleGrantedAuthority> allresource = Stream.concat(collect.stream(), resources.stream()).collect(Collectors.toList());return new User(username, tabUser.getPassword(), allresource);}return null;}
}

7.获取用户的信息

/*
* 获取当前登录的用户的信息
* */
@RestController
public class UserController {@GetMapping("user1")@PreAuthorize("hasAnyAuthority('user:add')")public Object getUser(Principal principal) {return principal;}@GetMapping("user2")public Object getUser2(Authentication authentication){return authentication;}@GetMapping("user3")public Object getUser3() {Authentication authentication = SecurityContextHolder.getContext().getAuthentication();return authentication;}
}

调试接口进行测试

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

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

相关文章

伦敦金冬令时开市时间怎样调整

在刚刚过去的一周&#xff0c;欧美的金融市场已经正式进入了冬令时&#xff0c;这对伦敦金市场的交易时间也产生了影响。由于美国于今年11月5日(星期日&#xff09;开始正式实施冬令时间&#xff0c;所以香港的伦敦金平台的交易时间也随之而有所调整。 从今年11月6日开始&#…

增强地理热图:Highcharts Maps v11.2.0 Crack

Highcharts Maps v11.2.0 添加了对地理热图插值的支持&#xff0c;允许您在类似温度图的图表的已知数据点之间添加估计值。 Highcharts Maps 提供了一种符合标准的方法&#xff0c;用于在基于 Web 的项目中创建逻辑示意图。它扩展了用户友好的 Highcharts JavaScript API&#…

Milvus Cloud——什么是 Agent?

什么是 Agent? 根据 OpenAI 科学家 Lilian Weng 的一张 Agent 示意图 [1] 我们可以了解 Agent 由一些组件来组成。 规划模块 子目标分解:Agent 将目标分为更小的、易于管理的子目标,从而更高效地处理复杂的任务。 反省和调整:Agent 可以对过去的行为进行自我批评和自我反思…

pyOCD

pyOCD 目录结构

Linux的目录的权限

目录 目录的权限 目录的权限 1、可执行权限: 如果目录没有可执行权限, 则无法cd到目录中. 2、可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容. 3、可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件. 上面三个权限是…

微信小程序前端开发

目录 前言&#xff1a; 1. 框架选择和项目搭建 2. 小程序页面开发 3. 数据通信和接口调用 4. 性能优化和调试技巧 5. 小程序发布和上线 前言&#xff1a; 当谈到微信小程序前端开发时&#xff0c;我们指的是使用微信小程序框架进行开发的一种方式。在本文中&#xff0c;我…

划分VOC数据集,以及转换为划分后的COCO数据集格式

1.VOC数据集 LabelImg是一款广泛应用于图像标注的开源工具&#xff0c;主要用于构建目标检测模型所需的数据集。Visual Object Classes&#xff08;VOC&#xff09;数据集作为一种常见的目标检测数据集&#xff0c;通过labelimg工具在图像中标注边界框和类别标签&#xff0c;为…

Mac M2开发环境安装

持续更新 brew 安装 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"JAVA多版本环境 ## 终端下载安装 brew install --cask temurin8 brew install --cask temurin11 brew install --cask temurin17## vim ~/.…

GPU架构与计算入门指南

1比较CPU与GPU 首先&#xff0c;我们会比较CPU和GPU&#xff0c;这能帮助我们更好地了解GPU的发展状况&#xff0c;但这应该作为一个独立的主题&#xff0c;因为我们难以在一节中涵盖其所有的内容。因此&#xff0c;我们将着重介绍一些关键点。 CPU和GPU的主要区别在于它们的…

AIGC视频生成/编辑技术调研报告

人物AIGC&#xff1a;FaceChain人物写真生成工业级开源项目&#xff0c;欢迎上github体验。 简介&#xff1a; 随着图像生成领域的研究飞速发展&#xff0c;基于diffusion的生成式模型取得效果上的大突破。在图像生成/编辑产品大爆发的今天&#xff0c;视频生成/编辑技术也引起…

vscode 无法激活conda虚拟环境

vscode 无法激活conda虚拟环境 今天装odoo17的过程中&#xff0c;指定了conda虚拟环境&#xff0c;打开终端的时候无法激活 PS C:\Users\Administrator> conda activate py311 usage: conda-script.py [-h] [--no-plugins] [-V] COMMAND ... conda-script.py: error: argu…

Milvus Cloud——LLM Agent 现阶段出现的问题

LLM Agent 现阶段出现的问题 由于一些 LLM&#xff08;GPT-4&#xff09;带来了惊人的自然语言理解和生成能力&#xff0c;并且能处理非常复杂的任务&#xff0c;一度让 LLM Agent 成为满足人们对科幻电影所有憧憬的最终答案。但是在实际使用过程中&#xff0c;大家逐渐发现了通…

conda环境中pytorch1.2.0版本安装包安装一直失败解决办法!!!

conda环境中pytorch1.2.0版本安装包安装一直失败解决办法 cuda10.0以及cudnn7.4现在以及安装完成&#xff0c;就差torch的安装了&#xff0c;现在torch我要装的是1.2.0版本的&#xff0c;安装包以及下载好了&#xff0c;安装包都是在这个网站里下载的&#xff08;点此进入&…

什么是 CSRF 攻击?如何防止 CSRF 攻击?

CSRF&#xff08;Cross-Site Request Forgery&#xff0c;跨站请求伪造&#xff09;是一种常见的网络安全攻击方式&#xff0c;攻击者利用用户已经通过认证的身份在受信任网站上执行未经用户授权的操作。 CSRF 攻击的一般过程如下&#xff1a; 用户登录受信任网站 A&#xff…

Kali常用配置(持续更新)

1. 同步系统时间 命令&#xff1a;dpkg-reconfigure tzdata &#xff0c;这个命令可以同时更新系统时间和硬件时间。 然后选择区域和城市&#xff0c;中国可以先选择Asia&#xff0c;然后选择Shanghai 2.更换系统数据源 # vim /etc/apt/sources.list #不是root用户的话需要…

Linux学习-破解Root密码

破解root密码思路 1&#xff09;重启系统,进入 救援模式 开启虚拟机A&#xff0c;在此界面按e键 在linux开头的该行&#xff0c;将此行的ro修改为rw 然后空格输入 rd.break 按 ctrl x 启动&#xff0c;会看到switch_root:/# 2&#xff09;切换到硬盘操作系统环境 # chroot …

ChatGPT和API发生重大中断!

11月9日凌晨&#xff0c;OpenAI在官网发布&#xff0c;ChatGPT和API发生重大中断&#xff0c;导致全球所有用户无法正常使用&#xff0c;宕机时间超过2小时。 目前&#xff0c;OpenAI已经找到问题所在并进行了修复&#xff0c;但仍然不稳定&#xff0c;会继续进行安全监控。 …

asp.net core mvc之 视图

一、在控制器中找到匹配视图&#xff0c;然后渲染成 HTML 代码返回给用户 public class HomeController : Controller {public IActionResult Index(){return View(); //默认找 Views/Home/Index.cshtml &#xff0c;呈现给用户} &#xff5d; 二、指定视图 1、控制器 publ…

QML10、QML 和 C++ 集成概述

概述 - QML 和 C++ 集成 QML 旨在通过 C++ 代码轻松扩展。 Qt QML 模块中的类允许从 C++ 加载和操作 QML 对象,并且 QML 引擎与 Qt 元对象系统集成的特性使 C++ 功能可以直接从 QML 调用。 这允许开发使用 QML、JavaScript 和 C++ 代码混合实现的混合应用程序。 集成 QML 和 C…

『 Linux 』进程概念

文章目录 &#x1f5de;️ 冯诺依曼体系结构 &#x1f5de;️&#x1f4c3; 为什么在计算机当中需要使用内存充当中间介质而不使CUP与外设直接进行交互?&#x1f4c3; CPU如何读取数据 &#x1f5de;️ 操作系统(Operating system) &#x1f5de;️&#x1f4c3; 操作系统如何…