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;成为了一项至关重要的任务。而海外媒体发稿&#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以及…

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

前言 视觉是人工智能正在快速发展的一个分支&#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 框…

【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…

【论文笔记】X-Former: Unifying Contrastive and Reconstruction Learning for MLLMs

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: X-Former: Unifying Contr…

《在1688的数字海洋中,如何用API网罗一家店铺的所有商品?》

想象一下&#xff0c;你是一位船长&#xff0c;航行在1688这个电商的数字海洋上。你的任务是探索一家神秘的店铺岛屿&#xff0c;并且用你的API魔法网&#xff0c;网罗岛上所有的商品宝藏。不用担心&#xff0c;即使你不是海贼王&#xff0c;有了代码的力量&#xff0c;你也能成…

uniapp:sqlite最详细教程,小白可直接粘贴复制

新建uniapp项目,需要4个页面, loading 启动页:打开数据库,判断数据表是否存在,表内是否有数据,创建数据表的逻辑。 register 注册页:数据表已存在,但是没有数据,需要进入该页面注册第一条数据 index 首页:展示数据列表内的数据,可修改默认,添加新数据 edit 编辑:编…

vuetify学习笔记(v-app和v-responsive)

我最近在学习vuetify3&#xff0c;我以前是用element plus和taiwind css。vuetify的一个好处是&#xff0c;它不仅是一个向element plus一样提供好用的组件库&#xff0c;而且还提供了向taiwind css一样的原子类&#xff0c;可以通过类名方便的定义组建的样式。以前element plu…

ReactOS系统中搜索给定长度的空间地址区间中的二叉树

搜索给定长度的空间地址区间 //搜索给定长度的空间地址区间 MmFindGap MmFindGapTopDown PVOID NTAPI MmFindGap(PMADDRESS_SPACE AddressSpace,ULONG_PTR Length,ULONG_PTR Granularity,BOOLEAN TopDown );PMADDRESS_SPACE AddressSpace,//该进程用户空间 ULONG_PTR Length,…