SpringSecurity学习

news2024/11/24 2:24:43

b1ccdd01dd564e608c6a1334b977b52a.png

1.认证

密码校验用户

847c2bc6bc9541e5875dbd76be1ddcc9.png

密码加密存储

3323a83e8b4642fc8c25e5187e68600d.png

 

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

}
  • 我们没有这个配置,默认明文存储, {id}password;
  • 实现这个,就变成加密存储: 加盐值 + 明文随机生成一段密文
  • 将返回UserDetails对象中的密码,与输入的密码进行校验

登录接口

57032ebc36f34a6187075a9d90f763d0.png

  • 在SpringSecurity放行登录接口,
  • 定义AuthenticationManager @bean 
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                //关闭csrf
                .csrf().disable()
                //不通过Session获取SecurityContext
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                // 对于登录接口 允许匿名访问
                .antMatchers("/user/login").anonymous()
                // 除上面外的所有请求全部需要鉴权认证
                .anyRequest().authenticated();
    }


    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

}

PS:就我们研究框架, 有些值,需要我们利用断点调试,层层拨开来进行获取。

1e66f583198b4f028d91960aa702163e.png

 

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private RedisCache redisCache;

    @Override
    public ResponseResult login(UserDTO userDTO) {
        //  AuthenticationManager authenticationManager 进行认证
        UsernamePasswordAuthenticationToken authenticationToken = 
                new UsernamePasswordAuthenticationToken(userDTO.getUsername(), userDTO.getPassword());
        Authentication authenticate = authenticationManager.authenticate(authenticationToken);
        // 如果认证通过、给出对应提示
        if(Objects.isNull(authenticate)){
            throw new RuntimeException("登录失败");
        }
        // 认证通过使用userid生成jwt
        LoginUser loginUser = (LoginUser) authenticate.getPrincipal();
        String userId = loginUser.getUser().getId().toString();
        String token = JwtUtil.createJWT(userId);
        HashMap<String, String> map = new HashMap<>();
        map.put("token",token);
        // 把完整用户信息存入redis
        redisCache.setCacheObject("login:"+userId,loginUser);
        return new ResponseResult(200,"登录成功",map);
    }
}

认证过滤器

1011c8d13f8d4292bca160578402202d.png

我觉得下面配置,是配合前端适用的;

  • 登录、请求等..页面,前端路由拦截器之类不需要拦截(没有token),那么页面相关请求,jwt过滤器是不需要拦截的。
  • 首页等页面,需要token,那么必须是登录之后,拥有token,才能访问吧?访问页面,会携带token发送请求,访问资源。
@Component
public class JwtFilter extends OncePerRequestFilter {
    @Autowired
    private RedisCache redisCache;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        //获取token
        String token = request.getHeader("Authorization").substring(6);
        if(StringUtils.isEmpty(token)){
            filterChain.doFilter(request,response);
            return;
        }

        //解析token
        String userid;
        try {
            Claims claims = JwtUtil.parseJWT(token);
            userid = claims.getSubject();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("token非法");
        }
        //从redis中获取用户信息
        String redisKey = "login:" + userid;
        LoginUser loginUser = redisCache.getCacheObject(redisKey);
        if(Objects.isNull(loginUser)){
            throw new RuntimeException("用户未登录");
        }
        //存入SecurityContextHolder
        //TODO 获取权限信息封装到Authentication中
        UsernamePasswordAuthenticationToken authenticationToken =
                new UsernamePasswordAuthenticationToken(loginUser,null,loginUser.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authenticationToken);
        //放行
        filterChain.doFilter(request, response);

    }
}
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtFilter jwtAuthenticationTokenFilter;

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                //关闭csrf
                .csrf().disable()
                //不通过Session获取SecurityContext
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                // 对于登录接口 允许匿名访问
                .antMatchers("/user/login").anonymous()
                // 除上面外的所有请求全部需要鉴权认证
                .anyRequest().authenticated();

        //把token校验过滤器添加到过滤器链中,就是在 UsernamePasswordAuthenticationFilter之前
        http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
    }


    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

}

 

 

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

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

