阶段十-springsecurity总结

jwt认证流程

SpringSecurity 认证过程

 

 

第一步:

创建一个类实现UserDetailsService接口,重写其中的方法

通过重写 public UserDetails loadUserByUsername(String username) 方法

从数据库校验用户输入的用户名

配置SecurityConfig

@Bean注入  PasswordEncoder  通过BCryptPasswordEncoder();

@Bean注入 DaoAuthenticationProvider

设置setUserDetailsService(userDetailsService); 走我们的UsersDetailsService

setPasswordEncoder(passwordEncoder());走我们注入的密码加密器

第二步:

注入过滤器链 SecurityFilterChain

注入过滤器链忽略资源 WebSecurityCustomizer

@Configuration
public class SecurityConfig {@Autowiredprivate UserDetailsService userDetailsService;@Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}//注入UserDetailsService@Beanpublic DaoAuthenticationProvider authenticationProvider(){DaoAuthenticationProvider auth = new DaoAuthenticationProvider();auth.setUserDetailsService(userDetailsService);auth.setPasswordEncoder(passwordEncoder());return auth;}//注入认证管理器@Beanpublic AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {return authenticationConfiguration.getAuthenticationManager();}//注入过滤连@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {//关闭csrf攻击防护http.csrf().disable();//配置认证请求,所有请求都需要过滤http.authorizeRequests().anyRequest().authenticated();//关闭session会话http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);return http.build();}//注入过滤链忽略资源@Beanpublic WebSecurityCustomizer securityCustomizer() throws Exception{return (web )->{web.ignoring().antMatchers("/user/login");};}
}

第三步:

登录实现类

 //认证管理器完成认证UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUsername(),user.getPassword());Authentication authenticate = authenticationManager.authenticate(authenticationToken);if(Objects.isNull(authenticate)){throw new RuntimeException("用户名或密码错误");}//使用userid生成tokenUser loginUser = (User) authenticate.getPrincipal();String userId = loginUser.getId().toString();String token = jwtUtils.generateToken(userId);//authenticate存入redisstringRedisTemplate.opsForValue().set("login:"+userId, JSON.toJSONString(loginUser));//把token响应给前端HashMap<String,String> map = new HashMap<>();map.put("token",token);return new ResponseResult(200,"登陆成功",map);

第四步:

自己定义认证管理器jwtAuthenticationTokenFilter

最后把读取到的数据存入本地线程中

为什么放行,因为放行之后有人处理

@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Autowiredprivate JwtUtils jwtUtils;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {//获取tokenString token = request.getHeader("token");if (!StringUtils.hasText(token)) {//放行filterChain.doFilter(request, response);//防止过滤链执行完在执行过滤器。return;}//解析tokenString userId;try {userId = jwtUtils.getUserIdFromToken(token);} catch (Exception e) {e.printStackTrace();throw new RuntimeException("token非法");}//从redis中获取用户信息String redisKey = "login:" + userId;String json = stringRedisTemplate.opsForValue().get(redisKey);User loginUser = JSONObject.parseObject(json, User.class);if (Objects.isNull(loginUser)) {throw new RuntimeException("用户未登录");}//将用户信息存入SecurityContextHolder中//TODO 获取权限信息封装到Authenication中UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken =new UsernamePasswordAuthenticationToken(loginUser,null,null);SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);//放行filterChain.doFilter(request,response);}
}

把我们的过滤器放入过滤器链

//配置认证过滤器http.addFilterAfter(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);

因为jwtAuthenticationTokenFilter继承OncePerRequestFilter

为防止SpringBoot的FilterRegistrationBean执行OncePerRequestFilter过滤器

@Configuration
public class WebConfig {@Beanpublic FilterRegistrationBean filterRegistrationBean(JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter){FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>(jwtAuthenticationTokenFilter);filterFilterRegistrationBean.setEnabled(false);return filterFilterRegistrationBean;}
}

第五步:退出登录

从本地线程中获取数据,直接删除,最彻底的是前后端都删除

授权

在springsecurity配置类中开启注解

@EnableWebSecurity //开启springSecurity框架
@EnableGlobalMethodSecurity(prePostEnabled = true)//开启权限注解开发

在controller上配置权限注解

例如:

@PreAuthorize("hasAuthority('test')")
封装权限信息

注意实体类中的权限信息,两个集合

 /** 用户拥有权限* */@TableField(exist = false)private Collection<String> menus;@Override@JSONField(serialize = false)public Collection<? extends GrantedAuthority> getAuthorities() {Collection<GrantedAuthority> collection = new ArrayList();for (String str : menus){SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(str);collection.add(simpleGrantedAuthority);}return collection;}

在UserDetailServiceImpl中加入权限,从数据库中获取(多表连接),这里是写死的

//返回user自动会和前台接收的密码比对,这里不用比对密码Collection<String> collection = new ArrayList<>();collection.add("test");user.setMenus(collection);return user;

认证过滤器解析权限数据也加入权限信息

//将用户信息存入SecurityContextHolder中// 获取权限信息封装到Authenication中UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken =new UsernamePasswordAuthenticationToken(loginUser,null,loginUser.getAuthorities());

自定义失败处理

如果是认证过程中出现的异常会被封装成AuthenticationException然后调用AuthenticationEntryPoint对象的方法去进行异常处理。

如果是授权过程中出现的异常会被封装成AccessDeniedException然后调用AccessDeniedHandler对象的方法去进行异常处理。

