SpringSecurity的编写流程

目录

主要流程: 

具体实现:


 

主要流程: 

(特殊)1、如果你需要返回json格式字符串,那么你首先需要编写相应的处理器,如果不需要则可直接写配置类

2、编写配置类

3、编写认证授权相关的mapper方法和service方法

4、编写认证和授权逻辑

        4.1、编写认证授权逻辑的类,实现UserDetailsService接口,重现loadUserByUserName方法

        提示:不要忘记将该类放入spring容器中,不然security无法使用该逻辑

        4.2、根据用户名查询用户

        4.3、根据用户名查询相关权限

        4.4、将用户的权限集合转换为security的权限集合

        4.5、构建UserDetails对象,放入用户名、密码、security权限集合

        4.6、返回构建好的UserDetails对象

5、编写鉴权配置

6、使用不同权限的用户登录,查看他们是否能访问这些接口

具体实现:

(特殊)1、如果你需要返回json格式字符串,那么你首先需要编写相应的处理器

提示:BaseResult是一个统一返回结果集,这里返回结果只是一个参考,因为我的业务时需要返回json格式字符串,具体处理器如何操作还是看业务

登录成功处理器

//登录成功处理器
public class MyLoginSuccessHandler implements AuthenticationSuccessHandler {@Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {response.setContentType("text/json;charset=utf-8");BaseResult baseResult = new BaseResult(200,"登录成功",null);response.getWriter().write(JSON.toJSONString(baseResult));}
}

登录失败处理器

//登录失败处理器
public class MyLoginFailureHandler implements AuthenticationFailureHandler {@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {response.setContentType("text/json;charset=utf-8");BaseResult baseResult = new BaseResult(402,"用户名或密码错误",null);response.getWriter().write(JSON.toJSONString(baseResult));}
}

注销成功处理器

//登出成功处理器
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {@Overridepublic void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {response.setContentType("text/json;charset=utf-8");BaseResult baseResult = new BaseResult(200,"注销成功",null);response.getWriter().write(JSON.toJSONString(baseResult));}
}

未登录处理器

//未登录处理器
public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint {@Overridepublic void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {response.setContentType("text/json;charset=utf-8");BaseResult baseResult = new BaseResult(401,"用户未登录",null);response.getWriter().write(JSON.toJSONString(baseResult));}
}

权限不足处理器

//权限不足处理器
public class MyAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {response.setContentType("text/json;charset=utf-8");BaseResult baseResult = new BaseResult(403,"权限不足",null);response.getWriter().write(JSON.toJSONString(baseResult));}
}

2、编写配置类

提示1:编写配置类的时候不要忘了PasswordEncoder密码解析器

提示2:登录请求一定要是post请求,否则无法请求无法到达

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {//登录配置http.formLogin().usernameParameter("username")//登录用户名项.passwordParameter("password")//登录密码项.loginProcessingUrl("/admin/login")//登录提交路径.successHandler(new MyLoginSuccessHandler())//登录成功处理器.failureHandler(new MyLoginFailureHandler());//登录失败处理器//权限拦截器配置http.authorizeRequests().antMatchers("/login").permitAll()//登录页面不用拦截.antMatchers("/admin/login").permitAll()//登录路径不用拦截.anyRequest().authenticated();//其他路径都要拦截//注销配置http.logout().logoutUrl("/admin/logout")//注销提交路径.logoutSuccessHandler(new MyLogoutSuccessHandler())//注销成功处理器.invalidateHttpSession(true)//清除session.clearAuthentication(true);//清除认证状态//异常处理http.exceptionHandling().accessDeniedHandler(new MyAccessDeniedHandler())//权限不足处理器.authenticationEntryPoint(new MyAuthenticationEntryPoint());//未登录处理器//关闭csrf防护http.csrf().disable();//开启跨域访问http.cors();}@Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}
}

 

3、编写认证授权相关的mapper方法和service方法,具体跟业务相关

4、编写认证和授权逻辑

编写逻辑的时候需要使用到认证和授权相关的mapper和service,所以我们需要引入service,service中使用了相关mapper

具体流程:

1、编写认证授权逻辑的类,实现UserDetailsService接口,重现loadUserByUserName方法

        提示:不要忘记将该类放入spring容器中,不然security无法使用该逻辑

2、根据用户名查询用户

3、根据用户名查询相关权限

4、将用户的权限集合转换为security的权限集合

