fix: 码全代码添加

This commit is contained in:
2024-10-11 15:56:51 +08:00
parent 9a853f40c2
commit 7776e95902
907 changed files with 81296 additions and 324 deletions

View File

@@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright (c) 2023 codvision.com All Rights Reserved.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.codvision</groupId>
<artifactId>cvbp-public</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cvbp-auth-core</artifactId>
<packaging>jar</packaging>
<version>1.0.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.codvision</groupId>
<artifactId>cvbp-common-core</artifactId>
</dependency>
<dependency>
<groupId>com.codvision</groupId>
<artifactId>cvbp-common-feign</artifactId>
</dependency>
<dependency>
<groupId>com.codvision</groupId>
<artifactId>cvbp-cache-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,21 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.annotation;
import java.lang.annotation.*;
/**
* 权限注解
*
* @author lingee
* @date 2023/7/28
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequiresPermissions {
String value() default "";
}

View File

@@ -0,0 +1,90 @@
package com.codvision.authcore.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 组织信息
* </p>
*
* @author lingee
* @since 2023-11-10
*/
@Data
@ApiModel(value = "Org", description = "组织信息")
public class OrgBean implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("组织id")
private Integer oid;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("全称")
private String fullname;
@ApiModelProperty("类型")
private Integer type;
@ApiModelProperty("等级")
private Short level;
@ApiModelProperty("父组织编码")
private Integer poid;
private String geom;
@ApiModelProperty("排序")
private Integer orderby;
@ApiModelProperty("组织路径")
private String path;
@ApiModelProperty("边界数据")
private String wkt;
@ApiModelProperty("组织id路径")
private String oidPath;
private String refOid;
private String geoJson;
@ApiModelProperty("备注")
private String remark;
private String refCode;
@ApiModelProperty("行政区域id")
private Integer districtOid;
@ApiModelProperty("删除标记,1:已删除,0:正常")
private Short delFlag;
@ApiModelProperty("逻辑删除辅助字段")
private Integer delKey;
@ApiModelProperty("专有钉钉部门code")
private String zzdOrgCode;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("行政区划编码")
private String districtCode;
@ApiModelProperty("组织属性id")
private Integer orgPropertyId;
}

View File

@@ -0,0 +1,42 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.bean;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 分页数据
*
* @author lingee
* @date 2023/9/21
*/
@Data
public class PageData<T> implements Serializable {
private static final long serialVersionUID = -6577523148643960799L;
/**
* 总数
*/
private int total = 0;
/**
* 当前页
*/
private int page = 1;
/**
* 页大小
*/
private int size = 20;
/**
* 数据
*/
private List<T> list;
}

View File

@@ -0,0 +1,87 @@
package com.codvision.authcore.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 系统菜单展示信息
* </p>
*
* @author lingee
* @since 2023-11-09
*/
@Getter
@Setter
@ApiModel(value = "SysMenuVO", description = "系统菜单展示信息")
public class SysMenuBean implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("ID")
private Integer id;
@ApiModelProperty("菜单名称")
private String name;
@ApiModelProperty("菜单父id")
private Integer pid;
@ApiModelProperty("菜单权限标识")
private String permission;
@ApiModelProperty("前端路由标识路径")
private String url;
@ApiModelProperty("类型")
private Short type;
@ApiModelProperty("排序值")
private Short sortOrder;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("删除标记,1:已删除,0:正常")
private Short delFlag;
@ApiModelProperty("逻辑删除辅助字段")
private Integer delKey;
@ApiModelProperty("菜单图标")
private String icon;
@ApiModelProperty("是否隐藏")
private Boolean isHidden;
@ApiModelProperty("组件地址")
private String component;
@ApiModelProperty("布局是否可见")
private Boolean layout;
@ApiModelProperty("跳转地址")
private String redirect;
@ApiModelProperty("目标地址")
private String target;
@ApiModelProperty("所属分类")
private String category;
@ApiModelProperty("是否默认")
private Boolean isDefault;
@ApiModelProperty("菜单路径")
private String pathName;
}

View File

