如何做网站网站成都学网站建设
2026/4/6 6:07:54 网站建设 项目流程
如何做网站网站,成都学网站建设,.net开发的网站能做优化吗,天津在哪做网站Spring Security入门#xff1a;构建安全应用 在Java开发领域#xff0c;Spring Security是实现应用安全的首选框架。深入了解这个强大的安全框架#xff0c;掌握认证与授权的核心技术。一、什么是Spring Security#xff1f; Spring Security是Spring生态系统中最强大的安…Spring Security入门构建安全应用在Java开发领域Spring Security是实现应用安全的首选框架。深入了解这个强大的安全框架掌握认证与授权的核心技术。一、什么是Spring SecuritySpring Security是Spring生态系统中最强大的安全框架它为Java应用提供全面的安全服务。无论是传统Web应用还是RESTful API甚至是微服务架构Spring Security都能提供可靠的安全保障。为什么选择Spring Security功能全面涵盖认证、授权、防护等所有安全需求高度可定制灵活扩展满足各种业务场景社区活跃Spring官方维护文档完善与Spring深度集成无缝衔接Spring Boot二、核心概念2.1 认证 vs 授权认证确认你是谁如登录验证授权确认你能做什么如权限控制2.2 核心组件三、项目搭建3.1 添加依赖parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.0/version /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-security/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependencies3.2 基础配置类Configuration EnableWebSecurity public class SecurityConfig { Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth - auth .requestMatchers(/public/**).permitAll() .anyRequest().authenticated() ) .formLogin(form - form .loginPage(/login) .defaultSuccessUrl(/home) ); return http.build(); } Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }四、认证流程详解Spring Security的认证流程是一个精心设计的链式处理过程用户提交认证信息用户名和密码创建Authentication对象封装认证信息AuthenticationManager验证委托给Provider加载用户详情通过UserDetailsService验证成功存入SecurityContext4.1 自定义用户详情服务Service public class CustomUserDetailsService implements UserDetailsService { Autowired private UserRepository userRepository; Override public UserDetails loadUserByUsername(String username) { User user userRepository.findByUsername(username) .orElseThrow(() - new UsernameNotFoundException(用户不存在)); return User.builder() .username(user.getUsername()) .password(user.getPassword()) .roles(user.getRoles().toArray(new String[0])) .build(); } }4.2 自置认证提供者Component public class CustomAuthenticationProvider implements AuthenticationProvider { Autowired private UserDetailsService userDetailsService; Autowired private PasswordEncoder passwordEncoder; Override public Authentication authenticate(Authentication authentication) { String username authentication.getName(); String password authentication.getCredentials().toString(); UserDetails userDetails userDetailsService.loadUserByUsername(username); if (passwordEncoder.matches(password, userDetails.getPassword())) { return new UsernamePasswordAuthenticationToken( username, password, userDetails.getAuthorities() ); } throw new BadCredentialsException(密码错误); } Override public boolean supports(Class? authentication) { return authentication.equals(UsernamePasswordAuthenticationToken.class); } }五、授权机制授权是指确定用户是否有权访问特定资源的过程。Spring Security支持多种授权方式。5.1 URL级别授权Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth - auth // 公开接口 .requestMatchers(/api/public/**).permitAll() // 管理员专属 .requestMatchers(/api/admin/**).hasRole(ADMIN) // 需要特定权限 .requestMatchers(/api/write/**).hasAuthority(WRITE) // 已认证用户 .anyRequest().authenticated() ); return http.build(); }5.2 方法级授权RestController RequestMapping(/api) public class ApiController { // 需要USER角色 GetMapping(/user) PreAuthorize(hasRole(USER)) public String userEndpoint() { return 用户专属内容; } // 需要ADMIN角色 GetMapping(/admin) PreAuthorize(hasRole(ADMIN)) public String adminEndpoint() { return 管理员专属内容; } // 复杂表达式 GetMapping(/secure) PreAuthorize(hasRole(ADMIN) and #username authentication.name) public String secureEndpoint(String username) { return 只能访问自己的数据; } // 返回后过滤 GetMapping(/data/{id}) PostAuthorize(returnObject.owner authentication.name) public Data getData(PathVariable Long id) { return dataService.findById(id); } }5.3 自定义权限注解Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) PreAuthorize(hasRole(ADMIN) or hasRole(SUPERVISOR)) public interface IsAdminOrSupervisor { }六、JWT令牌认证JWTJSON Web Token是目前最流行的跨域认证解决方案。6.1 JWT服务类Service public class JwtService { Value(${jwt.secret}) private String secret; Value(${jwt.expiration}) private Long expiration; public String generateToken(String username, ListString roles) { MapString, Object claims new HashMap(); claims.put(roles, roles); return Jwts.builder() .claims(claims) .subject(username) .issuedAt(new Date()) .expiration(new Date(System.currentTimeMillis() expiration)) .signWith(getSigningKey()) .compact(); } public String extractUsername(String token) { return extractClaims(token).getSubject(); } public boolean validateToken(String token, String username) { String extractedUsername extractUsername(token); return extractedUsername.equals(username) !isTokenExpired(token); } private Claims extractClaims(String token) { return Jwts.parser() .verifyWith(getSigningKey()) .build() .parseSignedClaims(token) .getPayload(); } }6.2 JWT认证过滤器Component public class JwtAuthenticationFilter extends OncePerRequestFilter { Autowired private JwtService jwtService; Override protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String token extractTokenFromRequest(request); if (token ! null SecurityContextHolder.getContext().getAuthentication() null) { String username jwtService.extractUsername(token); if (username ! null) { ListString roles jwtService.extractRoles(token); UsernamePasswordAuthenticationToken authToken new UsernamePasswordAuthenticationToken( username, null, roles.stream() .map(role - new SimpleGrantedAuthority(ROLE_ role)) .collect(Collectors.toList()) ); SecurityContextHolder.getContext().setAuthentication(authToken); } } filterChain.doFilter(request, response); } private String extractTokenFromRequest(HttpServletRequest request) { String bearerToken request.getHeader(Authorization); if (bearerToken ! null bearerToken.startsWith(Bearer )) { return bearerToken.substring(7); } return null; } }6.3 登录控制器RestController RequestMapping(/api/auth) public class AuthController { Autowired private AuthenticationManager authenticationManager; Autowired private JwtService jwtService; PostMapping(/login) public LoginResponse login(RequestBody LoginRequest request) { Authentication authentication authenticationManager.authenticate( new UsernamePasswordAuthenticationToken( request.getUsername(), request.getPassword() ) ); User user (User) authentication.getPrincipal(); String token jwtService.generateToken( user.getUsername(), user.getAuthorities().stream() .map(GrantedAuthority::getAuthority) .collect(Collectors.toList()) ); return new LoginResponse(token, user.getUsername()); } }七、过滤器链机制Spring Security通过过滤器链处理所有HTTP请求理解过滤器链的工作原理对定制安全功能至关重要。7.1 常用过滤器7.2 自定义过滤器public class CustomFilter extends OncePerRequestFilter { Override protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 前置处理 String requestId UUID.randomUUID().toString(); request.setAttribute(requestId, requestId); // 继续过滤器链 filterChain.doFilter(request, response); // 后置处理 logger.info(Request {} completed, requestId); } } // 注册自定义过滤器 Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { http.addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); }八、异常处理Component public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint { Override public void commence( HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.setContentType(application/json;charsetUTF-8); ApiResponse? apiResponse ApiResponse.unauthorized(未登录或登录已过期); response.getWriter().write(new ObjectMapper().writeValueAsString(apiResponse)); } } Component public class CustomAccessDeniedHandler implements AccessDeniedHandler { Override public void handle( HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException { response.setStatus(HttpServletResponse.SC_FORBIDDEN); response.setContentType(application/json;charsetUTF-8); ApiResponse? apiResponse ApiResponse.error(权限不足); response.getWriter().write(new ObjectMapper().writeValueAsString(apiResponse)); } }九、应用场景9.1 企业后台系统典型的RBAC基于角色的访问控制场景用户表、角色表、权限表用户-角色、角色-权限多对多关系支持动态权限配置9.2 API网关统一认证授权中心JWT令牌签发与验证单点登录支持第三方登录集成十、总结Spring Security是企业级Java应用的安全基石核心功能认证与授权扩展能力过滤器链、自定义提供者现代方案JWT、OAuth2

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询