使用 Spring Security的一些常用功能

embedded/2025/3/25 21:06:56/

在实际开发中,Spring Security 常常涉及一些常用的功能。以下是一些在开发中经常使用的 Spring Security 功能:

1. PasswordEncoder Bean(密码加密)

这段配置使用 BCryptPasswordEncoder 作为密码加密算法。它是 Spring Security 中常用的密码加密方式,通常用于存储和验证用户的密码。

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

2. 跨域配置(CORS)

配置跨域请求源、请求方法和请求头,允许前端应用跨域访问后端接口。该功能在前后端分离的应用中非常常见,尤其是需要不同域名访问同一服务时。

java">@Bean
public CorsConfigurationSource configurationSource() {UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.setAllowedOrigins(Arrays.asList("*"));corsConfiguration.setAllowedMethods(Arrays.asList("*"));corsConfiguration.setAllowedHeaders(Arrays.asList("*"));urlBasedCorsConfigurationSource.registerCorsConfiguration("/**",corsConfiguration);return urlBasedCorsConfigurationSource;
}

3. 自定义登录页面和失败处理

配置自定义的登录页面以及登录成功和失败时的处理逻辑。这是常见的安全性需求,尤其是在用户体验中需要提供定制的登录界面。

java">.formLogin(formLogin -> {formLogin.loginProcessingUrl("/login").successHandler(myAuthenticationSuccessHandler).failureHandler(myAuthenticationFailHandler);
})

 一般在登录成功的回调的处理器当中,我们会生成token并且存入Redis当中,在后续的拦截器当中从Redis获取token并且认证

4. 自定义登出处理

配置自定义的退出登录 URL 及退出成功后的处理。通常需要在登出成功后清理用户会话或进行其他操作。

java">.logout(logout -> {logout.logoutUrl("/logout").logoutSuccessHandler(myLogoutSuccessHandler);
})

5. 请求授权(授权控制)

配置不同的 URL 路径的访问权限,允许一些 URL 对所有用户开放(如登录页面、验证码等),并限制其他 URL 需要认证才能访问。

java">.authorizeHttpRequests(authorizeHttpRequests -> {authorizeHttpRequests.requestMatchers("/toLogin", "/common/captcha").permitAll().anyRequest().authenticated();
})

6. 禁用 CSRF(跨站请求伪造)保护

禁用 CSRF 防护,通常在使用无状态认证(如 JWT)时需要禁用 CSRF,因为它依赖于会话。

java">.csrf(csrf -> {csrf.disable();
})

7. Session 管理

设置无状态的会话管理,即不创建会话,每次请求都需要进行身份认证。通常配合 JWT 使用。

java">.sessionManagement(sessionManagement -> {sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
})

8. Token 过滤器

在 Spring Security 的过滤器链中加入自定义的 Token 过滤器(通常用于验证 JWT),确保每个请求都携带正确的认证信息。

对于 RESTful API 和前后端分离的应用,JWT 是一种常见的认证方式。Spring Security 可以与 JWT 配合使用来实现无状态认证。

你可以在 Spring Security 配置中添加一个 JWT 过滤器,拦截请求,提取 JWT 并进行认证。

示例:

java"> // 在登录filter 之后添加一个token过滤器 确保退出登录的时候可以获取到认证信息.addFilterBefore(tokenFilter, LogoutFilter.class)

tokenFilter:

java">@Component
public class TokenFilter  extends OncePerRequestFilter {@Resourceprivate RedisTemplate<String, String> redisTemplate;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {response.setContentType("application/json;charset=UTF-8");// 获取请求路径String requestURI = request.getRequestURI();// 判断是否是登录请求 登录请求不需要验证if (requestURI.equals("/login")) {filterChain.doFilter(request, response);} else {// 取出请求头中的tokenString token = request.getHeader("token");// 判断token是否有内容if (!StringUtils.hasText(token)) {// 没有值R result = R.builder().code(901).msg("token不能为空").build();response.getWriter().write(JSONUtil.toJsonStr(result));} else {boolean verify = false;try {// 验证通过了为true  这里需要捕获异常verify = JWTUtil.verify(token, Constant.JWT_SECRET.getBytes());} catch (Exception e) {e.printStackTrace();}if (!verify) {// token无效R result = R.builder().code(902).msg("token无效").build();response.getWriter().write(JSONUtil.toJsonStr(result));} else {JSONObject payload = JWTUtil.parseToken(token).getPayloads();String userJson = payload.get("user", String.class);TUser tUser = JSONUtil.toBean(userJson, TUser.class);if (!token.equals(redisTemplate.opsForValue().get(Constant.REDIS_TOKEN_PREFIX + tUser.getId()))) {R result = R.builder().code(903).msg("请求token错误").build();response.getWriter().write(JSONUtil.toJsonStr(result));} else {// 验证通过了,要在Spring Security的上下文当中需要防止一个认证对象// 这样的话 Spring Security 在执行后续的Filter的时候,才知道这个人是已经登录了的UsernamePasswordAuthenticationToken authenticationToken= new UsernamePasswordAuthenticationToken(tUser, null, tUser.getAuthorities());SecurityContextHolder.getContext().setAuthentication(authenticationToken);// 放行filterChain.doFilter(request, response);}}}}}
}

需要注意的是当验证通过了之后,需要设置Authentication 认证对象, UsernamePasswordAuthenticationToken 是其一个实现类。

9. 访问权限拒绝处理

配置权限不足时的处理逻辑,通常用来返回友好的错误信息或页面。

java">.exceptionHandling(exceptionHandling -> {exceptionHandling.accessDeniedHandler(myAccessDeniedHandler);
})


http://www.ppmy.cn/embedded/176089.html

相关文章

【MATLAB例程】基于TDOA定位(两步最小二乘)的三维轨迹定位和UKF滤波,TDOA的锚点可以自适应,附完整代码

该代码实现了一种融合TDOA(到达时间差)定位与无迹卡尔曼滤波(UKF) 的动态目标轨迹跟踪方案,适用于三维空间中的移动目标定位与滤波。使用两步最小二乘(粗解和细解)计算TDOA定位订阅专栏后,可查看完整代码 文章目录 运行结果源代码代码详解代码概述技术方法详解TDOA定位…

【论文阅读】MMedPO: 用临床感知多模态偏好优化调整医学视觉语言模型

MMedPO&#xff1a; 用临床感知多模态偏好优化调整医学视觉语言模型 1.背景2.核心问题&#xff1a;3.方法&#xff1a;3. 实验结果与优势4. 技术贡献与意义5.结论 MMedPO: Aligning Medical Vision-Language Models with Clinical-Aware Multimodal Preference Optimization M…

存算分离是否真的有必要?从架构之争到 Doris 实战解析

引言&#xff1a;一场关于 “存与算” 的N年辩论 在数据库与大数据领域&#xff0c;“存算一体” 与 “存算分离” 的架构之争从未停歇。有人质疑&#xff1a;“存算分离真的有必要吗&#xff1f;本地盘性能难道不够&#xff1f;” 答案并非非黑即白 —— 技术选型的关键&…

汽车行业敏捷开发实践:基于Atlassian工具链的全流程解决方案(Jira、Confluence、Jira Service Management等)

直播回顾 在数字化浪潮席卷全球的今天&#xff0c;各行各业都在积极寻求转型与突破&#xff0c;汽车行业也不例外。 近日&#xff0c;在“Atlassian助力企业破局&#xff1a;数字化协作与全球市场拓展”的线上直播活动中&#xff0c;龙智资深顾问张晓乐深入探讨了汽车行业数字…

图论——kruskal算法

53. 寻宝(第七期模拟笔试) 题目描述 在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。 不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通…

SpringSecurity——前后端分离登录状态如何保持

目录 设计思路 登录成功后生成 JWT 并存入 Redis &#x1f9fe; 前端如何处理 JWT&#xff1f; &#x1f6e1;️ JWT 拦截器校验&#xff08;自定义过滤器&#xff09; &#x1f9e0;为什么需要手动设置用户登录状态 ① 创建认证对象 ② 设置到 Spring Security 上下文 …

将MySQL数据同步到Elasticsearch作为全文检索数据的实战指南

在现代应用中&#xff0c;全文检索是一个非常重要的功能&#xff0c;尤其是在处理大量数据时。Elasticsearch 是一个强大的分布式搜索引擎&#xff0c;能够快速地进行全文检索、分析和可视化。而 MySQL 作为传统的关系型数据库&#xff0c;虽然能够处理结构化数据&#xff0c;但…

好看的css星星效果边框

给客户做的动效图&#xff0c;结果应证了还是第一版的好&#xff0c;不忍舍弃&#xff0c;放这里&#xff0c;喜欢的人自取&#xff1b; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewp…