首页 > 其他分享 >云E办后端项目总结

云E办后端项目总结

时间:2023-12-27 18:34:02浏览次数:24  
标签:总结 String 项目 jwt 用户 springframework 办后 org import


 

项目实现的功能:

.登录的验证码功能

.操作员的认证和授权功能

.操作员的对应角色的更新

.部门管理

.员工管理

.菜单管理

.职称管理

登录和授权过程:

先将登录接口进行放行,请求会先通过jwt tokenfilter,如果前端请求没有携带jwttoken,那么就是未认证的状态,jwttokenfilter将会直接放行,在login接口中会首先比对验证码是否正确,如果正确的话,在usernamepasswordauthenticationfilter中调用重写过的loadUserByUsername方法,先将传入的用户名信息去数据库中查询,将查询得到的用户信息封装成UserDetails对象返回,然后进行密码的校验,如果也通过的话就将用户信息和权限信息封装成Authentication对象存入redis中,并通过用户名生成一个jwt令牌返回给前端。

用户登录之后访问其他接口时,首先会通过jwt tokenfilter进行判断,如果此时携带有jwt令牌,在jwt tokenfilter中对前端携带的jwt进行解析得到对应用户的用户名,根据此用户名去redis中查询对应的用户信息和权限信息,如果redis中存在用户信息,就将用户信息封装成Authentication对象,并存在SecurityContextHolder中。

在CustomFilter中,会获取请求的url,将可以访问该url的角色保存成一个String[],如果没有匹配的url默认为登录即可访问,将需要的角色名设置为"ROLE_LOGIN",之后请求会经过FilterSecurityIntecopter,如果所需要的角色是"ROLE_LOGIN",则直接放行,否则的话判断当前登录用户的角色和SpringSecurity所需要的角色是否匹配,如果匹配则允许访问,不匹配则报异常。

package com.xxxx.server.config.filter;

import com.xxxx.server.Utils.RedisCache;
import com.xxxx.server.config.security.JwtTokenUtil;
import com.xxxx.server.pojo.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @program: yeb
 * @description: Jwt的过滤器
 * @author: 周文杰
 * @create: 2022-04-14 21:11
 **/
@Component
public class jwtAuthenticationTokenFilter  extends OncePerRequestFilter {

    @Value("${jwt.tokenHeader}")

    private String tokenHeader;

    @Value("${jwt.tokenHead}")

    private String tokenHead;

    @Autowired
    private JwtTokenUtil jwtTokenUtil;

    @Autowired
    private UserDetailsService userDetailsService;
    @Autowired
    private RedisCache redisCache;

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
                                    FilterChain filterChain) throws ServletException, IOException {
        //前端携带token的格式应该为:tokenHeader:tokenHead jwt令牌
        String header = httpServletRequest.getHeader(tokenHeader);
        if (!StringUtils.hasText(header)){
            filterChain.doFilter(httpServletRequest,httpServletResponse);
            return;
        }
        //存在token
        String username = null;
        if (header != null && header.startsWith(tokenHead)){
            String authToken = header.substring(tokenHead.length());
            username = jwtTokenUtil.getUserNameFromToken(authToken);


//            //token存在,但是未登录
//            if (username != null && SecurityContextHolder.getContext().getAuthentication() == null){
//                //登录
//                UserDetails userDetails = userDetailsService.loadUserByUsername(username);
//                //验证token是否有效,重新设置用户对象
//                if (jwtTokenUtil.validateToken(authToken,userDetails)){
//                    UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails,null,userDetails.getAuthorities());
//                    authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest));
//                    SecurityContextHolder.getContext().setAuthentication(authenticationToken);
//                }
//            }
        }

        //从redis中获取用户信息
        String redisKey="user_name"+username;
        Admin user = redisCache.getCacheObject(redisKey);
        if (ObjectUtils.isEmpty(user)){
            throw  new RuntimeException("用户信息不存在");
        }
        //验证通过后将用户信息存入SecurityContextHolder中
        UsernamePasswordAuthenticationToken authenticationToken=new UsernamePasswordAuthenticationToken(user,null,user.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authenticationToken);
        filterChain.doFilter(httpServletRequest,httpServletResponse);
    }
}

云E办后端项目总结_用户信息

问题:使用自己创建的用户时,无法从redis中获取用户信息?


