127 lines
3.6 KiB
Java
127 lines
3.6 KiB
Java
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<SysUserDetails>
|
|
*/
|
|
public static Optional<SysUserDetails> 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<String> 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());
|
|
}
|
|
|
|
/**
|
|
* 是否超级管理员
|
|
* <p>
|
|
* 超级管理员忽视任何权限判断
|
|
*/
|
|
public static boolean isRoot() {
|
|
Set<String> 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);
|
|
}
|
|
|
|
|
|
}
|