相关文章

html 学习 之 文本标签

下面是一些常见的HTML文本标签&#xff08;&#xff0c;&#xff0c;&#xff0c;&#xff0c;和&#xff09;以及它们的作用&#xff1a; 标签 (Emphasis - 强调): 作用&#xff1a;用于在文本中表示强调或重要性。 示例&#xff1a; <p>这是一段文本&#xff0c;&l…

python将dataframe按需绘制折线图、柱状图、双坐标图

目录 绘制TI折线图绘制 import matplotlib.pyplot as plt# 设置中文显示 plt.rcParams[font.sans-serif] [SimHei] # 指定默认字体 plt.rcParams[axes.unicode_minus] False # 解决负号显示问题绘制TI折线图 def draw_TI(df_TI_night, output_TI_png, sector_id, terrain, …

代码随想录算法训练营第五十九天| 503.下一个更大元素II,42. 接雨水

代码随想录算法训练营第五十九天| 503.下一个更大元素II&#xff0c;42. 接雨水 503.下一个更大元素II42. 接雨水暴力解法双指针优化单调栈解法 503.下一个更大元素II 题目链接 视频讲解 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &a…

腾讯云优惠券:定义、领取方法及使用教程

腾讯云作为国内知名的云计算服务提供商&#xff0c;经常为用户提供各种优惠活动&#xff0c;本文将详细介绍腾讯云优惠券的定义、领取方法及使用教程&#xff0c;助力大家轻松上云&#xff01; 一、腾讯云优惠券定义介绍 腾讯云优惠券是什么&#xff1f;腾讯云优惠券是腾讯云推…

谈一谈对string容器的赋值重载的更深一步理解

先来看一看我写的string容器&#xff08;包含了基本的构造&#xff0c;析构&#xff0c;赋值&#xff0c;拷贝&#xff09;。 class String { public://构造/*explicit*/ String(const char* arr "") {assert(arr);//判别不会传入空指针cout << "String…

markdown pdf报错问题

vscode的md文件转pdf的插件 右键可以直接转换 但是很久没用&#xff0c;现在重新使用出现了报错 ERROR: Failed to download Chromium! If you are behind a proxy, set the http.proxy option to settings.json and restart Visual Studio Code. 解决办法 首…

万字C语言之分支语句和循环语句

前言&#xff1a; &#x1f4d5;作者简介&#xff1a;热爱编程的小七&#xff0c;致力于C、Java、Python等多编程语言&#xff0c;热爱编程和长板的运动少年&#xff01; &#x1f4d8;相关专栏Java基础语法&#xff0c;JavaEE初阶&#xff0c;数据库&#xff0c;数据结构和算法…

OpenCV DNN深度学习简介

&#x1f482; 个人主页:风间琉璃&#x1f91f; 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 前言 本文基本上来自以下官方手册&#xff1a;https://learnopencv.com/deep-l…

9月8日扒面经

慢sql日志的排查和调优 开启慢查询日志&#xff1a;首先需要确保数据库的慢查询日志功能已经开启。在MySQL中&#xff0c;可以通过设置slow_query_log参数为1来开启慢查询日志&#xff0c;并设置long_query_time参数来定义慢查询的阈值。定位慢查询语句&#xff1a;根据慢查询…

.kann勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

引言&#xff1a; 在数字化时代&#xff0c;勒索病毒已经成为了网络安全的严重威胁&#xff0c;其中 .kann 勒索病毒是最新的一种。这种恶意软件通过加密您的数据文件&#xff0c;然后勒索您支付赎金以获取解密密钥。本文将深入探讨 .kann 勒索病毒、如何恢复被它加密的数据文件…

【多线程】Synchronized 用法详解

