当前位置: 首页 > wzjs >正文

网站空间备案 昆明信息型网站

网站空间备案 昆明,信息型网站,个人工作室 网站建设,玉树网站建设前言 最近通过一个皮肤信息管理系统的项目实践,深入学习了Spring Boot框架中登录认证功能的实现方式。这个项目涵盖了从后端配置到前端集成的完整流程,让我对现代Web应用的安全机制有了更深刻的理解。本文将分享我在这个过程中的学习心得和技术要点。 …

前言

最近通过一个皮肤信息管理系统的项目实践,深入学习了Spring Boot框架中登录认证功能的实现方式。这个项目涵盖了从后端配置到前端集成的完整流程,让我对现代Web应用的安全机制有了更深刻的理解。本文将分享我在这个过程中的学习心得和技术要点。

一、JWT认证机制的理解与实现

1.1 为什么选择JWT

传统的Session认证方式在分布式系统中存在扩展性问题,而JWT(JSON Web Token)作为一种无状态的认证机制完美解决了这个问题。在项目中,我们采用了JWT来实现用户认证,主要优势在于:

  • ​无状态​​:服务端不需要存储会话信息
  • ​跨域支持​​:适合前后端分离架构
  • ​自包含​​:所有必要信息都包含在token中

1.2 JWT工具类实现

@Component
public class JwtUtils {private static final String SECRET = "your-secret-key";private static final long EXPIRATION = 86400000L; // 24小时public static String generateToken(UserDetails userDetails) {return Jwts.builder().setSubject(userDetails.getUsername()).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRATION)).signWith(SignatureAlgorithm.HS512, SECRET).compact();}public static String getUsernameFromToken(String token) {return Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody().getSubject();}public static boolean validateToken(String token, UserDetails userDetails) {final String username = getUsernameFromToken(token);return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));}private static boolean isTokenExpired(String token) {final Date expiration = getExpirationDateFromToken(token);return expiration.before(new Date());}
}

二、Spring Security整合实践

2.1 安全配置类

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate UserDetailsService userDetailsService;@Autowiredprivate JwtAuthenticationEntryPoint unauthorizedHandler;@Beanpublic JwtAuthenticationFilter jwtAuthenticationFilter() {return new JwtAuthenticationFilter();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.cors().and().csrf().disable().exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests().antMatchers("/api/auth/**").permitAll().antMatchers("/api/test/**").permitAll().anyRequest().authenticated();http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);}
}

2.2 自定义认证过滤器

public class JwtAuthenticationFilter extends OncePerRequestFilter {@Autowiredprivate JwtUtils jwtUtils;@Autowiredprivate UserDetailsService userDetailsService;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {try {String jwt = parseJwt(request);if (jwt != null && jwtUtils.validateToken(jwt)) {String username = jwtUtils.getUsernameFromToken(jwt);UserDetails userDetails = userDetailsService.loadUserByUsername(username);UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));SecurityContextHolder.getContext().setAuthentication(authentication);}} catch (Exception e) {logger.error("Cannot set user authentication: {}", e);}filterChain.doFilter(request, response);}private String parseJwt(HttpServletRequest request) {String headerAuth = request.getHeader("Authorization");if (StringUtils.hasText(headerAuth) && headerAuth.startsWith("Bearer ")) {return headerAuth.substring(7);}return null;}
}

三、前后端交互设计

3.1 登录接口设计

@RestController
@RequestMapping("/api/auth")
public class AuthController {@Autowiredprivate AuthenticationManager authenticationManager;@Autowiredprivate JwtUtils jwtUtils;@PostMapping("/login")public ResponseEntity<?> authenticateUser(@RequestBody LoginRequest loginRequest) {Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()));SecurityContextHolder.getContext().setAuthentication(authentication);String jwt = jwtUtils.generateToken(authentication);UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal();return ResponseEntity.ok(new JwtResponse(jwt, userDetails.getId(), userDetails.getUsername(), userDetails.getEmail()));}
}

3.2 前端请求处理

在Vue项目中,我们使用axios进行HTTP请求,并配置请求和响应拦截器:

// 请求拦截器
axios.interceptors.request.use(config => {const token = localStorage.getItem('token');if (token) {config.headers['Authorization'] = 'Bearer ' + token;}return config;},error => {return Promise.reject(error);}
);// 响应拦截器
axios.interceptors.response.use(response => {return response.data;},error => {if (error.response.status === 401) {// 处理token过期或无效的情况localStorage.removeItem('token');router.push('/login');}return Promise.reject(error);}
);

更改后的界面如下:

点击注销登录后恢复原来的登录界面则大功告成

四、项目实践中的经验总结

  1. ​安全性考虑​​:

    • 使用HTTPS加密传输
    • 设置合理的token过期时间
    • 敏感操作需要二次验证
    • 密码必须加密存储(BCrypt)
  2. ​性能优化​​:

    • 减少JWT的payload大小
    • 考虑使用Redis缓存用户权限信息
    • 实现token刷新机制,避免频繁登录
  3. ​异常处理​​:

    • 统一的认证异常处理
    • 详细的错误信息返回(但不暴露系统细节)
    • 友好的前端错误提示
  4. ​测试要点​​:

    • 多种场景测试:正确凭证、错误凭证、过期token、无效token
    • 并发请求测试
    • 前后端分离情况下的跨域测试

五、进一步探索方向

  1. ​OAuth2.0集成​​:实现第三方登录功能
  2. ​多因素认证​​:增加短信/邮箱验证码等二次验证
  3. ​权限精细化控制​​:基于RBAC模型的权限管理
  4. ​单点登录(SSO)​​:多系统间的统一认证
  5. ​安全审计​​:记录用户登录日志和敏感操作

结语

通过这个皮肤信息管理系统的登录认证模块实现,我深刻理解了Spring Security和JWT的工作原理,掌握了前后端分离架构下的认证流程设计。这些知识不仅适用于当前项目,也为今后开发更复杂的系统打下了坚实基础。建议初学者可以从这个小而完整的模块入手,逐步扩展到更复杂的安全场景。

​项目完整代码已上传GitHub​​:项目地址

欢迎在评论区交流Spring Boot安全实现的相关问题!


文章转载自:

http://S5dQr2ZX.gfjgq.cn
http://OnKEnGRF.gfjgq.cn
http://5tKi6wjH.gfjgq.cn
http://R1lOoqBL.gfjgq.cn
http://QmoM9HTb.gfjgq.cn
http://hqiLxKMP.gfjgq.cn
http://mfTjwkAJ.gfjgq.cn
http://dazgBH7F.gfjgq.cn
http://IZFTYVZ6.gfjgq.cn
http://m7FtXYAe.gfjgq.cn
http://2RcyNDhI.gfjgq.cn
http://WFYPoiet.gfjgq.cn
http://czvtJNLi.gfjgq.cn
http://JUBAlqJU.gfjgq.cn
http://CLKpjUpJ.gfjgq.cn
http://lhC1AzDv.gfjgq.cn
http://AsbVMUoy.gfjgq.cn
http://gYAuUF9N.gfjgq.cn
http://jwqHj0yR.gfjgq.cn
http://6J4Zifs5.gfjgq.cn
http://gvMEwWNp.gfjgq.cn
http://fxLOU5wD.gfjgq.cn
http://yvm7Fzak.gfjgq.cn
http://uXRgTKGk.gfjgq.cn
http://weSHOguq.gfjgq.cn
http://tgkQuZDn.gfjgq.cn
http://NRCJT4nN.gfjgq.cn
http://uhRaSuyW.gfjgq.cn
http://8O1y4PJz.gfjgq.cn
http://g6MRHMwd.gfjgq.cn
http://www.dtcms.com/wzjs/691996.html

相关文章:

  • 个人可以备案网站优秀专题网站
  • 以鹦鹉做头像的网站免费网络课程平台
  • 商城网站建设正规公司步骤流程图
  • 创网站 灵感义乌网络推广公司
  • 网站 规划住房建设厅的网站首页
  • 网页模板网站铁岭 开原网站建设
  • 如何创建网站设计全国文明城市创建工作
  • 网站主页建设格式但是打不开网页
  • 网站 案例展示wordpress 评论显示头像
  • 北京国家建设部网站初学者网站建设
  • 两学一做考试网站下列哪个不是网络营销成熟阶段出现的网络营销方式
  • 用付费网站做推广简单产品设计方案模板
  • 网站建设优化是干嘛聊城公司网站设计
  • 免费网站建设咨询辽宁省建筑工程造价信息网
  • 湖北天健建设集团有限公司网站wordpress模板程序
  • 电子商务网站建设与管理实验报告wordpress表单提交路径
  • app需要建网站吗女生学建筑专业好吗
  • 建站之星登录怎么做一网站首页
  • 能打开所有网站的浏览器怎么写网站建设的说明书
  • 梅州市做试块网站网站后缀net
  • 高明顺德网站建设深圳网站开发antnw
  • 网站开发和软件开发哪个难wordpress个人中心插件
  • 外贸网站建设多少钱中国河北网站
  • 开发电商网站美食网站案例
  • seo查询官方网站关键词查找网站
  • 个人旅游网站建设方案深圳市注册公司需要什么条件
  • 做网站用什么服务器比较好如何创建软件app
  • c 手机网站开发工具wordpress软件根目录在哪里
  • 一条龙建站多少钱大地seo视频
  • 建设部网站查不到注册证怎么回事安卓开发环境