@@ -0,0 +1,76 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* <p>
* 系统角色展示信息
* </p>
*
* @author lingee
* @since 2023-11-09
*/
@Getter
@Setter
@ApiModel(value = "SysRoleVO", description = "系统角色展示信息")
public class SysRoleBean implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("ID")
private Integer id;
@ApiModelProperty("角色名称")
private String roleName;
@ApiModelProperty("角色标识")
private String roleCode;
@ApiModelProperty("角色描述")
private String roleDesc;
@ApiModelProperty("数据权限类型")
private Short dsType;
@ApiModelProperty("数据权限作用范围")
private Short dsScope;
@ApiModelProperty("删除标记,1:已删除,0:正常")
private Short delFlag;
@ApiModelProperty("逻辑删除辅助字段")
private Short delKey;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("是否默认")
private Short isDefault;
@ApiModelProperty("父角色id")
private Integer pId;
@ApiModelProperty("角色等级")
private Short level;
@ApiModelProperty("角色的菜单")
private List<SysMenuBean> roleMenus;
@ApiModelProperty("角色的子角色")
private List<SysRoleBean> child = new ArrayList<>();
}

View File

@@ -0,0 +1,129 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* <p>
* 系统用户展示信息
* </p>
*
* @author lingee
* @since 2023-11-09
*/
@Data
@ApiModel(value = "SysUserBean", description = "系统用户展示信息")
public class SysUserBean implements Serializable {
private static final long serialVersionUID = 1L;
private String token;
@ApiModelProperty("ID")
private Long id;
@ApiModelProperty("用户登陆名")
private String loginName;
@ApiModelProperty("登陆密码")
private String password;
@ApiModelProperty("用户真实姓名")
private String name;
@ApiModelProperty("用户联系方式")
private String mobile;
@ApiModelProperty("拓展字段:昵称")
private String nickname;
@ApiModelProperty("拓展字段:头像")
private String avatarUrl;
@ApiModelProperty("拓展字段:邮箱")
private String email;
@ApiModelProperty("浙政钉ID")
private String zzdId;
@ApiModelProperty("微信服务号openID")
private String wxMpOpenid;
@ApiModelProperty("删除标记,1:已删除,0:正常")
private Short delFlag;
@ApiModelProperty("逻辑删除辅助字段")
private Short delKey;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("最近一次密码更新的时间")
private Date pwdLastUpdatedTime;
@ApiModelProperty("普通钉钉userid")
private String dingTalkUid;
@ApiModelProperty("微信unionId")
private String wxUnionid;
@ApiModelProperty("微信小程序openID")
private String wxMaOpenid;
@ApiModelProperty("三方同步来的用户唯一id")
private String syncId;
@ApiModelProperty("当前组织OID")
private Integer activeOid;
@ApiModelProperty("当前组织父级OID")
private Integer activePoid;
@ApiModelProperty("当前组织名称")
private String activeOrgName;
@ApiModelProperty("当前组织路径")
private String activeOrgPath;
@ApiModelProperty("当前角色ID")
private Integer activeRoleId;
@ApiModelProperty("当前角色名称")
private String activeRoleName;
@ApiModelProperty("当前角色编码")
private String activeRoleCode;
@ApiModelProperty("关联信息(组织与角色)")
private List<UserAssociatedInfoBean> associatedInfos;
@ApiModelProperty("是否已禁用")
private Boolean isForbidden;
@ApiModelProperty(value = "状态0未读1已读")
private Integer readStatus;
@ApiModelProperty(value = "通知消息是否撤回0否1是")
private Integer flagDel;
@ApiModelProperty("组织角色")
private UserOrgRoleBean activeOrgRole;
@ApiModelProperty("组织角色列表")
private List<UserOrgRoleBean> orgRoles;
}

View File