标签:总结,String,项目,jwt,用户,springframework,办后,org,import
From: https://blog.51cto.com/u_16478575/9002873

相关文章

  • Unity知识总结系列(二):相机跟随人物的几种方式
    相机跟随人物的几种方式1、最简单,无代码,固定距离,固定视角2、代码控制,固定距离,固定视角,对1进行改进3、代码控制,固定距离,固定视角,直接移动,不会旋转4、代码控制,固定距离,固定视角,插值移动(因为Update和LateUpdate刷新率不同,会有抖动现象,不建议使用)5、代码控制,固定距离,固定视角,平滑......
  • 12.27每日总结
    今天早上进行了软件构造的实验作业实验二:百度图像增强与特效SDK实验一、实验要求任务一:下载配置百度图像增强与特效的Java相关库及环境(占10%)。任务二:了解百度图像增强与特效相关功能并进行总结(占20%)。任务三:完成图像增强GUI相关功能代码并测试调用,要求上传自己的模糊照片进行......
  • jenkins部署项目指导文档(一)
    一、安装下载1.1 Jenkins简介Jenkins是一个用Java编写的开源的持续集成工具。Jenkins自动化部署可以解决集成、测试、部署等重复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更早的获取代码变更的信息,从而更早的进入测试阶段,更早的发现问题,这样解决问题的成本就会显著......
  • 一个完整Python实战项目:selenium识别验证码实现自动登录,自动操作浏览器获取某东数据
    最近都没啥时间,很久没更新了。今天分享一下,如何用selenium识别验证码,实现自动登录以及获取数据。目标:某东话不多说直接开始准备工作环境Python3.10Pycharm模块使用importrandomimporttimefromseleniumimportwebdriverimportpyautoguii......
  • vue项目中使用tinymce富文本编辑器实现图片上传/粘贴格式
    前言最近因为公司项目的后台管理端需要实现编辑器功能,一方面满足编辑各类文章内容需求,另一方面要自己编辑一些课程相关的介绍,于是就花了一些时间对比体验现有的一些开源的编辑器。编辑器之间的简单比较UEditor:基本满足各种需求,依赖于jquery但是已经不再维护了,实现上传图片等需......
  • 海康威视WebSDK_V3.3.0 集成vue2项目避坑+解决方案
    最近新需求项目集成WebSDK_V3.3.0的视频插件,开发过程中遇到了一些问题,如下:无法正确引入插件/InitPlugin报错使用文档中写的I_DestroyPlugin报错并且再次Init插件后无法正常播放,报错如下:如果你也有类似问题请往下看首先开发包如下:1.无法正确引入插件/InitPlugin报错首......
  • 手把手教如何将本地项目上传到Github
    原文一、使用git上传文件到GitHub需要git客户端以及注册GitHub账号。命令简单上传通道git官网:去git官网github官网:去github官网git的安装以及GitHub的注册这里就不说了。还不知道的,没安装的看这里:我要去看git安装教程下边就直接从上传开始。第一步:我们需要先创建一个本地......
  • 上海普陀区政府大力支持北汇信息自动驾驶智能测试系统项目
    北汇信息自主研发的“自动驾驶智能测试系统”项目获得上海普陀区政府的强力支持。此项目符合普陀区政府为加速推动智能软件产业发展而制定的战略规划,旨在进一步落实《上海市推进新型基础设施建设行动方案》和《上海市促进在线新经济发展行动方案》等一系列创新措施。 上海普陀......
  • 怎么用 python 项目函数实现字符串反转
    字符串反转是一个常见的操作,可以通过Python函数轻松实现。在本文中,我们将探讨如何使用Python函数来反转字符串,无论是针对单个字符串还是列表中的多个字符串。1.反转单个字符串要反转单个字符串,我们可以使用Python的切片功能或者内置的reversed()函数。使用切片功能defrevers......
  • 有了这篇 Kubectl 命令总结,5分钟优雅入门 K8s!
    kubectl常用命令指南Kubectl命令是操作kubernetes集群的最直接的方式,特别是运维人员,需要对这些命令有一个详细的掌握Kubectl自动补全#setupautocompleteinbash,bash-completionpackageshouldbeinstalledfirst.$source<(kubectlcompletionbash)#setupautoc......