01-认证机制详解

张开发
2026/4/16 23:33:33 15 分钟阅读

分享文章

01-认证机制详解
Spring Security 认证机制详解一、知识概述认证(Authentication)是安全框架的基础,用于验证用户身份的合法性。Spring Security 提供了完整的认证体系,支持多种认证方式,包括表单登录、HTTP Basic、OAuth2、JWT 等。认证的核心概念:Principal:认证主体(用户)Credentials:认证凭证(密码)Authentication:认证对象AuthenticationManager:认证管理器理解认证机制的原理,是构建安全应用的基础。二、知识点详细讲解2.1 认证流程用户请求 │ ▼ AuthenticationFilter(认证过滤器) │ ├── 提取认证信息 │ ▼ AuthenticationManager(认证管理器) │ ├── 调用 Provider 进行认证 │ ▼ AuthenticationProvider(认证提供者) │ ├── 调用 UserDetailsService 加载用户 │ ▼ UserDetailsService(用户详情服务) │ ├── 查询数据库获取用户信息 │ ▼ PasswordEncoder(密码编码器) │ ├── 验证密码 │ ▼ 认证成功/失败 │ ├── 成功:存储 Authentication 到 SecurityContext │ └── 失败:抛出 AuthenticationException2.2 核心组件SecurityContext存储当前用户的认证信息通过 SecurityContextHolder 访问Authentication代表认证对象包含 Principal、Credentials、AuthoritiesAuthenticationManager认证管理器协调认证过程AuthenticationProvider实际执行认证支持不同的认证方式2.3 认证方式对比方式特点适用场景表单登录用户名密码传统 Web 应用HTTP Basic简单认证API 测试JWT Token无状态前后端分离OAuth2第三方授权社交登录LDAP企业目录企业内部应用三、代码示例3.1 基础安全配置importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.config.annotation.web.builders.HttpSecurity;importorg.springframework.security.config.annotation.web.configuration.EnableWebSecurity;importorg.springframework.security.web.SecurityFilterChain;@Configuration@EnableWebSecuritypublicclassSecurityConfig{@BeanpublicSecurityFilterChainfilterChain(HttpSecurityhttp)throwsException{http// 授权配置.authorizeHttpRequests(auth-auth.requestMatchers("/public/**").permitAll().requestMatchers("/admin/**").hasRole("ADMIN").anyRequest().authenticated())// 表单登录.formLogin(form-form.loginPage("/login").defaultSuccessUrl("/home").permitAll())// 登出配置.logout(logout-logout.logoutUrl("/logout").logoutSuccessUrl("/login?logout").permitAll());returnhttp.build();}}3.2 自定义用户认证importorg.springframework.security.core.userdetails.*;importorg.springframework.stereotype.Service;@ServicepublicclassCustomUserDetailsServiceimplementsUserDetailsService{@AutowiredprivateUserRepositoryuserRepository;@OverridepublicUserDetailsloadUserByUsername(Stringusername)throwsUsernameNotFoundException{Useruser=userRepository.findByUsername(username).orElseThrow(()-newUsernameNotFoundException("用户不存在: "+username));// 转换为 UserDetailsreturnnewCustomUserDetails(user);}}// 自定义 UserDetailspublicclassCustomUserDetailsimplementsUserDetails{privatefinalUseruser;privatefinalListGrantedAuthorityauthorities;publicCustomUserDetails(Useruser){this.user=user;this.authorities=user.getRoles().stream().map(role-newSimpleGrantedAuthority("ROLE_"+role.getName())).collect(Collectors.toList());}@OverridepublicStringgetUsername(){returnuser.getUsername();}@OverridepublicStringgetPassword(){returnuser.getPassword();}@OverridepublicCollection?extendsGrantedAuthoritygetAuthorities(){returnauthorities;}@OverridepublicbooleanisAccountNonExpired(){returntrue;}@OverridepublicbooleanisAccountNonLocked(){return!user.isLocked();}@OverridepublicbooleanisCredentialsNonExpired(){returntrue;}@OverridepublicbooleanisEnabled(){returnuser.isEnabled();/

更多文章