@@ -0,0 +1,34 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.bean;
import lombok.Data;
import java.io.Serializable;
/**
* <p>
* 系统角色展示信息
* </p>
*
* @author lingee
* @since 2023-11-09
*/
@Data
public class UserAssociatedInfoBean implements Serializable {
private static final long serialVersionUID = -2558572689076752915L;
private Integer oid;
private String orgName;
private String orgPath;
private Integer orgLevel;
private Integer roleId;
private String roleName;
private Integer roleLevel;
private String roleCode;
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 组织用户关联信息展示信息
* </p>
*
* @author lingee
* @since 2023-11-10
*/
@Data
@ApiModel(value = "UserOrgRoleVO", description = "组织用户关联信息展示信息")
public class UserOrgRoleBean implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("用户UID")
private Integer uid;
@ApiModelProperty("组织OID")
private Integer oid;
@ApiModelProperty("角色ID")
private Integer roleId;
@ApiModelProperty("是否开启")
private Short flagEnabled;
@ApiModelProperty("排序字段")
private Integer orderby;
@ApiModelProperty("角色编码")
private String roleCode;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("组织信息")
private OrgBean org;
@ApiModelProperty("角色信息")
private SysRoleBean role;
}

View File

@@ -0,0 +1,68 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.config;
import com.codvision.authcore.interceptor.AuthInterceptor;
import com.codvision.authcore.service.IAuthService;
import com.codvision.authcore.service.impl.AuthService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
/**
* 认证配置类
*
* @author lingee
* @date 2023/7/19
*/
@Configuration
@ConditionalOnProperty(value = "cvbp.auth.enabled", havingValue = "true", matchIfMissing = true)
public class AuthConfig implements WebMvcConfigurer {
@Resource
private AuthProperties authProperties;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor())
.excludePathPatterns("/v1/sysUser/login",
"/v1/sysUser/verifyCode",
"/v1/sysUser/loginByMobile",
"/v1/sysUser/loginSignature",
"/v1/manager/sysConfig/getListByKeys",
"/v1/manager/sysFile/preview/**",
"/v1/manager/sysFile/download/**",
"/v1/manager/website/addRecord",
"/customCaptcha/get",
"/captcha/get",
"/captcha/check",
"/backend/**",
"/**/error",
"/**/doc.*",
"/**/swagger-ui.*",
"/swagger-resources/**",
"/**/webjars/**",
"/favicon.ico",
"/**/v2/api-docs/**")
.addPathPatterns(authProperties.getIncludes());
}
@Bean
@ConditionalOnMissingBean(name = "authCenterConfig")
public IAuthService authService() {
return new AuthService();
}
@Bean
public AuthInterceptor authInterceptor() {
return new AuthInterceptor();
}
}

View File

@@ -0,0 +1,56 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* 认证配置属性
*
* @author lingee
* @date 2023/7/25
*/
@Data
@Configuration
@ConfigurationProperties("cvbp.auth")
public class AuthProperties {
/**
* 未授权登录跳转地址
*/
public String authRedirectUrl = "";
/**
* 是否开启
*/
public Boolean enabled = true;
/**
* 登录地址
*/
private String host = "";
/**
* token名称
*/
private String tokenName = "Authorization";
/**
* cookie名称
*/
private String cookieName = "Authorization";
/**
* 排除地址
*/
private String excludes = "";
/**
* 拦截地址
*/
private String includes = "/**";
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.constants;
/**
* 认证模块常量类
*
* @author lingee
* @date 2023/11/22
*/
public final class AuthCoreConstant {
/**
* 用户信息缓存
*/
public static final String LOGIN_USER_EXPIRE_PREFIX = "user:auth:";
/**
* 用户权限缓存
*/
public static final String LOGIN_USER_PERMISSION_EXPIRE_PREFIX = "user:permission:";
/**
* 页面嵌入标识
*/
public static final String IframeDownFlag = "iframeDown";
}

View File

@@ -0,0 +1,91 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.interceptor;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.codvision.authcore.annotation.RequiresPermissions;
import com.codvision.authcore.bean.SysMenuBean;
import com.codvision.authcore.bean.SysUserBean;
import com.codvision.authcore.config.AuthProperties;
import com.codvision.authcore.constants.AuthCoreConstant;
import com.codvision.authcore.service.IAuthService;
import com.codvision.authcore.util.RequestUtil;
import com.codvision.commoncore.exception.AuthException;
import com.codvision.commoncore.exception.PermissionException;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Optional;
/**
* 认证拦截器
*
* @author lingee
* @date 2023/8/3
*/
public class AuthInterceptor implements HandlerInterceptor {
@Resource
private AuthProperties authProperties;
@Resource
private IAuthService authService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
final String path = request.getServletPath();
if (RequestUtil.isExcludedUri(path, authProperties.getExcludes())) {
return true;
}
final String token = authService.getAuthToken(request);
Optional.ofNullable(token).orElseThrow(() -> new AuthException(10002));
SysUserBean sysUser = authService.getCurrentUserInfo(token);
Optional.ofNullable(sysUser).orElseThrow(() -> new AuthException(10002));
if (handler.getClass().isAssignableFrom(HandlerMethod.class)) {
RequiresPermissions permissions = getRequiresPermissions((HandlerMethod) handler);
if (ObjectUtil.isEmpty(permissions)) {
return true;
}
String code = permissions.value();
if (StrUtil.isNotBlank(code)) {
Optional.ofNullable(sysUser.getActiveRoleId()).orElseThrow(() -> new PermissionException("当前用户无授权角色"));
List<SysMenuBean> sysMenus = authService.getMenuList(token);
if (CollectionUtils.isEmpty(sysMenus)) {
throw new PermissionException("当前用户无菜单权限");
}
if (sysMenus.stream().filter(x -> code.equals(x.getPermission())).count() == 0) {
throw new PermissionException("当前用户无访问权限");
}
}
}
return true;
}
/**
* 获取hander上的RequiresPermissions注解
*
* @param handler 处理对象
* @return 注解
*/
private RequiresPermissions getRequiresPermissions(HandlerMethod handler) {
RequiresPermissions requiresPermissions = handler.getMethodAnnotation(RequiresPermissions.class);
if (ObjectUtils.isEmpty(requiresPermissions)) {
requiresPermissions = AnnotatedElementUtils.getMergedAnnotation(handler.getBean().getClass(), RequiresPermissions.class);
}
return requiresPermissions;
}
}