在SpringSecurity配置信息中注入

    @Autowiredprivate AuthenticationEntryPoint authenticationEntryPoint;@Autowiredprivate AccessDeniedHandler accessDeniedHandler;
 http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint).accessDeniedHandler(accessDeniedHandler);

跨域问题解决

@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {// 设置允许跨域的路径registry.addMapping("/**")// 设置允许跨域请求的域名.allowedOrigins("*")// 是否允许cookie.allowCredentials(true)// 设置允许的请求方式.allowedMethods("GET", "POST", "DELETE", "PUT")// 设置允许的header属性.allowedHeaders("*")// 跨域允许时间.maxAge(3600);}
}

开启SpringSecurity的跨域访问

    @Overrideprotected void configure(HttpSecurity http) throws Exception {...//允许跨域http.cors();}

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

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

相关文章

如何打造自己的知识付费小程序平台

在当今知识付费的浪潮中&#xff0c;我们经常可以看到各种知识付费平台如雨后春笋般涌现。然而&#xff0c;这些平台往往只是一个过客&#xff0c;让我们短暂停留后&#xff0c;便淹没在信息的海洋中。如果你有一个出色的课程&#xff0c;为什么不让它在一个属于你自己的平台上…

翼鸥教育和阿里云强强联手,共创全球化云网络极致体验

云布道师 近日&#xff0c;第 6 届 SDWAN&SASE 大会暨云网络大会在京顺利举办&#xff0c;在会上阿里云网络与翼鸥教育联合签署《云网络共建合作计划》&#xff0c;未来双方将在云网络技术层面共同投入技术研究&#xff0c;发挥各自领域的业务优势&#xff0c;合力推进云网…

国家开放大学 河南开放大学 形成性考核 平时作业 考试题 参考资料

试卷代号&#xff1a;1282 社会学概论&#xff08;本&#xff09; 参考 试题 一、单项选择题&#xff08;在各题的备选答案中&#xff0c;只有1项是正确的&#xff0c;请将正确答案的序号&#xff0c;填写在题中的括号内。每题1分&#xff0c;共10分&#xff09; 1.从20世纪…

回归预测 | MATLAB实现NGO-SCN北方苍鹰算法优化随机配置网络的数据回归预测 (多指标,多图)

回归预测 | MATLAB实现NGO-SCN北方苍鹰算法优化随机配置网络的数据回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现NGO-SCN北方苍鹰算法优化随机配置网络的数据回归预测 &#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍…

抖捧AI实景自动直播真的有效吗

“ 随着本地生活行业的飞速发展&#xff0c;如今有越来越多的企业与实体商家&#xff0c;都想通过线上来做自己的门店、品牌宣传&#xff0c;用短视频以及直播的方式获得更多的流量曝光&#xff0c;从而带来客流量与转化量&#xff0c;现在本地生活行业将迎来第四个年头&#x…

代码随想录27期|Python|Day18|二叉树|路径总和iii|找树左下角的值|从中序与后序遍历序列构造二叉树

第一次刷的时候题解都不是精简版 513. 找树左下角的值 - 力扣&#xff08;LeetCode&#xff09; 注意这道题不是寻找最左侧的左节点&#xff0c;而是寻找最底层位于左端的节点&#xff08;可能是左节点&#xff0c;有可能是右节点&#xff09;。 层序遍历 层序遍历比较简单&…

【JavaSE】Java入门八(Object类详解)

object类 Java中Object类是所有类的父类&#xff0c;可以理解为他是最抽象的一个类型&#xff0c;就像混沌&#xff0c;Java所有类型都继承自它&#xff0c;所有对象&#xff08;包括数组&#xff09;都实现这个类的方法。非常重要&#xff0c;下面我来根据JDK官方文档来带大家…

2023最新整理软件测试常见面试题附答案

包含的模块&#xff1a; 本文分为十九个模块&#xff0c;分别是&#xff1a;软件测试 基础、liunx、MySQL、web测试、接口测试、APP测试 、管理工具、Python、性能测试、selenium、lordrunner、计算机网络、组成原理、数据结构与算法、逻辑题、人力资源需要的可以【点击文末小…

python画图【02】

完整代码 https://gitee.com/ihan1001 https://github.com/ihan1001/python-drawing import matplotlib.pyplot as plt import numpy as np #创建空白画笔 fig plt.figure(figsize(4,3),facecolorpink)#添加子画布 ax1 fig.add_subplot(2,2,1) ax2 fig.add_subplot(2,2,2) …

Eclipse_01_如何设置代码文件背景颜色为护眼沙绿色

设置方法 Window --> Preference 参考文档 参考文档 1

LoadRunner-Analysis

Analysis介绍 Analysis介绍 Analysis&#xff1a;用于产生性能测试报告&#xff1b;在Controller这里选择Analyze Results 标准差越大说明系统越不稳定 添加新图表&#xff1a; 如果要把另一个表合在一起&#xff1a;

自动化测试 (五) 读写64位操作系统的注册表

自动化测试经常需要修改注册表 很多系统的设置&#xff08;比如&#xff1a;IE的设置&#xff09;都是存在注册表中。 桌面应用程序的设置也是存在注册表中。 所以做自动化测试的时候&#xff0c;经常需要去修改注册表 Windows注册表简介 注册表编辑器在 C:\Windows\regedit…