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

个人网站的成本云南人事考试网官网

个人网站的成本,云南人事考试网官网,中国建设网官方网站6,优酷 嵌入 wordpress前言 在现代 Web 开发中,前后端分离架构已经成为主流。后端专注于提供 RESTful API,而前端通过 AJAX 请求与后端交互。在这种架构下,如何对用户进行 认证(Authentication) 和 授权(Authorization&#xff…

前言

在现代 Web 开发中,前后端分离架构已经成为主流。后端专注于提供 RESTful API,而前端通过 AJAX 请求与后端交互。在这种架构下,如何对用户进行 认证(Authentication)授权(Authorization) 成为了系统设计中的核心问题。

Spring Security 是 Spring 框架中用于构建安全系统的模块,它不仅提供了强大的安全机制,还支持灵活的自定义配置。本文将围绕 鉴权失败和成功时的行为、需要拦截的路径配置、以及具体的代码实现方式 展开讲解,并结合多个实际例子,帮助你深入理解 Spring Security 在前后端分离项目中的使用。

本文将从以下三个方面详细展开:

  1. 基础概念:包括认证、授权、关键组件及其作用;
  2. 配置流程:从登录请求到权限控制的完整流程;
  3. 实战示例:JWT 认证、异常处理、多种路径保护等具体实现;

无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供一套完整的解决方案。


一、基础概念详解

Spring Security 的核心在于 认证(Authentication)授权(Authorization)

1. SecurityFilterChain(安全过滤器链)

  • 作用:定义 HTTP 请求的安全策略。
  • 位置:通常在配置类中通过 @Bean 注解创建。
  • 示例
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> auth.requestMatchers("/public/**").permitAll().anyRequest().authenticated()).formLogin(withDefaults()).httpBasic(withDefaults());return http.build();
}

可以定义多个 SecurityFilterChain 来处理不同路径的权限策略。


2. UserDetailsService(用户详情服务)

  • 作用:负责加载用户信息(用户名、密码、权限)。
  • 实现方式
    • 内存方式(适合测试):
@Bean
public UserDetailsService userDetailsService() {UserDetails user = User.withUsername("user").password(passwordEncoder().encode("123456")).roles("USER").build();return new InMemoryUserDetailsManager(user);
}
  • 数据库方式(推荐生产环境):
@Service
public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("用户不存在"));return new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),getAuthorities(user.getRoles()));}private Collection<? extends GrantedAuthority> getAuthorities(Collection<Role> roles) {return roles.stream().map(role -> new SimpleGrantedAuthority("ROLE_" + role.getName())).collect(Collectors.toList());}
}

3. PasswordEncoder(密码编码器)

  • 作用:加密存储密码,并验证密码是否匹配。
  • 常用实现
    • BCryptPasswordEncoder(推荐)
    • NoOpPasswordEncoder(不加密,仅用于开发阶段)
@Bean
public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
}

4. JwtRequestFilter(自定义 JWT 过滤器)

  • 作用:拦截每个请求,解析 Token 并设置当前用户认证信息。
  • 实现方式
@Component
public class JwtRequestFilter extends OncePerRequestFilter {@Autowiredprivate JwtTokenUtil jwtTokenUtil;@Autowiredprivate UserDetailsService userDetailsService;@Overrideprotected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain filterChain)throws ServletException, IOException {String token = extractToken(request);if (token != null && jwtTokenUtil.validateToken(token)) {String username = jwtTokenUtil.getUsernameFromToken(token);UserDetails userDetails = userDetailsService.loadUserByUsername(username);UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));SecurityContextHolder.getContext().setAuthentication(authentication);}filterChain.doFilter(request, response);}private String extractToken(HttpServletRequest request) {String header = request.getHeader("Authorization");if (header != null && header.startsWith("Bearer ")) {return header.substring(7);}return null;}
}

5. AuthenticationEntryPoint(鉴权失败处理器)

  • 作用:当用户未认证访问受保护资源时触发该处理器。
  • 实现方式
@Component
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {@Overridepublic void commence(HttpServletRequest request,HttpServletResponse response,AuthenticationException authException) throws IOException {response.setContentType("application/json;charset=UTF-8");response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.getWriter().write("{\"error\": \"Unauthorized\", \"message\": \"认证失败,请重新登录\"}");}
}

6. AccessDeniedHandler(权限不足处理器)

  • 作用:当用户已认证但没有访问权限时触发。
  • 实现方式
@Component
public class JwtAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request,HttpServletResponse response,AccessDeniedException accessDeniedException) throws IOException {response.setContentType("application/json;charset=UTF-8");response.setStatus(HttpServletResponse.SC_FORBIDDEN);response.getWriter().write("{\"error\": \"Forbidden\", \"message\": \"你没有权限访问该资源\"}");}
}

二、配置流程详解

成功时的流程:

  1. 用户发送登录请求 → /api/auth/login
  2. 后端验证用户名密码,生成 JWT Token 并返回给前端
  3. 前端保存 Token(如 localStorage)
  4. 后续请求携带 Token(放在 Header 中)
  5. 后端通过自定义 JWT 过滤器解析 Token 并设置认证信息
  6. 用户访问受保护资源成功

失败时的流程:

  1. Token 缺失或格式错误 → 返回 401 Unauthorized
  2. Token 已过期或签名无效 → 返回 401 Unauthorized
  3. 用户没有权限访问某资源 → 返回 403 Forbidden

三、实战示例详解

示例 1:JWT Token 工具类(完整版)