View File

@@ -0,0 +1,11 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
/**
* 统一认证模块
*
* @author lingee
* @date 2023/7/17
*/
package com.codvision.authcore;

View File

@@ -0,0 +1,48 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.remote;
import com.codvision.authcore.bean.PageData;
import com.codvision.authcore.bean.SysMenuBean;
import com.codvision.authcore.bean.SysUserBean;
import com.codvision.authcore.remote.fallback.RemoteAuthServiceFallback;
import com.codvision.commoncore.common.ResponseEntity;
import com.codvision.commonfeign.config.OpenFeignConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 认证服务远程调用
*
* @author lingee
* @date 2023/7/18
*/
@FeignClient(name = "remote-auth-sevice", url = "${cvbp.auth.host}", fallback = RemoteAuthServiceFallback.class,
configuration = OpenFeignConfig.class)
public interface RemoteAuthService {
/**
* 获取当前登录用户信息
*
* @param token token
* @return 用户信息
*/
@PostMapping("/sysUser/getUserInfo")
ResponseEntity<SysUserBean> getUserInfo(@RequestHeader(value = "Authorization") String token);
/**
* 获取权限菜单列表
*
* @param page 当前页
* @param size 页面大小lø
* @return 菜单列表
*/
@PostMapping("/findAll")
ResponseEntity<PageData<SysMenuBean>> getUserMenus(@RequestHeader(value = "Authorization") String token,
@RequestParam(value = "page", required = false, defaultValue = "1") int page,
@RequestParam(value = "size", required = false, defaultValue = "1000") int size);
}

View File

@@ -0,0 +1,43 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.remote.fallback;
import com.codvision.authcore.bean.PageData;
import com.codvision.authcore.bean.SysMenuBean;
import com.codvision.authcore.bean.SysUserBean;
import com.codvision.authcore.remote.RemoteAuthService;
import com.codvision.commoncore.common.ResponseEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 认证服务调用反馈
*
* @author lingee
* @date 2023/7/19
*/
@Service
@Slf4j
public class RemoteAuthServiceFallback implements RemoteAuthService {
private ResponseEntity failResponse() {
ResponseEntity response = new ResponseEntity();
response.error(990000).message("认证服务调用失败");
log.error(response.getMessage());
return response;
}
@Override
public ResponseEntity<SysUserBean> getUserInfo(String token) {
return failResponse();
}
@Override
public ResponseEntity<PageData<SysMenuBean>> getUserMenus(String token, int page, int size) {
return failResponse();
}
}