(这个Permission.getUrl()很重要,它就是用户拥有的权限所对应的url,后期我们编写鉴权配置的时候就是通过这个url去判断该用户是否有对应权限的

5、构建UserDetails对象,放入用户名、密码、security权限集合

6、返回构建好的UserDetails对象

//认证和授权逻辑
@Service
public class MyUserDetailsService implements UserDetailsService {@DubboReference //需要使用到认证授权相关的mapper和serviceprivate AdminService adminService;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//根据用户名查询用户Admin admin = adminService.findByUserName(username);if(admin == null){throw new UsernameNotFoundException("用户未找到");}//根据用户名查询权限List<Permission> permissions = adminService.findAllPermission(username);//将我的权限集合转为security的权限集合List<GrantedAuthority> grantedAuthorities = new ArrayList<>();for (Permission permission:permissions) {//拿出权限中的url,方便日后的鉴权grantedAuthorities.add(new SimpleGrantedAuthority(permission.getUrl()));}UserDetails userDetails = User.withUsername(admin.getUsername()).password(admin.getPassword()).authorities(grantedAuthorities).build();return userDetails;}
}

5、编写鉴权配置

        1、在启动类上方开启注解配置访问权限

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ShoppingManagerApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShoppingManagerApiApplication.class, args);
    }

}
 

        2、在相关控制器上方添加注解,配置需要有的权限

/**
     * 分页查询管理员
     * @param page 页数
     * @param size 每页条数
     * @return vo
     */
    @PreAuthorize("hasAnyAuthority('/admin/search')")
    @GetMapping("/search")
    public BaseResult<Page<Admin>> search(int page,int size){
        Page<Admin> adminPage = adminService.search(page, size);
        return BaseResult.ok(adminPage);
    }

通过这个注解就会自动判断,当前登录的用户是否有/admin/search权限,这些权限的url都是我们在认证和授权逻辑的时候放入的

6、使用不同权限的用户登录,查看他们是否能访问这些接口

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

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

相关文章

Python进行数据分析(详细教程)

1.为什么选择Python进行数据分析&#xff1f; Python是一门动态的、面向对象的脚本语言&#xff0c;同时也是一门简约&#xff0c;通俗易懂的编程语言。Python入门简单&#xff0c;代码可读性强&#xff0c;一段好的Python代码&#xff0c;阅读起来像是在读一篇外语文章。Pyth…

保护 TDengine 查询性能——3.0 如何大幅降低乱序数据干扰?

在时序数据库&#xff08;Time Series Database&#xff09;场景下&#xff0c;乱序数据的定义为&#xff1a;“时间戳&#xff08;timestamp&#xff09;不按照递增顺序到达数据库的数据。”虽然它的定义很简单&#xff0c;但时序数据库需要有相应的处理逻辑来保证数据存储时的…

JavaScript进阶

一、函数 1.函数 greetWorld(); // Output: Hello, World!function greetWorld() {console.log(Hello, World!); } Another way to define a function is to use a function expression. To define a function inside an expression, we can use the function keyword. In a…

Jenkins搭建最简教程

纠结了一小会儿&#xff0c;到底要不要写这个&#xff0c;最终还是决定简单记录一下&#xff0c;因为Jenkins搭建实在是太简单了&#xff0c;虽然也有坑&#xff0c;但是坑主要在找稳定的版本上。 先学一个简称&#xff0c;LTS (Long Term Support) 属实是长见识了&#xff0c…

docker 搭建jenkins

1、拉取镜像 docker pull jenkins/jenkins:2.4162、创建文件夹 mkdir -p /home/jenkins_mount chmod 777 /home/jenkins_mount3、运行并构建容器 docker run --restartalways -d -p 10240:8080 -p 10241:50000 -v /home/jenkins_mount:/var/jenkins_home -v /etc/localtime:…

如何选择台式还是便携式多参数水质检测仪呢

选择台式还是便携式多参数水质检测仪主要取决于具体的使用需求和场景。 1.便携式多参数水质检测仪适用于需要在不同地点进行水质检测的情况&#xff0c;例如户外采样、实地调查等。它具有小巧轻便的特点&#xff0c;方便携带和操作&#xff0c;适合需要频繁移动或需要灵活使用的…

【LeetCode】152.乘积最大子数组

