fix: 码全代码添加
This commit is contained in:
38
template/cvbp/cvbp-public/cvbp-auth-core/.gitignore
vendored
Normal file
38
template/cvbp/cvbp-public/cvbp-auth-core/.gitignore
vendored
Normal 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
|
||||
60
template/cvbp/cvbp-public/cvbp-auth-core/pom.xml
Normal file
60
template/cvbp/cvbp-public/cvbp-auth-core/pom.xml
Normal 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>
|
||||
@@ -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 "";
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
@@ -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<>();
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 = "/**";
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
/*
|
||||
* Copyright (c) 2023 codvision.com All Rights Reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* 统一认证模块
|
||||
*
|
||||
* @author lingee
|
||||
* @date 2023/7/17
|
||||
*/
|
||||
package com.codvision.authcore;
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.codvision.authcore.config.AuthConfig,\
|
||||
com.codvision.authcore.config.AuthProperties
|
||||
Reference in New Issue
Block a user