SpringSecurity 简单使用,实现登录认证,通过过滤器实现自定义异常处理

1.基本配置
@Configuration
@EnableWebSecurity
@Slf4j
public class SecurityConfig {//自定义过滤器@Autowiredprivate JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;//登录认证服务@Autowiredprivate UserDetailsService userDetailsService;//自定义权限失败处理@Autowiredprivate AccessDeniedExceptionHandler accessDeniedExceptionHandler;//自定义认证失败处理@Autowiredprivate AuthenticationExceptionHandler authenticationExceptionHandler;//密码加密器@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Beanpublic AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception {log.info("执行authenticationManager");return authConfig.getAuthenticationManager();}@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {log.info("filterChain 执行");// 基于token,不需要csrfhttp.sessionManagement((session) -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 基于token,不需要session.authorizeHttpRequests((authz) -> authz.requestMatchers("/auth/user/login",  "/auth/user/regist").permitAll().requestMatchers(HttpMethod.OPTIONS).permitAll().anyRequest().authenticated()).addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class).exceptionHandling(exception ->{exception.authenticationEntryPoint(authenticationExceptionHandler).accessDeniedHandler(accessDeniedExceptionHandler);});http.csrf(csrf -> csrf.disable());return http.build();}@Beanpublic DaoAuthenticationProvider daoAuthenticationProvider() {DaoAuthenticationProvider provider = new DaoAuthenticationProvider();provider.setUserDetailsService(userDetailsService);provider.setPasswordEncoder(passwordEncoder());return provider;}
}
2.AuthenticationExceptionHandler
@Component
public class AuthenticationExceptionHandler implements AuthenticationEntryPoint {@Overridepublic void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {CustomAuthenticationException su = (CustomAuthenticationException) authException;// 设置响应的字符编码和内容类型response.setContentType("application/json;charset=UTF-8");response.setCharacterEncoding("UTF-8");PrintWriter writer = response.getWriter();writer.write(new ObjectMapper().writeValueAsString(BaseVo.fail(su.getMessage())));writer.flush();}
}
3.AccessDeniedExceptionHandler
@Component
public class AccessDeniedExceptionHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {//todo  和 AuthenticationExceptionHandler  类似}
}
4. UserDetailsImpl
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDetailsImpl implements UserDetails {private User user;@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return List.of();}@Overridepublic String getPassword() {return user.getPassWord();}@Overridepublic String getUsername() {return user.getUserName();}}

4. UserService

public interface UserService extends IService<User>, UserDetailsService {Page<User> getPage(Page<User> page, User user);
}
5. UserServiceImpl
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic Page<User> getPage(Page<User> page, User user) {LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>();query.like(ObjectUtil.isNotEmpty(user.getUserName()), User::getUserName, user.getUserName());query.like(ObjectUtil.isNotEmpty(user.getEmail()), User::getEmail, user.getEmail());query.like(ObjectUtil.isNotEmpty(user.getPhoneNumber()), User::getPhoneNumber, user.getPhoneNumber());query.like(ObjectUtil.isNotEmpty(user.getDeptNo()), User::getDeptNo, user.getDeptNo());query.eq(ObjectUtil.isNotEmpty(user.getIsActive()), User::getIsActive, user.getIsActive());query.orderByDesc(User::getCreateTime);return this.page(page, query);}@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {log.info("执行loadUserByUsername方法");LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>();query.eq(User::getUserName, username).or().eq(User::getEmail, username).or().eq(User::getPhoneNumber, username);User user = this.getOne(query);if(ObjectUtil.isEmpty(user)){log.info("不存在该用户");}return new UserDetailsImpl(user);}
}
6. UserController
@RestController
@RequestMapping("/auth/user")
public class UserController {@Autowiredprivate AuthenticationManager authenticationManager;@Autowiredprivate PasswordEncoder passwordEncoder;@Autowiredprivate JwtUtil jwtUtil;@Autowiredprivate RedisUtil redisUtil;@Value("${jwt.expires}")private Integer expiresIn;@Autowiredprivate UserService userService;@PostMapping("/regist")public Boolean register(@RequestBody UserDto userDto){User user = UserConvert.INSTANCE.targetToSource(userDto);if(ObjectUtil.isNotEmpty(user)){user.setPassWord(passwordEncoder.encode(user.getPassWord()));}return userService.save(user);}@PostMapping("/login")public UserVo login(@RequestBody UserDto userDto){String loginName = userDto.getLoginName();Authentication authenticate = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(loginName, userDto.getPassWord()));
//        SecurityContext context = SecurityContextHolder.getContext();
//        Authentication authentication = context.getAuthentication();UserDetailsImpl userDetail = (UserDetailsImpl) authenticate.getPrincipal();UserVo userVo = UserConvert.INSTANCE.sourceToVo(userDetail.getUser());Map<String, String> userInfo = new HashMap<>();userInfo.put("userName",userVo.getUserName());userInfo.put("userId",String.valueOf(userVo.getId()));String token = jwtUtil.getToken(userInfo, expiresIn);userVo.setToken(token);return userVo;}@PostMapping("/update")public Boolean updateUser(@RequestBody UserDto userDto){User user = UserConvert.INSTANCE.targetToSource(userDto);return userService.saveOrUpdate(user);}@PostMapping("/detail")public UserVo getUser(@RequestParam("id") Long id){User user = userService.getById(id);return UserConvert.INSTANCE.sourceToVo(user);}@PostMapping("/page")public IPage<UserVo> getUserPage(@RequestBody UserDto userDto){User user = UserConvert.INSTANCE.targetToSource(userDto);Page<User> page = new Page<>(userDto.getPageNo(), userDto.getPageSize());page = userService.getPage(page,user);return UserConvert.INSTANCE.sourceToVo(page);}@PostMapping("/delete")public Boolean deleteUser(Long id){return userService.removeById(id);}
}

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

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

