疯狂的狮子Li
2022-05-28 51593aafb27e6ff9dc9d3920708de3c72a47c900
update 支持注解配置匿名访问
已修改2个文件
已添加1个文件
已删除1个文件
174 ■■■■ 文件已修改
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/ExcludeUrlProperties.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java
@@ -1,19 +1,18 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * åŒ¿åè®¿é—®ä¸é‰´æƒæ³¨è§£
 *
 * @author ruoyi
 */
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Anonymous
{
}
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * åŒ¿åè®¿é—®ä¸é‰´æƒæ³¨è§£
 *
 * @author ruoyi
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Anonymous {
}
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java
@@ -7,6 +7,8 @@
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.config.properties.ExcludeUrlProperties;
import com.ruoyi.framework.config.properties.SecurityProperties;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -37,12 +39,14 @@
    public void addInterceptors(InterceptorRegistry registry) {
        // æ³¨å†Œè·¯ç”±æ‹¦æˆªå™¨ï¼Œè‡ªå®šä¹‰éªŒè¯è§„则
        registry.addInterceptor(new SaRouteInterceptor((request, response, handler) -> {
            ExcludeUrlProperties excludeUrlProperties = SpringUtils.getBean(ExcludeUrlProperties.class);
            // ç™»å½•验证 -- æŽ’除多个路径
            SaRouter
                // èŽ·å–æ‰€æœ‰çš„
                .match("/**")
                // æŽ’除下不需要拦截的
                .notMatch(securityProperties.getExcludes())
                .notMatch(excludeUrlProperties.getExcludes())
                // å¯¹æœªæŽ’除的路径进行检查
                .check(() -> {
                    // æ£€æŸ¥æ˜¯å¦ç™»å½• æ˜¯å¦æœ‰token
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/ExcludeUrlProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ruoyi.framework.config.properties;
import cn.hutool.core.util.ReUtil;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.utils.spring.SpringUtils;
import lombok.Getter;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import java.util.*;
import java.util.regex.Pattern;
/**
 * è®¾ç½®æ³¨è§£å…è®¸åŒ¿åè®¿é—®çš„url
 *
 * @author Lion Li
 */
@Lazy
@Component
public class ExcludeUrlProperties implements InitializingBean {
    private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}");
    @Getter
    private final List<String> excludes = new ArrayList<>();
    @Override
    public void afterPropertiesSet() {
        String asterisk = "*";
        RequestMappingHandlerMapping mapping = SpringUtils.getBean(RequestMappingHandlerMapping.class);
        Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods();
        map.keySet().forEach(info -> {
            HandlerMethod handlerMethod = map.get(info);
            // èŽ·å–æ–¹æ³•ä¸Šè¾¹çš„æ³¨è§£ æ›¿ä»£path variable ä¸º *
            Anonymous method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Anonymous.class);
            Optional.ofNullable(method).ifPresent(anonymous -> {
                Set<String> patterns = info.getPatternsCondition().getPatterns();
                patterns.forEach(url -> {
                    excludes.add(ReUtil.replaceAll(url, PATTERN, asterisk));
                });
            });
            // èŽ·å–ç±»ä¸Šè¾¹çš„æ³¨è§£, æ›¿ä»£path variable ä¸º *
            Anonymous controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Anonymous.class);
            Optional.ofNullable(controller).ifPresent(anonymous -> {
                Set<String> patterns = info.getPatternsCondition().getPatterns();
                patterns.forEach(url -> {
                    excludes.add(ReUtil.replaceAll(url, PATTERN, asterisk));
                });
            });
        });
    }
}
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java
ÎļþÒÑɾ³ý