From c2fccb01b972176dc3da5a497b5e904025e9e98d Mon Sep 17 00:00:00 2001
From: bsw215583320 <baoshiwei121@163.com>
Date: 星期二, 16 四月 2024 15:06:51 +0800
Subject: [PATCH] Merge branch 'master' of http://210.22.126.130:1111/r/dry/herb

---
 jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java |  283 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 283 insertions(+), 0 deletions(-)

diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
new file mode 100644
index 0000000..198ddd0
--- /dev/null
+++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
@@ -0,0 +1,283 @@
+package org.jeecg.config.shiro;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
+import org.apache.shiro.mgt.DefaultSubjectDAO;
+import org.apache.shiro.mgt.SecurityManager;
+import org.apache.shiro.spring.LifecycleBeanPostProcessor;
+import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.crazycake.shiro.IRedisManager;
+import org.crazycake.shiro.RedisCacheManager;
+import org.crazycake.shiro.RedisClusterManager;
+import org.crazycake.shiro.RedisManager;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.config.JeecgBaseConfig;
+import org.jeecg.config.shiro.filters.CustomShiroFilterFactoryBean;
+import org.jeecg.config.shiro.filters.JwtFilter;
+import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.core.env.Environment;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.util.StringUtils;
+import redis.clients.jedis.HostAndPort;
+import redis.clients.jedis.JedisCluster;
+
+import javax.annotation.Resource;
+import javax.servlet.Filter;
+import java.util.*;
+
+/**
+ * @author: Scott
+ * @date: 2018/2/7
+ * @description: shiro 閰嶇疆绫�
+ */
+
+@Slf4j
+@Configuration
+public class ShiroConfig {
+
+    @Resource
+    private LettuceConnectionFactory lettuceConnectionFactory;
+    @Autowired
+    private Environment env;
+    @Resource
+    private JeecgBaseConfig jeecgBaseConfig;
+
+    /**
+     * Filter Chain瀹氫箟璇存槑
+     *
+     * 1銆佷竴涓猆RL鍙互閰嶇疆澶氫釜Filter锛屼娇鐢ㄩ�楀彿鍒嗛殧
+     * 2銆佸綋璁剧疆澶氫釜杩囨护鍣ㄦ椂锛屽叏閮ㄩ獙璇侀�氳繃锛屾墠瑙嗕负閫氳繃
+     * 3銆侀儴鍒嗚繃婊ゅ櫒鍙寚瀹氬弬鏁帮紝濡俻erms锛宺oles
+     */
+    @Bean("shiroFilterFactoryBean")
+    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
+        CustomShiroFilterFactoryBean shiroFilterFactoryBean = new CustomShiroFilterFactoryBean();
+        shiroFilterFactoryBean.setSecurityManager(securityManager);
+        // 鎷︽埅鍣�
+        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
+
+        //鏀寔yml鏂瑰紡锛岄厤缃嫤鎴帓闄�
+        if(jeecgBaseConfig!=null && jeecgBaseConfig.getShiro()!=null){
+            String shiroExcludeUrls = jeecgBaseConfig.getShiro().getExcludeUrls();
+            if(oConvertUtils.isNotEmpty(shiroExcludeUrls)){
+                String[] permissionUrl = shiroExcludeUrls.split(",");
+                for(String url : permissionUrl){
+                    filterChainDefinitionMap.put(url,"anon");
+                }
+            }
+        }
+        // 閰嶇疆涓嶄細琚嫤鎴殑閾炬帴 椤哄簭鍒ゆ柇
+        filterChainDefinitionMap.put("/sys/cas/client/validateLogin", "anon"); //cas楠岃瘉鐧诲綍
+        filterChainDefinitionMap.put("/sys/randomImage/**", "anon"); //鐧诲綍楠岃瘉鐮佹帴鍙f帓闄�
+        filterChainDefinitionMap.put("/sys/checkCaptcha", "anon"); //鐧诲綍楠岃瘉鐮佹帴鍙f帓闄�
+        filterChainDefinitionMap.put("/sys/login", "anon"); //鐧诲綍鎺ュ彛鎺掗櫎
+        filterChainDefinitionMap.put("/sys/mLogin", "anon"); //鐧诲綍鎺ュ彛鎺掗櫎
+        filterChainDefinitionMap.put("/sys/logout", "anon"); //鐧诲嚭鎺ュ彛鎺掗櫎
+        filterChainDefinitionMap.put("/sys/thirdLogin/**", "anon"); //绗笁鏂圭櫥褰�
+        filterChainDefinitionMap.put("/sys/getEncryptedString", "anon"); //鑾峰彇鍔犲瘑涓�
+        filterChainDefinitionMap.put("/sys/sms", "anon");//鐭俊楠岃瘉鐮�
+        filterChainDefinitionMap.put("/sys/phoneLogin", "anon");//鎵嬫満鐧诲綍
+        filterChainDefinitionMap.put("/sys/user/checkOnlyUser", "anon");//鏍¢獙鐢ㄦ埛鏄惁瀛樺湪
+        filterChainDefinitionMap.put("/sys/user/register", "anon");//鐢ㄦ埛娉ㄥ唽
+        filterChainDefinitionMap.put("/sys/user/phoneVerification", "anon");//鐢ㄦ埛蹇樿瀵嗙爜楠岃瘉鎵嬫満鍙�
+        filterChainDefinitionMap.put("/sys/user/passwordChange", "anon");//鐢ㄦ埛鏇存敼瀵嗙爜
+        filterChainDefinitionMap.put("/auth/2step-code", "anon");//鐧诲綍楠岃瘉鐮�
+        filterChainDefinitionMap.put("/sys/common/static/**", "anon");//鍥剧墖棰勮 &涓嬭浇鏂囦欢涓嶉檺鍒秚oken
+        filterChainDefinitionMap.put("/sys/common/pdf/**", "anon");//pdf棰勮
+        filterChainDefinitionMap.put("/generic/**", "anon");//pdf棰勮闇�瑕佹枃浠�
+
+        filterChainDefinitionMap.put("/sys/getLoginQrcode/**", "anon"); //鐧诲綍浜岀淮鐮�
+        filterChainDefinitionMap.put("/sys/getQrcodeToken/**", "anon"); //鐩戝惉鎵爜
+        filterChainDefinitionMap.put("/sys/checkAuth", "anon"); //鎺堟潈鎺ュ彛鎺掗櫎
+
+
+        filterChainDefinitionMap.put("/", "anon");
+        filterChainDefinitionMap.put("/doc.html", "anon");
+        filterChainDefinitionMap.put("/**/*.js", "anon");
+        filterChainDefinitionMap.put("/**/*.css", "anon");
+        filterChainDefinitionMap.put("/**/*.html", "anon");
+        filterChainDefinitionMap.put("/**/*.svg", "anon");
+        filterChainDefinitionMap.put("/**/*.pdf", "anon");
+        filterChainDefinitionMap.put("/**/*.jpg", "anon");
+        filterChainDefinitionMap.put("/**/*.png", "anon");
+        filterChainDefinitionMap.put("/**/*.gif", "anon");
+        filterChainDefinitionMap.put("/**/*.ico", "anon");
+        filterChainDefinitionMap.put("/**/*.ttf", "anon");
+        filterChainDefinitionMap.put("/**/*.woff", "anon");
+        filterChainDefinitionMap.put("/**/*.woff2", "anon");
+
+        filterChainDefinitionMap.put("/druid/**", "anon");
+        filterChainDefinitionMap.put("/swagger-ui.html", "anon");
+        filterChainDefinitionMap.put("/swagger**/**", "anon");
+        filterChainDefinitionMap.put("/webjars/**", "anon");
+        filterChainDefinitionMap.put("/v2/**", "anon");
+
+        filterChainDefinitionMap.put("/sys/annountCement/show/**", "anon");
+
+        //绉湪鎶ヨ〃鎺掗櫎
+        filterChainDefinitionMap.put("/jmreport/**", "anon");
+        filterChainDefinitionMap.put("/**/*.js.map", "anon");
+        filterChainDefinitionMap.put("/**/*.css.map", "anon");
+
+        //澶у睆妯℃澘渚嬪瓙
+        filterChainDefinitionMap.put("/test/bigScreen/**", "anon");
+        filterChainDefinitionMap.put("/bigscreen/template1/**", "anon");
+        filterChainDefinitionMap.put("/bigscreen/template1/**", "anon");
+        //filterChainDefinitionMap.put("/test/jeecgDemo/rabbitMqClientTest/**", "anon"); //MQ娴嬭瘯
+        //filterChainDefinitionMap.put("/test/jeecgDemo/html", "anon"); //妯℃澘椤甸潰
+        //filterChainDefinitionMap.put("/test/jeecgDemo/redis/**", "anon"); //redis娴嬭瘯
+
+        //websocket鎺掗櫎
+        filterChainDefinitionMap.put("/websocket/**", "anon");//绯荤粺閫氱煡鍜屽叕鍛�
+        filterChainDefinitionMap.put("/newsWebsocket/**", "anon");//CMS妯″潡
+        filterChainDefinitionMap.put("/vxeSocket/**", "anon");//JVxeTable鏃犵棔鍒锋柊绀轰緥
+        filterChainDefinitionMap.put("/drySocket/**", "anon");//骞茬嚗鏈洪�氫俊
+
+        //鎬ц兘鐩戞帶鈥斺�斿畨鍏ㄩ殣鎮f硠闇睺OEKN锛坉urid杩炴帴姹犱篃鏈夛級
+        //filterChainDefinitionMap.put("/actuator/**", "anon");
+        //娴嬭瘯妯″潡鎺掗櫎
+        filterChainDefinitionMap.put("/test/seata/**", "anon");
+
+        // 骞茬嚗璁惧瀹炴椂鏁版嵁涓婁紶
+        //filterChainDefinitionMap.put("/dry/dryOrder/**", "anon");
+
+        // 骞茬嚗娴嬭瘯
+        filterChainDefinitionMap.put("/dry/dryResult/**", "anon");
+        filterChainDefinitionMap.put("/dry/real/**", "anon");
+
+
+        // 娣诲姞鑷繁鐨勮繃婊ゅ櫒骞朵笖鍙栧悕涓簀wt
+        Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
+        //濡傛灉cloudServer涓虹┖ 鍒欒鏄庢槸鍗曚綋 闇�瑕佸姞杞借法鍩熼厤缃�愬井鏈嶅姟璺ㄥ煙鍒囨崲銆�
+        Object cloudServer = env.getProperty(CommonConstant.CLOUD_SERVER_KEY);
+        filterMap.put("jwt", new JwtFilter(cloudServer==null));
+        shiroFilterFactoryBean.setFilters(filterMap);
+        // <!-- 杩囨护閾惧畾涔夛紝浠庝笂鍚戜笅椤哄簭鎵ц锛屼竴鑸皢/**鏀惧湪鏈�涓轰笅杈�
+        filterChainDefinitionMap.put("/**", "jwt");
+
+        // 鏈巿鏉冪晫闈㈣繑鍥濲SON
+        shiroFilterFactoryBean.setUnauthorizedUrl("/sys/common/403");
+        shiroFilterFactoryBean.setLoginUrl("/sys/common/403");
+        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
+        return shiroFilterFactoryBean;
+    }
+
+    @Bean("securityManager")
+    public DefaultWebSecurityManager securityManager(ShiroRealm myRealm) {
+        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+        securityManager.setRealm(myRealm);
+
+        /*
+         * 鍏抽棴shiro鑷甫鐨剆ession锛岃鎯呰鏂囨。
+         * http://shiro.apache.org/session-management.html#SessionManagement-
+         * StatelessApplications%28Sessionless%29
+         */
+        DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
+        DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();
+        defaultSessionStorageEvaluator.setSessionStorageEnabled(false);
+        subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);
+        securityManager.setSubjectDAO(subjectDAO);
+        //鑷畾涔夌紦瀛樺疄鐜�,浣跨敤redis
+        securityManager.setCacheManager(redisCacheManager());
+        return securityManager;
+    }
+
+    /**
+     * 涓嬮潰鐨勪唬鐮佹槸娣诲姞娉ㄨВ鏀寔
+     * @return
+     */
+    @Bean
+    @DependsOn("lifecycleBeanPostProcessor")
+    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
+        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
+        defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
+        /**
+         * 瑙e喅閲嶅浠g悊闂 github#994
+         * 娣诲姞鍓嶇紑鍒ゆ柇 涓嶅尮閰� 浠讳綍Advisor
+         */
+        defaultAdvisorAutoProxyCreator.setUsePrefix(true);
+        defaultAdvisorAutoProxyCreator.setAdvisorBeanNamePrefix("_no_advisor");
+        return defaultAdvisorAutoProxyCreator;
+    }
+
+    @Bean
+    public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
+        return new LifecycleBeanPostProcessor();
+    }
+
+    @Bean
+    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
+        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
+        advisor.setSecurityManager(securityManager);
+        return advisor;
+    }
+
+    /**
+     * cacheManager 缂撳瓨 redis瀹炵幇
+     * 浣跨敤鐨勬槸shiro-redis寮�婧愭彃浠�
+     *
+     * @return
+     */
+    public RedisCacheManager redisCacheManager() {
+        log.info("===============(1)鍒涘缓缂撳瓨绠$悊鍣≧edisCacheManager");
+        RedisCacheManager redisCacheManager = new RedisCacheManager();
+        redisCacheManager.setRedisManager(redisManager());
+        //redis涓拡瀵逛笉鍚岀敤鎴风紦瀛�(姝ゅ鐨刬d闇�瑕佸搴攗ser瀹炰綋涓殑id瀛楁,鐢ㄤ簬鍞竴鏍囪瘑)
+        redisCacheManager.setPrincipalIdFieldName("id");
+        //鐢ㄦ埛鏉冮檺淇℃伅缂撳瓨鏃堕棿
+        redisCacheManager.setExpire(200000);
+        return redisCacheManager;
+    }
+
+    /**
+     * 閰嶇疆shiro redisManager
+     * 浣跨敤鐨勬槸shiro-redis寮�婧愭彃浠�
+     *
+     * @return
+     */
+    @Bean
+    public IRedisManager redisManager() {
+        log.info("===============(2)鍒涘缓RedisManager,杩炴帴Redis..");
+        IRedisManager manager;
+        // redis 鍗曟満鏀寔锛屽湪闆嗙兢涓虹┖锛屾垨鑰呴泦缇ゆ棤鏈哄櫒鏃跺�欎娇鐢� add by jzyadmin@163.com
+        if (lettuceConnectionFactory.getClusterConfiguration() == null || lettuceConnectionFactory.getClusterConfiguration().getClusterNodes().isEmpty()) {
+            RedisManager redisManager = new RedisManager();
+            redisManager.setHost(lettuceConnectionFactory.getHostName());
+            redisManager.setPort(lettuceConnectionFactory.getPort());
+            redisManager.setDatabase(lettuceConnectionFactory.getDatabase());
+            redisManager.setTimeout(0);
+            if (!StringUtils.isEmpty(lettuceConnectionFactory.getPassword())) {
+                redisManager.setPassword(lettuceConnectionFactory.getPassword());
+            }
+            manager = redisManager;
+        }else{
+            // redis闆嗙兢鏀寔锛屼紭鍏堜娇鐢ㄩ泦缇ら厤缃�
+            RedisClusterManager redisManager = new RedisClusterManager();
+            Set<HostAndPort> portSet = new HashSet<>();
+            lettuceConnectionFactory.getClusterConfiguration().getClusterNodes().forEach(node -> portSet.add(new HostAndPort(node.getHost() , node.getPort())));
+            //update-begin--Author:scott Date:20210531 for锛氫慨鏀归泦缇ゆā寮忎笅鏈缃畆edis瀵嗙爜鐨刡ug issues/I3QNIC
+            if (oConvertUtils.isNotEmpty(lettuceConnectionFactory.getPassword())) {
+                JedisCluster jedisCluster = new JedisCluster(portSet, 2000, 2000, 5,
+                    lettuceConnectionFactory.getPassword(), new GenericObjectPoolConfig());
+                redisManager.setPassword(lettuceConnectionFactory.getPassword());
+                redisManager.setJedisCluster(jedisCluster);
+            } else {
+                JedisCluster jedisCluster = new JedisCluster(portSet);
+                redisManager.setJedisCluster(jedisCluster);
+            }
+            //update-end--Author:scott Date:20210531 for锛氫慨鏀归泦缇ゆā寮忎笅鏈缃畆edis瀵嗙爜鐨刡ug issues/I3QNIC
+            manager = redisManager;
+        }
+        return manager;
+    }
+
+}

--
Gitblit v1.9.3