相关文章

状态栏黑底白字后如何实现圆角以及固定状态栏

如何实现如下效果: 上述是将状态栏实现黑底白字+圆角+状态栏固定的逻辑 具体代码patch如下: From 6a3b8ed5d3f49a38d8f9d3e488314a66ef5576b8 Mon Sep 17 00:00:00 2001 From: andrew.hu <andrew.hu@quectel.com> Date: Fri, 18 Oct 2024 16:43:49 +0800 Subject: [P…

跟《经济学人》学英文:2024年10月19日这期 Why the world is so animated about anime

Why the world is so animated about anime Japan’s cartoons have conquered its screens, and more 为什么世界对动漫如此热衷 animated&#xff1a;热衷的&#xff1b;生动的&#xff1b;活泼的&#xff1b;活跃的 anime&#xff1a;美 [ˈnɪmeɪ] 动漫 原文&#xff…

Java程序员如何获得高并发经验?

高并发编程 提到并发编程很多人就会头疼了&#xff1b;首先就是一些基础概念&#xff1a;并发&#xff0c;并行&#xff0c;同步&#xff0c;异步&#xff0c;临界区&#xff0c;阻塞&#xff0c;非阻塞还有各种锁全都砸你脸上&#xff0c;随之而来的就是要保证程序运行时关键…

探索计算机技术的无限可能:从基础到前沿的深度之旅

引言 在这个日新月异的数字时代&#xff0c;计算机技术无疑是推动社会进步与创新的核心力量。从最初的简单计算工具到如今无处不在的智能设备&#xff0c;计算机技术的飞跃不仅重塑了我们的生活方式&#xff0c;也深刻地影响了科学研究、工业生产、医疗健康、教育娱乐等多个领域…

在 Ubuntu 上安装和卸载 PyCharm (2024)

文章目录 1. 安装 PyCharm1.1 下载 PyCharm1.2 解压文件1.3 移动文件夹到 /opt 目录1.4 创建桌面快捷方式1.5 设置执行权限1.6 启动 PyCharm 2. 卸载 PyCharm2.1 查找 PyCharm 安装位置2.2 删除安装目录2.3 删除桌面快捷方式和菜单项2.4 清理配置文件和缓存 3. 总结 PyCharm 是…

海外著名新闻门户媒体软文发稿之华盛顿独立报-大舍传媒

在当今全球化的时代&#xff0c;信息传播的速度和范围达到了前所未有的程度。对于企业和个人而言&#xff0c;如何在国际舞台上有效地展示自己、传递信息&#xff0c;成为了一项至关重要的任务。而海外媒体发稿&#xff0c;特别是通过像华盛顿独立报这样的知名新闻门户&#xf…

宝塔安装RabbitMQ失败解决方法|宝塔安装RabbitMQ提示elang环境没有解决方法

目录 一、前言二、问题排查三、问题解决四、再次修改密码 一、前言 安装完宝塔&#xff0c;然后在软件商店安装RabbitMQ的时候&#xff0c;安装完一直显示RabbitMQ未启动 服务器&#xff1a;阿里云 系统&#xff1a;Alibaba Cloud Linux 3.2104 LTS 64位 二、问题排查 安装完…

雷池社区版那么火,为什么站长都使用雷池社区版??

雷池社区版是长亭科技开发的一款免费开源的 Web 应用防火墙&#xff08;WAF&#xff09;&#xff0c;具有诸多优势&#xff0c;因此值得使用。 防护效果强大。能够检测并防御各种网络攻击&#xff0c;包括 SQL 注入、跨站脚本&#xff08;XSS&#xff09;、跨站请求伪造&#x…

【论文+源码】基于spring boot的垃圾分类网站

创建一个基于Spring Boot的垃圾分类网站涉及多个步骤&#xff0c;包括环境搭建、项目创建、数据库设计、后端服务开发、前端页面设计等。下面我将引导您完成这个过程。 第一步&#xff1a;准备环境 确保您的开发环境中安装了以下工具&#xff1a; Java JDK 8 或更高版本Mav…

ARM学习(33)英飞凌(infineon)PSOC 6 板子学习

笔者来聊一下psoc62 系列板子的知识 1、PSOC62板子介绍 Psoc6-evaluationkit-062S2 与RT-Thread联合推出的一款32位的双core的板子&#xff0c;基于CortexM4以及CortexM0。 管脚兼容Arduio。板载DAP-Link&#xff0c;可以支持调试以及串口&#xff0c;无需外接2MB的Flash以及…

新手向-pkg-config的原理和使用

工作中遇到&#xff0c;发现自己不太了解&#xff0c;所以写篇博客学习&记录一下&#xff0c;不同意见欢迎评论区分享。 1. 简介 pkg-config是一个用于链接库的工具&#xff0c;可以简化编译的语句。 以编译需要opencv的代码为例&#xff1a; # 不使用pkg-config g -o op…

代码随想录算法训练营第三十九天|背包问题,416. 分割等和子集

背包问题&#xff0c;416. 分割等和子集 背包问题416. 分割等和子集 背包问题 有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 卡玛网的…

非接触式竖向位移、水平位移视频实时在线监测的设备分类及选型

前言 视觉是人工智能正在快速发展的一个分支&#xff0c;简单说来&#xff0c;机器视觉就是用机器代替人眼来做测量和判断。在结构健康自动化监测方面&#xff0c;机器视觉采用光学图像结合智能算法和物联网技术&#xff0c;利用先进的智能靶标识别及亚像素处理等技术&#xff…

力扣——用队列实现栈(C语言)

目录 题目&#xff1a; 原理&#xff1a; 结构体MyStack 出栈void myStackPop(MyStack* obj) 入栈void myStackPush(MyStack* obj, int x) 读取栈顶元素int myStackTop(MyStack* obj) 判断栈空bool myStackEmpty(MyStack* obj) 销毁栈void myStackFree(MyStack* obj) 整…

【模型学习】

https://zhuanlan.zhihu.com/p/522344841 from transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(model_checkpoint) tokenizer("男女主角亦有专属声优这一模式是由谁改编的&#xff1f;", "任天堂游戏谜之村雨城") { input_…

速卖通2024年海外双11及黑五大促节奏与玩法

速卖通在2024年的双11和黑五大促销活动中&#xff0c;推出了一系列新的节奏和玩法&#xff0c;以适应全球化的市场需求和提升消费者体验。以下是详细的活动安排和商家激励措施&#xff1a; 双11大促节奏 预热阶段&#xff1a;11月8日至11月10日&#xff0c;为期3天。 正式售卖…

OpenCV视觉分析之运动分析(4)背景减除类:BackgroundSubtractorKNN的一系列set函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 BackgroundSubtractorKNN类有一系列的set函数&#xff0c;下面我们一一列举他们的名字和用法。 一系列set函数 函数setDetectShadows() setDe…

WPF+MVVM案例实战(三)- 动态数字卡片效果实现

1、创建项目 打开 VS2022 &#xff0c;新建项目 Wpf_Examples&#xff0c;创建各层级文件夹&#xff0c;安装 CommunityToolkit.Mvvm 和 Microsoft.Extensions.DependencyInjectio NuGet包,完成MVVM框架搭建。搭建完成后项目层次如下图所示&#xff1a; 这里如何实现 MVVM 框…

孤岛架构在安全性方面

孤岛架构在安全性方面的考虑主要涉及如何确保每个孤岛的安全性&#xff0c;同时维护整个系统的安全。 关键的安全性考虑&#xff1a; 1. 数据隔离和访问控制 数据隔离&#xff1a;每个孤岛应该有独立的数据存储&#xff0c;以确保数据隔离。这有助于防止数据泄露和未经授权的…

【AI学习】Mamba学习(十二):深入理解S4模型

#1024程序员节&#xff5c;征文# HiPPO的学习暂告一段落&#xff0c;按照“HiPPO->S4->Mamba 演化历程”&#xff0c;接着学习S4。 S4对应的论文&#xff1a;《Efficiently Modeling Long Sequences with Structured State Spaces》 文章链接&#xff1a;https://ar5iv…