题目 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位 整数。 子数组 是数组的连续子序列。 示例 1: 输入: nums […

前端框架学习-基础前后端分离

前端知识栈 前端三要素&#xff1a;HTML、CSS、JS HTML 是前端的一个结构层&#xff0c;HTML相当于一个房子的框架&#xff0c;可类比于毛坯房只有一个结构。CSS 是前端的一个样式层&#xff0c;有了CSS的装饰&#xff0c;相当于房子有了装修。JS 是前端的一个行为层&#xff…

如何维护你的电脑:提升性能和延长使用寿命

如何维护你的电脑&#xff1a;提升性能和延长使用寿命 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&…

AWVS 15.6 使用教程

目录 介绍 版本 AWVS具有以下特点和功能&#xff1a; 功能介绍&#xff1a; Dashboard功能&#xff1a; Targets功能&#xff1a; Scans功能&#xff1a; Vulnerabilities功能&#xff1a; Reports功能&#xff1a; Users功能&#xff1a; Scan Profiles功能&#x…

webpack中文文档

基本安装 首先我们创建一个目录&#xff0c;初始化 npm&#xff0c;然后 在本地安装 webpack&#xff0c;接着安装 webpack-cli&#xff08;此工具用于在命令行中运行 webpack&#xff09;&#xff1a; mkdir webpack-demo cd webpack-demo npm init -y npm install webpack …

2023 年牛客多校第四场题解

A Bobo String Construction 题意&#xff1a;给定一个 01 01 01 字符串 t t t&#xff0c;构造一个长度为 n n n 的 01 01 01 串 s s s&#xff0c;使得 t t t 在 c o n c a t ( t , s , t ) {\rm concat}(t, s, t) concat(t,s,t) 中仅出现两次。多测&#xff0c; 1 ≤…

【数据结构】实验十二:图 查找

实验十二 图查找 一、实验目的与要求 1&#xff09;掌握拓扑排序的应用&#xff1b; 2&#xff09;掌握查找的概念和算法&#xff1b; 3&#xff09;掌握查找的基本原理以及各种算法的实现&#xff1b; 4&#xff09;掌握查找的应用。 二、实验内容 1. 用邻接表建立一…

WIZnet W51000S-EVB-PICO 入门教程(一)

概述 W5100S-EVB-Pico是基于树莓派RP2040和全硬件TCP/IP协议栈控制器W5100S的微控制器开发板-基本上与树莓派Pico板相同&#xff0c;但通过W5100S芯片增加了以太网功能。 W5100S-EVB-Pico特点 RP2040规格参数 双核Arm Cortex-M0 133MHz264KB 高速SRAM和2MB板载内存通过…

JAVA基础-多线程入门(详解)

目录 引言 一&#xff0c;线程概念 二&#xff0c;创建线程 2.1&#xff0c;继承Thread类&#xff0c;重写run方法 2.2&#xff0c;实现Runnable接口&#xff0c;重写run方法&#xff0c;实现Runnable接口的实现类的实例对象作为Thread构造函 数的target 2.3&#xff0c;通…

RCU 使用及机制源码的一些分析

》内核新视界文章汇总《 文章目录 1 介绍2 使用方法2.1 经典 RCU2.2 不可抢占RCU2.3 加速版不可抢占RCU2.4 链表操作的RCU版本2.5 slab 缓存支持RCU 3 源码与实现机制的简单分析3.1 数据结构3.2 不可抢占RCU3.3 加速版不可抢占RCU3.4 可抢占RCU3.5 报告禁止状态3.6 宽限期的开…

教雅川学缠论03-分型

原著作者将K线走势分成四中类型&#xff0c;这四中类型&#xff0c;就叫做分型&#xff0c;注意&#xff0c;分型是K线的组合&#xff08;至少3个K线&#xff09;&#xff0c;如下 下面我们以2023年7月武汉控股日K示例 四个分型用图来表示的话&#xff0c;还是很简单的&…

ubuntu安装ros以及安装遇到问题都可以解决

用ros的时候有天手贱&#xff0c;本来ros用的好好的又想着安装个anaconda 玩玩&#xff0c;结果好了&#xff0c;他两不能共存&#xff0c;于是我的ros环境就出问题了。roscore都跑步其来&#xff0c;只能卸载重装了。可卸载重装又出依赖问题了&#xff1a; 错误&#xff1a; …

spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动

spring-framework 版本&#xff1a;v5.3.19 文章目录 整合步骤实现原理ServletContainerInitializer与WebApplicationInitializer父容器的启动子容器的启动 相关面试题 整合步骤 试想这么一个场景。只用 spring mvc&#xff08;确切来说是spring-framework&#xff09;&#x…

Flink集群运行模式--Standalone运行模式

Flink集群运行模式--Standalone运行模式 一、实验目的二、实验内容三、实验原理四、实验环境五、实验步骤5.1 部署模式5.1.1 会话模式&#xff08;Session Mode&#xff09;5.1.2 单作业模式&#xff08;Per-Job Mode&#xff09;5.1.3 应用模式&#xff08;Application Mode&a…