Synchronized 用法详解 一. synchronized 的特性1. 互斥2. 刷新内存3. 可重入 二. synchronized 的使用1. 直接修饰普通方法2. 修饰静态方法3. 修饰代码块 三. Java 标准库中的线程安全类 synchronized: 又叫监视器锁 monitor lock一. synchronized 的特性 1. 互斥 (保证原子…

SpringBoot整合WebSocket【代码】

系列文章目录 一、SpringBoot连接MySQL数据库实例【tk.mybatis连接mysql数据库】 二、SpringBoot连接Redis与Redisson【代码】 三、SpringBoot整合WebSocket【代码】 文章目录 系列文章目录代码下载地址一、效果演示二、引入依赖三、WebSocketConfig四、SessionWrap五、WebSoc…

这样的接口千万别暴露,小心横向越权。

前言 谈不上是多么厉害的知识&#xff0c;但可能确实有人不清楚或没见过。 我还是分享一下&#xff0c;就当一个小知识点。 如果知道的&#xff0c;就随便逛逛&#xff0c;不知道的&#xff0c;Get到了记得顺手点个赞哈。 正文 1、接口别随便暴露 当一个项目的维护周期拉长的时…

zustand实践与源码阅读

如何管理数据? 日常使用&#xff1a;发布订阅、context、redux… zustand是一个轻量、快速、可扩展的状态管理库。 目前在社区非常流行&#xff0c;现在github上有30K的star。npm包的下载量&#xff0c;现在也仅次于redux&#xff0c;位于mobx之上&#xff0c;并且差距日益扩大…

客户端SDK测试是什么?如何测?

01 是什么 客户端SDK是为第三方开发者提供的软件开发工具包&#xff0c;包括SDK接口、开发文档和Demo示例等。SDK和应用之间是什么关系呢&#xff1f;以云信即时消息服务为例&#xff0c;如下图所示&#xff0c;应用客户端通过调用云信SDK接口&#xff0c;进行消息等数据查询存…

华为云云耀云服务器L实例评测 | 零门槛入门使用教学

近年来&#xff0c;随着企业应用上云&#xff0c;云服务器一直备受用户的关注。特别是对于大多数的中小企业在上云的过程中&#xff0c;都希望能使用的是一种快速、简洁高效的云服务器。因为这样能尽可能地减轻企业运维的成本&#xff0c;同时又能方便企业的信息技术人员管理。…

Set和Map及哈希表介绍

搜索方式介绍TreeMapMap使用 TreeSetSet使用 Set和Map常用方法练习(后面补充)练习之Set/Mapoj练习&#xff08;后面补充&#xff09;哈希表哈希冲突避免冲突-哈希函数设计避免冲突-负载因子调节避免冲突-闭散列避免冲突-开散列 模拟实现哈希表哈希Map源码分析 搜索方式介绍 哈…

mysql的索引分类

索引分类 在 MySQL 数据库&#xff0c;将索引的具体类型主要分为以下几类&#xff1a;主键索引、唯一索引、常规索引、全文索引。 分类 含义 特点 关键字 主键 索引 针对于表中主键创建的索引 默认自动创建 , 只能 有一个 PRIMARY 唯一 索引 避免同一个表中某数据列中…

C语言“牵手”速卖通商品详情数据方法,速卖通商品详情API接口,速卖通API申请指南

速卖通是全球最大的自营式电商企业之一&#xff0c;在线销售计算机、手机及其它数码产品、家电、汽车配件、服装与鞋类、奢侈品、家居与家庭用品、化妆品与其它个人护理用品、食品与营养品、书籍与其它媒体产品、母婴用品与玩具、体育与健身器材以及虚拟商品等。 速卖通平台的…

nginx日志、nginx访问控制、nginx优化

总结 nginx监控 内存&#xff0c;网络&#xff0c;磁盘&#xff0c;cpu 对nginx监控可以监控什么&#xff1f; 1、监控nginx服务存活状况&#xff08;ss -antpl 、systemctl status nginx 、pa aux | grep nginx&#xff09; 2、对nginx的运行状态进行监控 3、 监控nginx的监…