feat:新增项目初始化权限认证
parent
8e0100d909
commit
c33a79599c
|
@ -0,0 +1,20 @@
|
||||||
|
package com.ruoyi.common.security.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化认证:初始化项目时跳过权限认证
|
||||||
|
*
|
||||||
|
* @Author GuanTieLin
|
||||||
|
*/
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target({ElementType.METHOD, ElementType.TYPE})
|
||||||
|
public @interface InitAuth {
|
||||||
|
/**
|
||||||
|
* 认证的url
|
||||||
|
*/
|
||||||
|
String value() default "";
|
||||||
|
}
|
|
@ -1,5 +1,8 @@
|
||||||
package com.ruoyi.common.security.aspect;
|
package com.ruoyi.common.security.aspect;
|
||||||
|
|
||||||
|
import com.ruoyi.common.security.service.InitAuthService;
|
||||||
|
import com.ruoyi.common.core.utils.ServletUtils;
|
||||||
|
import com.ruoyi.common.security.annotation.InitAuth;
|
||||||
import com.ruoyi.common.security.annotation.RequiresLogin;
|
import com.ruoyi.common.security.annotation.RequiresLogin;
|
||||||
import com.ruoyi.common.security.annotation.RequiresPermissions;
|
import com.ruoyi.common.security.annotation.RequiresPermissions;
|
||||||
import com.ruoyi.common.security.annotation.RequiresRoles;
|
import com.ruoyi.common.security.annotation.RequiresRoles;
|
||||||
|
@ -9,8 +12,11 @@ import org.aspectj.lang.annotation.Around;
|
||||||
import org.aspectj.lang.annotation.Aspect;
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
import org.aspectj.lang.annotation.Pointcut;
|
import org.aspectj.lang.annotation.Pointcut;
|
||||||
import org.aspectj.lang.reflect.MethodSignature;
|
import org.aspectj.lang.reflect.MethodSignature;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 基于 Spring Aop 的注解鉴权
|
* 基于 Spring Aop 的注解鉴权
|
||||||
|
@ -20,12 +26,17 @@ import java.lang.reflect.Method;
|
||||||
@Aspect
|
@Aspect
|
||||||
@Component
|
@Component
|
||||||
public class PreAuthorizeAspect {
|
public class PreAuthorizeAspect {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private InitAuthService initAuthService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 定义AOP签名 (切入所有使用鉴权注解的方法)
|
* 定义AOP签名 (切入所有使用鉴权注解的方法)
|
||||||
*/
|
*/
|
||||||
public static final String POINTCUT_SIGN = " @annotation(com.ruoyi.common.security.annotation.RequiresLogin) || "
|
public static final String POINTCUT_SIGN = " @annotation(com.ruoyi.common.security.annotation.RequiresLogin) || "
|
||||||
+ "@annotation(com.ruoyi.common.security.annotation.RequiresPermissions) || "
|
+ "@annotation(com.ruoyi.common.security.annotation.RequiresPermissions) || "
|
||||||
+ "@annotation(com.ruoyi.common.security.annotation.RequiresRoles)";
|
+ "@annotation(com.ruoyi.common.security.annotation.RequiresRoles) ||"
|
||||||
|
+ "@annotation(com.ruoyi.common.security.annotation.InitAuth)";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构建
|
* 构建
|
||||||
|
@ -51,13 +62,18 @@ public class PreAuthorizeAspect {
|
||||||
*/
|
*/
|
||||||
@Around("pointcut()")
|
@Around("pointcut()")
|
||||||
public Object around (ProceedingJoinPoint joinPoint) throws Throwable {
|
public Object around (ProceedingJoinPoint joinPoint) throws Throwable {
|
||||||
|
HttpServletRequest httpServletRequest = ServletUtils.getRequest();
|
||||||
|
String url=null;
|
||||||
|
if(Objects.nonNull(httpServletRequest)){
|
||||||
|
// 获取url
|
||||||
|
url = httpServletRequest.getHeader("Init-Auth-Url");
|
||||||
|
}
|
||||||
// 注解鉴权
|
// 注解鉴权
|
||||||
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
||||||
checkMethodAnnotation(signature.getMethod());
|
checkMethodAnnotation(signature.getMethod(),url);
|
||||||
try {
|
try {
|
||||||
// 执行原有逻辑
|
// 执行原有逻辑
|
||||||
Object obj = joinPoint.proceed();
|
return joinPoint.proceed();
|
||||||
return obj;
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
@ -66,7 +82,22 @@ public class PreAuthorizeAspect {
|
||||||
/**
|
/**
|
||||||
* 对一个Method对象进行注解检查
|
* 对一个Method对象进行注解检查
|
||||||
*/
|
*/
|
||||||
public void checkMethodAnnotation (Method method) {
|
public void checkMethodAnnotation (Method method,String url) {
|
||||||
|
// 校验 @InitAuth 注解
|
||||||
|
InitAuth initAuth = method.getAnnotation(InitAuth.class);
|
||||||
|
// 有注解放行
|
||||||
|
if (initAuth != null) {
|
||||||
|
// 初始化访问权限
|
||||||
|
initAuthService.init(initAuth.value());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 有权限放行
|
||||||
|
if(url!=null&& initAuthService.auth(url)){
|
||||||
|
// 移除访问权限
|
||||||
|
initAuthService.remove(url);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 校验 @RequiresLogin 注解
|
// 校验 @RequiresLogin 注解
|
||||||
RequiresLogin requiresLogin = method.getAnnotation(RequiresLogin.class);
|
RequiresLogin requiresLogin = method.getAnnotation(RequiresLogin.class);
|
||||||
if (requiresLogin != null) {
|
if (requiresLogin != null) {
|
||||||
|
|
|
@ -7,7 +7,6 @@ import com.ruoyi.common.core.utils.ip.IpUtils;
|
||||||
import feign.RequestInterceptor;
|
import feign.RequestInterceptor;
|
||||||
import feign.RequestTemplate;
|
import feign.RequestTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -40,9 +39,11 @@ public class FeignRequestInterceptor implements RequestInterceptor {
|
||||||
if (StringUtils.isNotEmpty(authentication)) {
|
if (StringUtils.isNotEmpty(authentication)) {
|
||||||
requestTemplate.header(SecurityConstants.AUTHORIZATION_HEADER, authentication);
|
requestTemplate.header(SecurityConstants.AUTHORIZATION_HEADER, authentication);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 配置客户端IP
|
// 配置客户端IP
|
||||||
requestTemplate.header("X-Forwarded-For", IpUtils.getIpAddr());
|
requestTemplate.header("X-Forwarded-For", IpUtils.getIpAddr());
|
||||||
}
|
}
|
||||||
|
// 配置请求路径
|
||||||
|
String url = requestTemplate.feignTarget().url()+requestTemplate.url().split("\\?")[0];
|
||||||
|
requestTemplate.header("Init-Auth-Url",url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
package com.ruoyi.common.security.service;
|
||||||
|
|
||||||
|
import com.ruoyi.common.redis.service.RedisService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化认证服务
|
||||||
|
* @ClassName InitAuthService
|
||||||
|
* @Author GuanTieLin
|
||||||
|
* @Date 2024/5/15 12:44
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class InitAuthService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RedisService redisService;
|
||||||
|
|
||||||
|
private final String PREFIX="init-auth:";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化权限3分钟
|
||||||
|
*/
|
||||||
|
public void init(String url){
|
||||||
|
redisService.setCacheObject(PREFIX+url,"",3L,TimeUnit.MINUTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证权限
|
||||||
|
*/
|
||||||
|
public boolean auth(String url){
|
||||||
|
return redisService.hasKey(PREFIX + url);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移除权限
|
||||||
|
*/
|
||||||
|
public void remove(String url){
|
||||||
|
if(redisService.hasKey(PREFIX + url)){
|
||||||
|
redisService.deleteObject(PREFIX + url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
com.ruoyi.common.security.config.WebMvcConfig
|
com.ruoyi.common.security.config.WebMvcConfig
|
||||||
com.ruoyi.common.security.service.TokenService
|
com.ruoyi.common.security.service.TokenService
|
||||||
|
com.ruoyi.common.security.service.InitAuthService
|
||||||
com.ruoyi.common.security.aspect.PreAuthorizeAspect
|
com.ruoyi.common.security.aspect.PreAuthorizeAspect
|
||||||
com.ruoyi.common.security.aspect.InnerAuthAspect
|
com.ruoyi.common.security.aspect.InnerAuthAspect
|
||||||
com.ruoyi.common.security.handler.GlobalExceptionHandler
|
com.ruoyi.common.security.handler.GlobalExceptionHandler
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.ruoyi.dataAsset.remote;
|
||||||
import com.ruoyi.common.core.constant.ServiceNameConstants;
|
import com.ruoyi.common.core.constant.ServiceNameConstants;
|
||||||
import com.ruoyi.common.core.domain.Result;
|
import com.ruoyi.common.core.domain.Result;
|
||||||
import com.ruoyi.common.core.web.page.TableDataInfo;
|
import com.ruoyi.common.core.web.page.TableDataInfo;
|
||||||
|
import com.ruoyi.common.security.annotation.InitAuth;
|
||||||
import com.ruoyi.dataAsset.domain.DataSource;
|
import com.ruoyi.dataAsset.domain.DataSource;
|
||||||
import com.ruoyi.dataAsset.domain.req.DataSourceQueryReq;
|
import com.ruoyi.dataAsset.domain.req.DataSourceQueryReq;
|
||||||
import com.ruoyi.dataAsset.remote.factory.RemoteDataAssetFactory;
|
import com.ruoyi.dataAsset.remote.factory.RemoteDataAssetFactory;
|
||||||
|
@ -27,5 +28,6 @@ public interface RemoteDataAssetService {
|
||||||
* 查询数据接入列表
|
* 查询数据接入列表
|
||||||
*/
|
*/
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
|
@InitAuth("http://ruoyi-data-asset/source/list")
|
||||||
public Result<TableDataInfo<DataSource>> list(@RequestParam("dataSourceQueryReq") DataSourceQueryReq dataSourceQueryReq);
|
public Result<TableDataInfo<DataSource>> list(@RequestParam("dataSourceQueryReq") DataSourceQueryReq dataSourceQueryReq);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,9 +4,6 @@ import java.sql.SQLException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import com.ruoyi.common.security.utils.SecurityUtils;
|
import com.ruoyi.common.security.utils.SecurityUtils;
|
||||||
import com.ruoyi.dataAsset.service.AssetModelDataService;
|
|
||||||
import com.ruoyi.dataAsset.service.ColumnInfoService;
|
|
||||||
import com.ruoyi.dataAsset.service.TableInfoService;
|
|
||||||
import io.swagger.annotations.*;
|
import io.swagger.annotations.*;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
@ -47,7 +44,7 @@ public class DataSourceController extends BaseController {
|
||||||
* 查询数据接入列表
|
* 查询数据接入列表
|
||||||
*/
|
*/
|
||||||
@ApiOperation("获取数据接入列表")
|
@ApiOperation("获取数据接入列表")
|
||||||
//@RequiresPermissions("dataAsset:source:list")
|
@RequiresPermissions("dataAsset:source:list")
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
public Result<TableDataInfo<DataSource>> list(DataSourceQueryReq dataSourceQueryReq) {
|
public Result<TableDataInfo<DataSource>> list(DataSourceQueryReq dataSourceQueryReq) {
|
||||||
startPage();
|
startPage();
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.ruoyi.ruleEngine.remote;
|
||||||
|
|
||||||
import com.ruoyi.common.core.constant.ServiceNameConstants;
|
import com.ruoyi.common.core.constant.ServiceNameConstants;
|
||||||
import com.ruoyi.common.core.domain.Result;
|
import com.ruoyi.common.core.domain.Result;
|
||||||
|
import com.ruoyi.common.security.annotation.InitAuth;
|
||||||
import com.ruoyi.ruleEngine.domain.EngineVersion;
|
import com.ruoyi.ruleEngine.domain.EngineVersion;
|
||||||
import com.ruoyi.ruleEngine.domain.req.EngineVersionQueryReq;
|
import com.ruoyi.ruleEngine.domain.req.EngineVersionQueryReq;
|
||||||
import com.ruoyi.ruleEngine.remote.factory.RemoteRuleEngineFactory;
|
import com.ruoyi.ruleEngine.remote.factory.RemoteRuleEngineFactory;
|
||||||
|
@ -29,6 +30,7 @@ public interface RemoteRuleEngineService {
|
||||||
* 查询引擎规则版本列表
|
* 查询引擎规则版本列表
|
||||||
*/
|
*/
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
|
@InitAuth("http://ruoyi-rule-engine/version/list")
|
||||||
public Result<List<EngineVersion>> list(@RequestParam("engineConfigQueryReq") EngineVersionQueryReq engineConfigQueryReq);
|
public Result<List<EngineVersion>> list(@RequestParam("engineConfigQueryReq") EngineVersionQueryReq engineConfigQueryReq);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -38,7 +38,7 @@ public class EngineVersionController extends BaseController {
|
||||||
* 查询引擎规则版本列表
|
* 查询引擎规则版本列表
|
||||||
*/
|
*/
|
||||||
@ApiOperation("查询引擎规则版本列表")
|
@ApiOperation("查询引擎规则版本列表")
|
||||||
//@RequiresPermissions("ruleEngine:version:list")
|
@RequiresPermissions("ruleEngine:version:list")
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
public Result<List<EngineVersion>> list(EngineVersionQueryReq engineConfigQueryReq) {
|
public Result<List<EngineVersion>> list(EngineVersionQueryReq engineConfigQueryReq) {
|
||||||
return Result.success(engineVersionService.list(EngineVersion.queryBuild(engineConfigQueryReq)));
|
return Result.success(engineVersionService.list(EngineVersion.queryBuild(engineConfigQueryReq)));
|
||||||
|
|
Loading…
Reference in New Issue