View File

@@ -0,0 +1,53 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.service;
import com.codvision.authcore.bean.SysMenuBean;
import com.codvision.authcore.bean.SysUserBean;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* 认证接口
*
* @author lingee
* @date 2023/7/18
*/
public interface IAuthService {
/**
* 获取当前登录用户信息
*
* @param token token
* @return 用户
*/
SysUserBean getCurrentUserInfo(String token);
/**
* 获取上下文的token信息
*
* @param request 请求
* @return token
*/
String getAuthToken(HttpServletRequest request);
/**
* 获取菜单列表
*
* @param token token
* @return 菜单列表
*/
List<SysMenuBean> getMenuList(String token);
/**
* 根据用户名密码登录
*
* @param username 用户名
* @param password 密码
* @return 登录用户信息
*/
SysUserBean loginByUsernameAndPassword(String username, String password);
}

View File

@@ -0,0 +1,102 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.codvision.authcore.bean.PageData;
import com.codvision.authcore.bean.SysMenuBean;
import com.codvision.authcore.bean.SysUserBean;
import com.codvision.authcore.config.AuthProperties;
import com.codvision.authcore.remote.RemoteAuthService;
import com.codvision.authcore.service.IAuthService;
import com.codvision.authcore.util.RequestUtil;
import com.codvision.cachecore.utils.RedisUtil;
import com.codvision.commoncore.common.ResponseEntity;
import com.codvision.commoncore.utils.ResponseUtil;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import static com.codvision.authcore.constants.AuthCoreConstant.IframeDownFlag;
import static com.codvision.authcore.constants.AuthCoreConstant.LOGIN_USER_EXPIRE_PREFIX;
/**
* 认证服务
*
* @author lingee
* @date 2023/7/17
*/
public class AuthService implements IAuthService {
@Resource
private RemoteAuthService remoteAuthService;
@Resource
private AuthProperties authProperties;
@Override
public SysUserBean getCurrentUserInfo(String token) {
String key = LOGIN_USER_EXPIRE_PREFIX + token;
if (RedisUtil.hasKey(key)) {
SysUserBean sysUser = RedisUtil.get(key);
if (ObjectUtil.isNotEmpty(sysUser)) {
return sysUser;
}
}
ResponseEntity<SysUserBean> response = remoteAuthService.getUserInfo(token);
if (!ResponseUtil.isSuccess(response)) {
return null;
}
SysUserBean sysUser = response.getData();
RedisUtil.set(key, sysUser);
return sysUser;
}
@Override
public String getAuthToken(HttpServletRequest request) {
String tokenName = authProperties.getTokenName();
String cookieName = authProperties.getCookieName();
String token = request.getParameter(tokenName);
if (StrUtil.isNotBlank(token)) {
return token;
}
token = RequestUtil.getFromCookie(request, cookieName);
if (StrUtil.isNotBlank(token)) {
return token;
}
token = request.getHeader(tokenName);
if (StrUtil.isNotBlank(token)) {
return token;
}
final String iframeDown = request.getParameter(IframeDownFlag);
if (StrUtil.isNotBlank(iframeDown)) {
token = request.getParameter(tokenName);
}
return token;
}
@Override
public List<SysMenuBean> getMenuList(String token) {
ResponseEntity<PageData<SysMenuBean>> response = remoteAuthService.getUserMenus(token, 1, 10000);
if (!ResponseUtil.isSuccess(response)) {
return null;
}
PageData<SysMenuBean> data = response.getData();
return data.getList();
}
@Override
public SysUserBean loginByUsernameAndPassword(String username, String password) {
return null;
}
}

View File