@Component
public class JwtTokenUtil {private static final long JWT_TOKEN_VALIDITY = 5 * 60 * 60; // 5小时private String secret = "your-secret-key-here";public String getUsernameFromToken(String token) {return getClaimFromToken(token, Claims::getSubject);}public Date getExpirationDateFromToken(String token) {return getClaimFromToken(token, Claims::getExpiration);}public <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) {final Claims claims = getAllClaimsFromToken(token);return claimsResolver.apply(claims);}private Claims getAllClaimsFromToken(String token) {return Jwts.parserBuilder().setSigningKey(secret).build().parseClaimsJws(token).getBody();}private Boolean isTokenExpired(String token) {final Date expiration = getExpirationDateFromToken(token);return expiration.before(new Date());}public String generateToken(UserDetails userDetails) {Map<String, Object> claims = new HashMap<>();return doGenerateToken(claims, userDetails.getUsername());}private String doGenerateToken(Map<String, Object> claims, String subject) {return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis())).setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000)).signWith(SignatureAlgorithm.HS512, secret).compact();}public Boolean validateToken(String token, UserDetails userDetails) {final String username = getUsernameFromToken(token);return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));}
}

示例 2:登录接口

@RestController
@RequestMapping("/api/auth")
public class AuthController {@Autowiredprivate AuthenticationManager authenticationManager;@Autowiredprivate JwtTokenUtil jwtTokenUtil;@Autowiredprivate UserDetailsService userDetailsService;@PostMapping("/login")public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) throws Exception {try {authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()));} catch (AuthenticationException e) {throw new Exception("用户名或密码错误");}final UserDetails userDetails = userDetailsService.loadUserByUsername(loginRequest.getUsername());final String token = jwtTokenUtil.generateToken(userDetails);return ResponseEntity.ok().header("Authorization", "Bearer " + token).build();}
}

示例 3:多种路径保护方式

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.csrf(AbstractHttpConfigurer::disable).cors(cors -> cors.configurationSource(corsConfigurationSource())).sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)).addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class).exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(authenticationEntryPoint).accessDeniedHandler(accessDeniedHandler)).authorizeHttpRequests(auth -> auth.requestMatchers("/api/public/**").permitAll().requestMatchers("/api/admin/**").hasRole("ADMIN").requestMatchers("/api/user/**").hasAnyRole("USER", "ADMIN").anyRequest().authenticated());return http.build();
}

结语

本文从 Spring Security 的基础概念出发,详细介绍了认证与授权的核心组件,并结合多个实战示例展示了 JWT 的集成、路径保护、异常处理等常见场景的实现方式。


文章转载自:

http://tc6s5XfM.yqndr.cn
http://bYqwpZ8e.yqndr.cn
http://2Fnu7vR3.yqndr.cn
http://SdlwWWWT.yqndr.cn
http://rNQIL1Qq.yqndr.cn
http://FgqePspg.yqndr.cn
http://V2DdNJIa.yqndr.cn
http://p3cB1vZ8.yqndr.cn
http://bws9KSc6.yqndr.cn
http://2B0TQUXj.yqndr.cn
http://aRIijbFW.yqndr.cn
http://j98j4LHG.yqndr.cn
http://Z04v7l0b.yqndr.cn
http://Ke3uRQhO.yqndr.cn
http://TfLnKJd7.yqndr.cn
http://CI43Fb0J.yqndr.cn
http://fbZMjcNB.yqndr.cn
http://ngYxGFV1.yqndr.cn
http://Ct418MDk.yqndr.cn
http://t1S6BsxZ.yqndr.cn
http://a3r2NEwb.yqndr.cn
http://fJwpPjrT.yqndr.cn
http://Yas5Zo8o.yqndr.cn
http://f8C84zN1.yqndr.cn
http://UpzwdGJ0.yqndr.cn
http://S24qeeSj.yqndr.cn
http://Fh3KuZZZ.yqndr.cn
http://3laZbFbz.yqndr.cn
http://v2SijTk2.yqndr.cn
http://F9HGz6R9.yqndr.cn
http://www.dtcms.com/wzjs/641192.html

相关文章:

  • 海口市建设工程质量安全监督站网站上海比较好的公司排名
  • 提供网站建设设计查询企业营业执照怎么查
  • 免费网站中文源码下载香水推广软文
  • 网站左侧漂浮导航wordpress和织梦
  • 具有价值的微网站建设大连app网站建设
  • 电子商务网站建设李洪心课后答案做设计图的网站
  • 网站怎么做右上角消息提醒网站中的下拉菜单
  • 邦邻网站建设熊掌号深圳网站设计哪里好
  • 公司网站开发费用济南兴田德润o评价wordpress cad插件大全
  • 网站改版影响排名吗有哪些新手做外链的网站
  • mvc6 网站开发实战药店网站模板
  • 做网站用什么笔记本网站建设首页布局
  • 建设银行网站用户名怎么查seo批量建站方法
  • 网站建设公司华网天下公司网站代备案流程图
  • 推广网站模板自己如何做微信小程序
  • 4.请简述网站建设流程的过程Dw制作个人网站
  • 网站设计网站制作百度不收录网站首页
  • 如何在网盘上做网站乐陵seo公司
  • wordpress背景图案轮流网站seo问题
  • 网站注销主体无锡网站建设详细内容
  • 设计一个网站网站入侵怎么做
  • 前端电商网站登录界面怎么做凡科做网站技巧
  • 培训制作网站源码小程序开发教程和源码
  • 蛇口网站建设做设计的搜素材上什么网站
  • 滁州哪里做网站分销商城源码
  • 网站公司设计 网站首页维护网站需要多少钱
  • 网站建设中提示页面wordpress设置使用旧版编辑器
  • 江苏南京建设局官方网站最好seo的wordpress
  • 企业网站域名注册怎么接推广赚钱
  • 网站盈利模式公司怎么申请免费做网站