package com.youlai.boot.security.util; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.youlai.boot.common.constant.SecurityConstants; import com.youlai.boot.common.constant.SystemConstants; import com.youlai.boot.security.model.SysUserDetails; import jakarta.servlet.http.HttpServletRequest; import org.springframework.http.HttpHeaders; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import java.util.*; import java.util.stream.Collectors; /** * Spring Security 工具类 * * @author Ray * @since 2021/1/10 */ public class SecurityUtils { /** * 获取当前登录人信息 * * @return Optional */ public static Optional getUser() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null) { Object principal = authentication.getPrincipal(); if (principal instanceof SysUserDetails) { return Optional.of((SysUserDetails) principal); } } return Optional.empty(); } /** * 获取用户ID * * @return Long */ public static Long getUserId() { return getUser().map(SysUserDetails::getUserId).orElse(null); } /** * 获取用户账号 * * @return String 用户账号 */ public static String getUsername() { return getUser().map(SysUserDetails::getUsername).orElse(null); } /** * 获取部门ID * * @return Long */ public static Long getDeptId() { return getUser().map(SysUserDetails::getDeptId).orElse(null); } /** * 获取数据权限范围 * * @return Integer */ public static Integer getDataScope() { return getUser().map(SysUserDetails::getDataScope).orElse(null); } /** * 获取角色集合 * * @return 角色集合 */ public static Set getRoles() { return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()) .map(Authentication::getAuthorities) .filter(CollectionUtil::isNotEmpty) .stream() .flatMap(Collection::stream) .map(GrantedAuthority::getAuthority) // 筛选角色,authorities 中的角色都是以 ROLE_ 开头 .filter(authority -> authority.startsWith(SecurityConstants.ROLE_PREFIX)) .map(authority -> StrUtil.removePrefix(authority, SecurityConstants.ROLE_PREFIX)) .collect(Collectors.toSet()); } /** * 是否超级管理员 *

* 超级管理员忽视任何权限判断 */ public static boolean isRoot() { Set roles = getRoles(); return roles.contains(SystemConstants.ROOT_ROLE_CODE); } /** * 获取请求中的 Token * * @return Token 字符串 */ public static String getAccessToken() { ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()); if(Objects.isNull(servletRequestAttributes)) { return null; } HttpServletRequest request = servletRequestAttributes.getRequest(); return request.getHeader(HttpHeaders.AUTHORIZATION); } }