@@ -0,0 +1,79 @@
/*
* Copyright (c) 2023 codvision.com All Rights Reserved.
*/
package com.codvision.authcore.util;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.codvision.authcore.bean.SysUserBean;
import com.codvision.authcore.service.IAuthService;
import com.codvision.commoncore.exception.AuthException;
import org.springframework.context.ApplicationContext;
import java.util.Optional;
/**
* 认证工具类
*
* @author lingee
* @date 2023/7/18
*/
public class AuthUtil {
/**
* 获取token
*
* @return token
*/
public static String getToken() {
ApplicationContext context = SpringUtil.getApplicationContext();
if (!context.containsBean("authService")) {
return null;
}
IAuthService authService = SpringUtil.getBean(IAuthService.class);
return authService.getAuthToken(RequestUtil.getRequest());
}
/**
* 获取当前登录用户信息
*
* @return 用户信息
*/
public static SysUserBean getCurrentUser() {
ApplicationContext context = SpringUtil.getApplicationContext();
if (!context.containsBean("authService")) {
return new SysUserBean();
}
IAuthService authService = SpringUtil.getBean(IAuthService.class);
String token = authService.getAuthToken(RequestUtil.getRequest());
Optional.ofNullable(token).orElseThrow(() -> new AuthException(10002));
SysUserBean sysUser = authService.getCurrentUserInfo(token);
Optional.ofNullable(sysUser).orElseThrow(() -> new AuthException(10002));
return sysUser;
}
/**
* 判断是否已登录
*
* @return
*/
public static boolean isLogin() {
ApplicationContext context = SpringUtil.getApplicationContext();
if (!context.containsBean("authService")) {
return false;
}
IAuthService authService = SpringUtil.getBean(IAuthService.class);
String token = authService.getAuthToken(RequestUtil.getRequest());
if (StrUtil.isBlank(token)) {
return false;
}
SysUserBean sysUser = authService.getCurrentUserInfo(token);
if (ObjectUtil.isEmpty(sysUser)) {
return false;
}
return true;
}
}

View File

@@ -0,0 +1,124 @@
package com.codvision.authcore.util;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.servlet.ServletUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.Objects;
/**
* 请求工具类
*
* @author lingee
* @date 2023/7/18
*/
public class RequestUtil {
public static final String ClientIp = "client-ip";
public static String getIp() {
final HttpServletRequest httpServletRequest = getRequest();
if (httpServletRequest == null) {
return null;
}
return getIp(httpServletRequest);
}
public static String getFromHead(String name) {
if (StrUtil.isBlank(name)) {
return null;
}
final HttpServletRequest httpServletRequest = getRequest();
if (httpServletRequest == null) {
return null;
}
return httpServletRequest.getHeader(name);
}
public static String getFromCookie(HttpServletRequest request, String cookieName) {
Cookie cookie = ServletUtil.getCookie(request, cookieName);
if (cookie != null) {
return cookie.getValue();
}
return null;
}
private static String getIp(HttpServletRequest httpServletRequest) {
String ip = httpServletRequest.getHeader(ClientIp);
if (StrUtil.isBlank(ip)) {
ip = ServletUtil.getClientIP(httpServletRequest);
}
return ip;
}
public static String getRequestPath() {
final HttpServletRequest httpServletRequest = getRequest();
if (httpServletRequest == null) {
return null;
}
return httpServletRequest.getServletPath();
}
public static String getContextPath() {
final HttpServletRequest request = getRequest();
if (request == null) {
return "/";
}
return request.getContextPath();
}
public static HttpServletRequest getRequest() {
RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
if (attrs == null) {
return null;
}
final ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) attrs;
return servletRequestAttributes.getRequest();
}
private static String getStrFromRequest(final String key) {
final Object v = getObject(key);
if (v == null) {
return null;
}
return Objects.toString(v);
}
public static <T> T getObject(final String key) {
RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
if (attrs == null) {
return null;
}
Object obj = attrs.getAttribute(key, RequestAttributes.SCOPE_REQUEST);
if (obj == null) {
return null;
}
return (T) obj;
}
public static <T> void setObject(final HttpServletRequest request, final String key, final T obj) {
request.setAttribute(key, obj);
}
public static boolean isExcludedUri(String uri, String excludedUris) {
if (StringUtils.isBlank(uri) || StringUtils.isBlank(excludedUris)) {
return false;
}
PathMatcher matcher = new AntPathMatcher();
for (String ex : excludedUris.split(",")) {
uri = uri.trim();
ex = ex.trim();
if (matcher.match(ex.toLowerCase(), uri.toLowerCase())) {
return true;
}
}
return false;
}
}

View File

@@ -0,0 +1,2 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.codvision.authcore.config.AuthConfig,\
com.codvision.authcore.config.AuthProperties