springboot后端代码分析 websecurityconfig

               .and()
                //这里必须要写formLogin(),不然原有的UsernamePasswordAuthenticationFilter不会出现,也就无法配置自定义的UsernamePasswordAuthenticationFilter
                .formLogin()
                .loginPage("/login_page")
                .loginProcessingUrl("/login")
                .usernameParameter("username")
                .passwordParameter("password")
                .successHandler(successHandler)
                .failureHandler(failureHandler)
                .permitAll()
loginProcessingUrl("/login"): 这行代码指定了Spring Security应该监听哪个URL以处理登录请求。当客户端发送POST请求到/login时,Spring Security会拦截并调用UsernamePasswordAuthenticationFilter来处理这个请求。

 .and()
.addFilterAt(jsonAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)

这里调用这个后,同时自定义JsonAuthenticationFilter添加到了Spring Security的过滤器链中,并替换了默认的UsernamePasswordAuthenticationFilter。当请求到达/login时,将由JsonAuthenticationFilter来处理


loginPage("/login_page"): 指定登录页面的URL,当用户尝试访问受保护的资源但尚未登录时,会被重定向到此页面

登录成功与失败处理

    public JsonAuthenticationFilter jsonAuthenticationFilter() throws Exception {
        JsonAuthenticationFilter filter = new JsonAuthenticationFilter();
        filter.setAuthenticationSuccessHandler(successHandler);
        filter.setAuthenticationFailureHandler(failureHandler);
        filter.setFilterProcessesUrl("/login");
        filter.setAuthenticationManager(authenticationManagerBean());
        return filter;
    }

当登录成功时,会调用successHandler来处理后续操作,如重定向或返回响应
如果登录失败,则调用failureHandler来处理错误,如显示错误消息或重定向到错误页面

<think>好的,用户现在想找Spring Boot后端实现登录Token的代码示例。之前他问过前端处理登录的问题,现在转向后端,需要提供具体的实现代码。首先,我需要回顾之前的对话,确保一致性。用户之前的问题是关于前端处理登录逻辑,特别是整合代码时遇到的未使用变量警告和优化建议。现在他需要后端的Token实现,可能需要包括生成、验证和刷新Token的步骤。首先,我应该确定用户可能需要的技术栈。通常Spring Boot中使用JWT(JSON WebToken)是比较常见的方案,所以需要介绍JWT的依赖,比如jjwt。然后,分步骤讲解如何生成Token、验证Token的拦截器配置,以及如何将Token返回给前端。 用户可能需要代码示例,所以需要提供具体的Java类,比如JWT工具类、拦截器配置、Controller层的登录接口。同时,要提到如何将Token存储在响应头中,以及如何在后端进行验证。另外,用户可能关心安全性,比如密钥的管理、Token的过期时间、刷新机制等。需要提到这些最佳实践,比如使用配置文件存储密钥,设置合理的过期时间,使用拦截器进行鉴权。还要考虑可能的扩展问题,比如如何结合SpringSecurity,或者如何处理分布式系统中的Token验证。这些可以作为相关问题推荐给用户,帮助他们进一步学习。 需要确保回答结构清晰,分步骤说明,代码示例正确,并且符合中文语法。同时,按照用户的要求,数学公式使用正确的LaTeX格式,比如密钥生成中的随机数可以用数学表达式表示,但可能在这个问题中不太需要,所以可能不需要太多数学内容,但如果有涉及算法的地方要正确使用。最后,生成的相关问题需要与Token实现相关,比如如何实现自动刷新、如何结合SpringSecurity、分布式系统中的应用等。确保问题有针对性,帮助用户深入探索。</think>### Spring Boot后端JWT Token登录实现示例 #### 1. **基础依赖配置** ```xml <!-- pom.xml --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.5</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.5</version> </dependency> ``` #### 2. **JWT工具类** ```java // JwtUtils.java public class JwtUtils { private static final String SECRET_KEY = Base64.getEncoder().encodeToString("your-256-bit-secret".getBytes()); // $k \in \{0,1\}^{256}$ private static final long EXPIRATION = 3600 * 1000; // 1小时 public static String generateToken(String username) { return Jwts.builder() .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION)) .signWith(Keys.hmacShaKeyFor(SECRET_KEY.getBytes())) .compact(); } public static Claims parseToken(String token) { return Jwts.parserBuilder() .setSigningKey(SECRET_KEY.getBytes()) .build() .parseClaimsJws(token) .getBody(); } } ``` #### 3. **登录接口实现** ```java // AuthController.java @RestController @RequestMapping("/api/auth") public class AuthController { @PostMapping("/login") public ResponseEntity<?> login(@RequestBody LoginRequest request) { // 1. 验证用户凭证 if (!validateUser(request.getUsername(), request.getPassword())) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } // 2. 生成JWT String token = JwtUtils.generateToken(request.getUsername()); // 3. 返回响应 return ResponseEntity.ok() .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .body(Map.of( "username", request.getUsername(), "expires_in", JwtUtils.EXPIRATION )); } } ``` #### 4. **Token验证拦截器** ```java // JwtInterceptor.java public class JwtInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (token == null || !token.startsWith("Bearer ")) { response.sendError(HttpStatus.UNAUTHORIZED.value()); return false; } try { Claims claims = JwtUtils.parseToken(token.substring(7)); request.setAttribute("username", claims.getSubject()); return true; } catch (JwtException e) { response.sendError(HttpStatus.UNAUTHORIZED.value(), "Invalid token"); return false; } } } ``` #### 5. **安全配置** ```java // WebSecurityConfig.java @Configuration public class WebSecurityConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new JwtInterceptor()) .addPathPatterns("/api/**") .excludePathPatterns("/api/auth/login"); } } ``` --- ### 核心算法说明 1. **Token生成算法** 使用HMAC-SHA256签名算法生成JWT: $$ \text{signature} = \text{HMAC}_{SHA256}(\text{base64UrlEncode(header)} + "." + \text{base64UrlEncode(payload)}, \text{secret}) $$ 2. **Token验证流程** 验证流程可表示为有限状态自动机: $$ S = \{ \text{未认证}, \text{已认证}, \text{过期} \} \\ \delta(s, a) = \begin{cases} \text{已认证} & \text{if } a=\text{有效请求} \\ \text{过期} & \text{if } t > t_{\text{exp}} \\ \text{未认证} & \text{otherwise} \end{cases} $$ --- ### 最佳实践建议 1. **密钥管理** 建议使用环境变量存储密钥: ```yaml # application.yml jwt: secret: ${JWT_SECRET:default-secret} expiration: 3600 ``` 2. **动态过期时间** 根据业务需求设置不同过期策略: ```java // 刷新token的过期时间计算 long newExpiration = System.currentTimeMillis() + (isRememberMe ? 7*24*3600*1000 : 3600*1000); ``` 3. **黑名单机制** 实现主动注销功能: ```java // Token黑名单服务 public class TokenBlacklist { private static final Set<String> blacklist = ConcurrentHashMap.newKeySet(); public static void invalidate(String token) { blacklist.add(token); } public static boolean isInvalid(String token) { return blacklist.contains(token); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值