package com.test.bijihoudaun.util; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** * 安全工具类,提供与安全相关的实用方法 */ public class SecurityUtil { /** * 检查用户是否已认证 * 该方法用于判断当前用户是否已经通过身份验证,常用于控制对受保护资源的访问 * * @return 如果用户已认证返回true,否则返回false */ public static boolean isUserAuthenticated() { // 获取当前安全上下文中的认证信息 Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); // 检查认证对象是否存在以及是否已认证 if (authentication == null || !authentication.isAuthenticated()) { return false; } // 检查认证主体是否为UserDetails实例 Object principal = authentication.getPrincipal(); if (principal instanceof UserDetails) { return true; } return false; } /** * 获取当前已认证用户的用户名 * * @return 当前用户的用户名,如果用户未认证则返回null */ public static String getCurrentUsername() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null || !authentication.isAuthenticated()) { return null; } Object principal = authentication.getPrincipal(); if (principal instanceof UserDetails) { return ((UserDetails) principal).getUsername(); } // 如果不是UserDetails实例,尝试直接获取主体名称 return authentication.getName(); } /** * 获取当前已认证用户的UserDetails对象 * * @return 当前用户的UserDetails对象,如果用户未认证或主体不是UserDetails实例则返回null */ public static UserDetails getCurrentUserDetails() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null || !authentication.isAuthenticated()) { return null; } Object principal = authentication.getPrincipal(); if (principal instanceof UserDetails) { return (UserDetails) principal; } return null; } /** * 检查当前用户是否具有指定角色 * * @param role 要检查的角色名称(不需要前缀"ROLE_") * @return 如果用户具有该角色返回true,否则返回false */ public static boolean hasRole(String role) { UserDetails userDetails = getCurrentUserDetails(); if (userDetails == null) { return false; } // Spring Security的角色默认以"ROLE_"为前缀 String roleName = role.startsWith("ROLE_") ? role : "ROLE_" + role; return userDetails.getAuthorities().stream() .anyMatch(auth -> auth.getAuthority().equals(roleName)); } /** * 检查当前用户是否具有指定权限 * * @param permission 要检查的权限名称 * @return 如果用户具有该权限返回true,否则返回false */ public static boolean hasPermission(String permission) { UserDetails userDetails = getCurrentUserDetails(); if (userDetails == null) { return false; } return userDetails.getAuthorities().stream() .anyMatch(auth -> auth.getAuthority().equals(permission)); } /** * 检查当前用户是否为管理员 * 在本项目中,管理员角色定义为"ADMIN" * * @return 如果用户是管理员返回true,否则返回false */ public static boolean isAdmin() { return hasRole("ADMIN"); } /** * 获取当前已认证用户的ID * * @return 当前用户的ID,如果用户未认证则返回null */ public static Long getCurrentUserId() { String username = getCurrentUsername(); if (username == null) { return null; } return null; } }