feat:新增项目初始化权限认证

dev
gtl 2024-05-15 15:55:18 +08:00
parent 8e0100d909
commit c33a79599c
9 changed files with 110 additions and 12 deletions

View File

@ -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 "";
}

View File

@ -1,5 +1,8 @@
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.RequiresPermissions;
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.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Objects;
/**
* Spring Aop
@ -20,12 +26,17 @@ import java.lang.reflect.Method;
@Aspect
@Component
public class PreAuthorizeAspect {
@Autowired
private InitAuthService initAuthService;
/**
* AOP (使)
*/
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.RequiresRoles)";
+ "@annotation(com.ruoyi.common.security.annotation.RequiresRoles) ||"
+ "@annotation(com.ruoyi.common.security.annotation.InitAuth)";
/**
*
@ -51,13 +62,18 @@ public class PreAuthorizeAspect {
*/
@Around("pointcut()")
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();
checkMethodAnnotation(signature.getMethod());
checkMethodAnnotation(signature.getMethod(),url);
try {
// 执行原有逻辑
Object obj = joinPoint.proceed();
return obj;
return joinPoint.proceed();
} catch (Throwable e) {
throw e;
}
@ -66,7 +82,22 @@ public class PreAuthorizeAspect {
/**
* 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 = method.getAnnotation(RequiresLogin.class);
if (requiresLogin != null) {

View File

@ -7,7 +7,6 @@ import com.ruoyi.common.core.utils.ip.IpUtils;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@ -40,9 +39,11 @@ public class FeignRequestInterceptor implements RequestInterceptor {
if (StringUtils.isNotEmpty(authentication)) {
requestTemplate.header(SecurityConstants.AUTHORIZATION_HEADER, authentication);
}
// 配置客户端IP
requestTemplate.header("X-Forwarded-For", IpUtils.getIpAddr());
}
// 配置请求路径
String url = requestTemplate.feignTarget().url()+requestTemplate.url().split("\\?")[0];
requestTemplate.header("Init-Auth-Url",url);
}
}

View File

@ -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);
}
}
}

View File

@ -1,5 +1,6 @@
com.ruoyi.common.security.config.WebMvcConfig
com.ruoyi.common.security.service.TokenService
com.ruoyi.common.security.service.InitAuthService
com.ruoyi.common.security.aspect.PreAuthorizeAspect
com.ruoyi.common.security.aspect.InnerAuthAspect
com.ruoyi.common.security.handler.GlobalExceptionHandler

View File

@ -3,6 +3,7 @@ package com.ruoyi.dataAsset.remote;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.Result;
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.req.DataSourceQueryReq;
import com.ruoyi.dataAsset.remote.factory.RemoteDataAssetFactory;
@ -27,5 +28,6 @@ public interface RemoteDataAssetService {
*
*/
@GetMapping("/list")
@InitAuth("http://ruoyi-data-asset/source/list")
public Result<TableDataInfo<DataSource>> list(@RequestParam("dataSourceQueryReq") DataSourceQueryReq dataSourceQueryReq);
}

View File

@ -4,9 +4,6 @@ import java.sql.SQLException;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@ -47,7 +44,7 @@ public class DataSourceController extends BaseController {
*
*/
@ApiOperation("获取数据接入列表")
//@RequiresPermissions("dataAsset:source:list")
@RequiresPermissions("dataAsset:source:list")
@GetMapping("/list")
public Result<TableDataInfo<DataSource>> list(DataSourceQueryReq dataSourceQueryReq) {
startPage();

View File

@ -2,6 +2,7 @@ package com.ruoyi.ruleEngine.remote;
import com.ruoyi.common.core.constant.ServiceNameConstants;
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.req.EngineVersionQueryReq;
import com.ruoyi.ruleEngine.remote.factory.RemoteRuleEngineFactory;
@ -29,6 +30,7 @@ public interface RemoteRuleEngineService {
*
*/
@GetMapping("/list")
@InitAuth("http://ruoyi-rule-engine/version/list")
public Result<List<EngineVersion>> list(@RequestParam("engineConfigQueryReq") EngineVersionQueryReq engineConfigQueryReq);
/**

View File

@ -38,7 +38,7 @@ public class EngineVersionController extends BaseController {
*
*/
@ApiOperation("查询引擎规则版本列表")
//@RequiresPermissions("ruleEngine:version:list")
@RequiresPermissions("ruleEngine:version:list")
@GetMapping("/list")
public Result<List<EngineVersion>> list(EngineVersionQueryReq engineConfigQueryReq) {
return Result.success(engineVersionService.list(EngineVersion.queryBuild(engineConfigQueryReq)));