diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index cdd13f2..a2bdad6 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -38,16 +38,6 @@
-
-
-
-
-
-
-
-
-
-
com.casic
@@ -86,6 +76,21 @@
com.casic
casic-admin-core
${admin.version}
+
+
+ io.springfox
+ springfox-swagger2
+
+
+ io.springfox
+ springfox-core
+
+
+ io.springfox
+ springfox-spring-web
+
+
+
com.casic
@@ -169,18 +174,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+ com.github.xiaoymin
+
+ knife4j-spring-boot-starter
+ 3.0.3
+
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index cdd13f2..a2bdad6 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -38,16 +38,6 @@
-
-
-
-
-
-
-
-
-
-
com.casic
@@ -86,6 +76,21 @@
com.casic
casic-admin-core
${admin.version}
+
+
+ io.springfox
+ springfox-swagger2
+
+
+ io.springfox
+ springfox-core
+
+
+ io.springfox
+ springfox-spring-web
+
+
+
com.casic
@@ -169,18 +174,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+ com.github.xiaoymin
+
+ knife4j-spring-boot-starter
+ 3.0.3
+
diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
index 6eebb1a..862cbc6 100644
--- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
+++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
@@ -27,7 +27,10 @@
@EnableTransactionManagement(proxyTargetClass = true)
@EnableAsync
@Slf4j
-//@EnableSwagger2
+@ComponentScan(excludeFilters =
+ {@ComponentScan.Filter(
+ type = FilterType.REGEX,
+ pattern = {"com.casic.missiles.config.web.ShiroConfig"})})
public class CasicApplication {
public static void main(String[] args) {
SpringApplication.run(CasicApplication.class, args);
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index cdd13f2..a2bdad6 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -38,16 +38,6 @@
-
-
-
-
-
-
-
-
-
-
com.casic
@@ -86,6 +76,21 @@
com.casic
casic-admin-core
${admin.version}
+
+
+ io.springfox
+ springfox-swagger2
+
+
+ io.springfox
+ springfox-core
+
+
+ io.springfox
+ springfox-spring-web
+
+
+
com.casic
@@ -169,18 +174,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+ com.github.xiaoymin
+
+ knife4j-spring-boot-starter
+ 3.0.3
+
diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
index 6eebb1a..862cbc6 100644
--- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
+++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
@@ -27,7 +27,10 @@
@EnableTransactionManagement(proxyTargetClass = true)
@EnableAsync
@Slf4j
-//@EnableSwagger2
+@ComponentScan(excludeFilters =
+ {@ComponentScan.Filter(
+ type = FilterType.REGEX,
+ pattern = {"com.casic.missiles.config.web.ShiroConfig"})})
public class CasicApplication {
public static void main(String[] args) {
SpringApplication.run(CasicApplication.class, args);
diff --git a/casic-web/src/main/java/com/casic/missiles/config/Knife4jConfiguration.java b/casic-web/src/main/java/com/casic/missiles/config/Knife4jConfiguration.java
new file mode 100644
index 0000000..2e7b78d
--- /dev/null
+++ b/casic-web/src/main/java/com/casic/missiles/config/Knife4jConfiguration.java
@@ -0,0 +1,38 @@
+package com.casic.missiles.config;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+@Configuration
+@EnableKnife4j
+public class Knife4jConfiguration {
+
+ @Value(value = "${swagger.enable}")
+ public boolean enable;
+ @Value(value = "${swagger.groupName}")
+ public String groupName;
+
+ @Bean(value = "dockerBean")
+ public Docket dockerBean() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(new ApiInfoBuilder()
+ //描述字段支持Markdown语法
+ .description("# Knife4j RESTful APIs")
+ .termsOfServiceUrl("https://doc.casic.com/")
+ .version("1.0")
+ .build())
+ //分组名称
+ .groupName(groupName)
+ .select()
+ .apis(RequestHandlerSelectors.basePackage("com.casic"))
+ .paths(PathSelectors.any()).build().enable(enable);
+ }
+
+}
\ No newline at end of file
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index cdd13f2..a2bdad6 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -38,16 +38,6 @@
-
-
-
-
-
-
-
-
-
-
com.casic
@@ -86,6 +76,21 @@
com.casic
casic-admin-core
${admin.version}
+
+
+ io.springfox
+ springfox-swagger2
+
+
+ io.springfox
+ springfox-core
+
+
+ io.springfox
+ springfox-spring-web
+
+
+
com.casic
@@ -169,18 +174,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+ com.github.xiaoymin
+
+ knife4j-spring-boot-starter
+ 3.0.3
+
diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
index 6eebb1a..862cbc6 100644
--- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
+++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
@@ -27,7 +27,10 @@
@EnableTransactionManagement(proxyTargetClass = true)
@EnableAsync
@Slf4j
-//@EnableSwagger2
+@ComponentScan(excludeFilters =
+ {@ComponentScan.Filter(
+ type = FilterType.REGEX,
+ pattern = {"com.casic.missiles.config.web.ShiroConfig"})})
public class CasicApplication {
public static void main(String[] args) {
SpringApplication.run(CasicApplication.class, args);
diff --git a/casic-web/src/main/java/com/casic/missiles/config/Knife4jConfiguration.java b/casic-web/src/main/java/com/casic/missiles/config/Knife4jConfiguration.java
new file mode 100644
index 0000000..2e7b78d
--- /dev/null
+++ b/casic-web/src/main/java/com/casic/missiles/config/Knife4jConfiguration.java
@@ -0,0 +1,38 @@
+package com.casic.missiles.config;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+@Configuration
+@EnableKnife4j
+public class Knife4jConfiguration {
+
+ @Value(value = "${swagger.enable}")
+ public boolean enable;
+ @Value(value = "${swagger.groupName}")
+ public String groupName;
+
+ @Bean(value = "dockerBean")
+ public Docket dockerBean() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(new ApiInfoBuilder()
+ //描述字段支持Markdown语法
+ .description("# Knife4j RESTful APIs")
+ .termsOfServiceUrl("https://doc.casic.com/")
+ .version("1.0")
+ .build())
+ //分组名称
+ .groupName(groupName)
+ .select()
+ .apis(RequestHandlerSelectors.basePackage("com.casic"))
+ .paths(PathSelectors.any()).build().enable(enable);
+ }
+
+}
\ No newline at end of file
diff --git a/casic-web/src/main/java/com/casic/missiles/config/ShiroConfigs.java b/casic-web/src/main/java/com/casic/missiles/config/ShiroConfigs.java
new file mode 100644
index 0000000..af7da37
--- /dev/null
+++ b/casic-web/src/main/java/com/casic/missiles/config/ShiroConfigs.java
@@ -0,0 +1,177 @@
+package com.casic.missiles.config;
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by Fernflower decompiler)
+//
+
+
+import com.casic.missiles.config.properties.CasicProperties;
+import com.casic.missiles.core.filter.UserLoginFilter;
+import com.casic.missiles.core.listener.ShiroSessionListener;
+import com.casic.missiles.core.shiro.ShiroDbRealm;
+import com.casic.missiles.core.shiro.ShiroSessionManager;
+import com.casic.missiles.core.shiro.dao.RedisSessionDao;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.Filter;
+import org.apache.shiro.cache.CacheManager;
+import org.apache.shiro.codec.Base64;
+import org.apache.shiro.session.SessionListener;
+import org.apache.shiro.session.mgt.SessionManager;
+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.CookieRememberMeManager;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.apache.shiro.web.servlet.Cookie;
+import org.apache.shiro.web.servlet.SimpleCookie;
+import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.data.redis.core.RedisTemplate;
+
+@Configuration
+@DependsOn({"springContextHolder"})
+public class ShiroConfigs {
+ public ShiroConfigs() {
+ }
+
+ @Bean
+ public DefaultWebSecurityManager securityManager(CacheManager cacheShiroManager, SessionManager sessionManager) {
+ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+ securityManager.setRealm(this.shiroDbRealm());
+ securityManager.setCacheManager(cacheShiroManager);
+ securityManager.setSessionManager(sessionManager);
+ return securityManager;
+ }
+
+ @Bean
+ @ConditionalOnProperty(
+ prefix = "casic",
+ name = {"spring-session-open"},
+ havingValue = "true"
+ )
+ public DefaultWebSessionManager servletContainerSessionManager(@Autowired(required = false) RedisTemplate redisTemplate, CasicProperties casicProperties, SessionListener sessionListener, @Value("${spring.redis.redisValueSerializer:org.springframework.data.redis.serializer.StringRedisSerializer}") String redisValueSerializer) {
+ DefaultWebSessionManager sessionManager = new ShiroSessionManager();
+ sessionManager.setSessionDAO(new RedisSessionDao((long)(casicProperties.getSessionInvalidateTime() * 1000), redisTemplate, redisValueSerializer));
+ sessionManager.setSessionValidationInterval((long)(casicProperties.getSessionValidationInterval() * 1000));
+ sessionManager.setGlobalSessionTimeout((long)(casicProperties.getSessionInvalidateTime() * 1000));
+ sessionManager.setDeleteInvalidSessions(true);
+ sessionManager.setSessionValidationSchedulerEnabled(true);
+ Cookie cookie = new SimpleCookie("JSESSIONID");
+ cookie.setName("shiroCookie");
+ cookie.setHttpOnly(true);
+ sessionManager.setSessionIdCookie(cookie);
+ List listeners = new ArrayList();
+ listeners.add(sessionListener);
+ sessionManager.setSessionListeners(listeners);
+ return sessionManager;
+ }
+
+ @Bean
+ @ConditionalOnProperty(
+ prefix = "casic",
+ name = {"spring-session-open"},
+ havingValue = "false"
+ )
+ public DefaultWebSessionManager defaultWebSessionManager(CacheManager cacheShiroManager, CasicProperties CasicProperties, SessionListener sessionListener) {
+ DefaultWebSessionManager sessionManager = new ShiroSessionManager();
+ sessionManager.setCacheManager(cacheShiroManager);
+ sessionManager.setSessionValidationInterval((long)(CasicProperties.getSessionValidationInterval() * 1000));
+ sessionManager.setGlobalSessionTimeout((long)(CasicProperties.getSessionInvalidateTime() * 1000));
+ sessionManager.setDeleteInvalidSessions(true);
+ sessionManager.setSessionValidationSchedulerEnabled(true);
+ Cookie cookie = new SimpleCookie("JSESSIONID");
+ cookie.setName("shiroCookie");
+ cookie.setHttpOnly(true);
+ sessionManager.setSessionIdCookie(cookie);
+ List listeners = new ArrayList();
+ listeners.add(sessionListener);
+ sessionManager.setSessionListeners(listeners);
+ return sessionManager;
+ }
+
+ @Bean
+ public SessionListener defaultSessionListener() {
+ return new ShiroSessionListener();
+ }
+
+ @Bean
+ public ShiroDbRealm shiroDbRealm() {
+ return new ShiroDbRealm();
+ }
+
+ @Bean
+ public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) {
+ CookieRememberMeManager manager = new CookieRememberMeManager();
+ manager.setCipherKey(Base64.decode("Z3VucwAAAAAAAAAAAAAAAA=="));
+ manager.setCookie(rememberMeCookie);
+ return manager;
+ }
+
+ @Bean
+ public SimpleCookie rememberMeCookie() {
+ SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
+ simpleCookie.setHttpOnly(true);
+ simpleCookie.setMaxAge(604800);
+ return simpleCookie;
+ }
+
+ @Bean
+ public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager, CasicProperties CasicProperties) {
+ LoggerFactory.getLogger(this.getClass()).info("bili bili!! Talk is cheap,Show me the code!");
+ ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
+ shiroFilter.setSecurityManager(securityManager);
+ shiroFilter.setLoginUrl("/sys/user/login");
+ shiroFilter.setSuccessUrl(CasicProperties.getSuccessUrl());
+ shiroFilter.setUnauthorizedUrl("/global/error");
+ HashMap myFilters = new HashMap();
+ myFilters.put("user", new UserLoginFilter(CasicProperties));
+ shiroFilter.setFilters(myFilters);
+ Map hashMap = new LinkedHashMap();
+ hashMap.put("/static/**", "anon");
+ hashMap.put("/doc.html", "anon");
+ hashMap.put("/swagger-resources/**", "anon");
+ hashMap.put("/v2/api-docs", "anon");
+ hashMap.put("/v2/api-docs-ext", "anon");
+ hashMap.put("/webjars/**", "anon");
+ Iterator var6 = CasicProperties.getNoLoginUrls().iterator();
+ while(var6.hasNext()) {
+ String url = (String)var6.next();
+ hashMap.put(url, "anon");
+ }
+ hashMap.put("/**", "user");
+ shiroFilter.setFilterChainDefinitionMap(hashMap);
+ return shiroFilter;
+ }
+
+ @Bean
+ public MethodInvokingFactoryBean methodInvokingFactoryBean(DefaultWebSecurityManager securityManager) {
+ MethodInvokingFactoryBean bean = new MethodInvokingFactoryBean();
+ bean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager");
+ bean.setArguments(new Object[]{securityManager});
+ return bean;
+ }
+
+ @Bean
+ public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
+ return new LifecycleBeanPostProcessor();
+ }
+
+ @Bean
+ public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
+ AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
+ authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
+ return authorizationAttributeSourceAdvisor;
+ }
+}
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index cdd13f2..a2bdad6 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -38,16 +38,6 @@
-
-
-
-
-
-
-
-
-
-
com.casic
@@ -86,6 +76,21 @@
com.casic
casic-admin-core
${admin.version}
+
+
+ io.springfox
+ springfox-swagger2
+
+
+ io.springfox
+ springfox-core
+
+
+ io.springfox
+ springfox-spring-web
+
+
+
com.casic
@@ -169,18 +174,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+ com.github.xiaoymin
+
+ knife4j-spring-boot-starter
+ 3.0.3
+
diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
index 6eebb1a..862cbc6 100644
--- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
+++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
@@ -27,7 +27,10 @@
@EnableTransactionManagement(proxyTargetClass = true)
@EnableAsync
@Slf4j
-//@EnableSwagger2
+@ComponentScan(excludeFilters =
+ {@ComponentScan.Filter(
+ type = FilterType.REGEX,
+ pattern = {"com.casic.missiles.config.web.ShiroConfig"})})
public class CasicApplication {
public static void main(String[] args) {
SpringApplication.run(CasicApplication.class, args);
diff --git a/casic-web/src/main/java/com/casic/missiles/config/Knife4jConfiguration.java b/casic-web/src/main/java/com/casic/missiles/config/Knife4jConfiguration.java
new file mode 100644
index 0000000..2e7b78d
--- /dev/null
+++ b/casic-web/src/main/java/com/casic/missiles/config/Knife4jConfiguration.java
@@ -0,0 +1,38 @@
+package com.casic.missiles.config;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+@Configuration
+@EnableKnife4j
+public class Knife4jConfiguration {
+
+ @Value(value = "${swagger.enable}")
+ public boolean enable;
+ @Value(value = "${swagger.groupName}")
+ public String groupName;
+
+ @Bean(value = "dockerBean")
+ public Docket dockerBean() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(new ApiInfoBuilder()
+ //描述字段支持Markdown语法
+ .description("# Knife4j RESTful APIs")
+ .termsOfServiceUrl("https://doc.casic.com/")
+ .version("1.0")
+ .build())
+ //分组名称
+ .groupName(groupName)
+ .select()
+ .apis(RequestHandlerSelectors.basePackage("com.casic"))
+ .paths(PathSelectors.any()).build().enable(enable);
+ }
+
+}
\ No newline at end of file
diff --git a/casic-web/src/main/java/com/casic/missiles/config/ShiroConfigs.java b/casic-web/src/main/java/com/casic/missiles/config/ShiroConfigs.java
new file mode 100644
index 0000000..af7da37
--- /dev/null
+++ b/casic-web/src/main/java/com/casic/missiles/config/ShiroConfigs.java
@@ -0,0 +1,177 @@
+package com.casic.missiles.config;
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by Fernflower decompiler)
+//
+
+
+import com.casic.missiles.config.properties.CasicProperties;
+import com.casic.missiles.core.filter.UserLoginFilter;
+import com.casic.missiles.core.listener.ShiroSessionListener;
+import com.casic.missiles.core.shiro.ShiroDbRealm;
+import com.casic.missiles.core.shiro.ShiroSessionManager;
+import com.casic.missiles.core.shiro.dao.RedisSessionDao;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.Filter;
+import org.apache.shiro.cache.CacheManager;
+import org.apache.shiro.codec.Base64;
+import org.apache.shiro.session.SessionListener;
+import org.apache.shiro.session.mgt.SessionManager;
+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.CookieRememberMeManager;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.apache.shiro.web.servlet.Cookie;
+import org.apache.shiro.web.servlet.SimpleCookie;
+import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.data.redis.core.RedisTemplate;
+
+@Configuration
+@DependsOn({"springContextHolder"})
+public class ShiroConfigs {
+ public ShiroConfigs() {
+ }
+
+ @Bean
+ public DefaultWebSecurityManager securityManager(CacheManager cacheShiroManager, SessionManager sessionManager) {
+ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+ securityManager.setRealm(this.shiroDbRealm());
+ securityManager.setCacheManager(cacheShiroManager);
+ securityManager.setSessionManager(sessionManager);
+ return securityManager;
+ }
+
+ @Bean
+ @ConditionalOnProperty(
+ prefix = "casic",
+ name = {"spring-session-open"},
+ havingValue = "true"
+ )
+ public DefaultWebSessionManager servletContainerSessionManager(@Autowired(required = false) RedisTemplate redisTemplate, CasicProperties casicProperties, SessionListener sessionListener, @Value("${spring.redis.redisValueSerializer:org.springframework.data.redis.serializer.StringRedisSerializer}") String redisValueSerializer) {
+ DefaultWebSessionManager sessionManager = new ShiroSessionManager();
+ sessionManager.setSessionDAO(new RedisSessionDao((long)(casicProperties.getSessionInvalidateTime() * 1000), redisTemplate, redisValueSerializer));
+ sessionManager.setSessionValidationInterval((long)(casicProperties.getSessionValidationInterval() * 1000));
+ sessionManager.setGlobalSessionTimeout((long)(casicProperties.getSessionInvalidateTime() * 1000));
+ sessionManager.setDeleteInvalidSessions(true);
+ sessionManager.setSessionValidationSchedulerEnabled(true);
+ Cookie cookie = new SimpleCookie("JSESSIONID");
+ cookie.setName("shiroCookie");
+ cookie.setHttpOnly(true);
+ sessionManager.setSessionIdCookie(cookie);
+ List listeners = new ArrayList();
+ listeners.add(sessionListener);
+ sessionManager.setSessionListeners(listeners);
+ return sessionManager;
+ }
+
+ @Bean
+ @ConditionalOnProperty(
+ prefix = "casic",
+ name = {"spring-session-open"},
+ havingValue = "false"
+ )
+ public DefaultWebSessionManager defaultWebSessionManager(CacheManager cacheShiroManager, CasicProperties CasicProperties, SessionListener sessionListener) {
+ DefaultWebSessionManager sessionManager = new ShiroSessionManager();
+ sessionManager.setCacheManager(cacheShiroManager);
+ sessionManager.setSessionValidationInterval((long)(CasicProperties.getSessionValidationInterval() * 1000));
+ sessionManager.setGlobalSessionTimeout((long)(CasicProperties.getSessionInvalidateTime() * 1000));
+ sessionManager.setDeleteInvalidSessions(true);
+ sessionManager.setSessionValidationSchedulerEnabled(true);
+ Cookie cookie = new SimpleCookie("JSESSIONID");
+ cookie.setName("shiroCookie");
+ cookie.setHttpOnly(true);
+ sessionManager.setSessionIdCookie(cookie);
+ List listeners = new ArrayList();
+ listeners.add(sessionListener);
+ sessionManager.setSessionListeners(listeners);
+ return sessionManager;
+ }
+
+ @Bean
+ public SessionListener defaultSessionListener() {
+ return new ShiroSessionListener();
+ }
+
+ @Bean
+ public ShiroDbRealm shiroDbRealm() {
+ return new ShiroDbRealm();
+ }
+
+ @Bean
+ public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) {
+ CookieRememberMeManager manager = new CookieRememberMeManager();
+ manager.setCipherKey(Base64.decode("Z3VucwAAAAAAAAAAAAAAAA=="));
+ manager.setCookie(rememberMeCookie);
+ return manager;
+ }
+
+ @Bean
+ public SimpleCookie rememberMeCookie() {
+ SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
+ simpleCookie.setHttpOnly(true);
+ simpleCookie.setMaxAge(604800);
+ return simpleCookie;
+ }
+
+ @Bean
+ public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager, CasicProperties CasicProperties) {
+ LoggerFactory.getLogger(this.getClass()).info("bili bili!! Talk is cheap,Show me the code!");
+ ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
+ shiroFilter.setSecurityManager(securityManager);
+ shiroFilter.setLoginUrl("/sys/user/login");
+ shiroFilter.setSuccessUrl(CasicProperties.getSuccessUrl());
+ shiroFilter.setUnauthorizedUrl("/global/error");
+ HashMap myFilters = new HashMap();
+ myFilters.put("user", new UserLoginFilter(CasicProperties));
+ shiroFilter.setFilters(myFilters);
+ Map hashMap = new LinkedHashMap();
+ hashMap.put("/static/**", "anon");
+ hashMap.put("/doc.html", "anon");
+ hashMap.put("/swagger-resources/**", "anon");
+ hashMap.put("/v2/api-docs", "anon");
+ hashMap.put("/v2/api-docs-ext", "anon");
+ hashMap.put("/webjars/**", "anon");
+ Iterator var6 = CasicProperties.getNoLoginUrls().iterator();
+ while(var6.hasNext()) {
+ String url = (String)var6.next();
+ hashMap.put(url, "anon");
+ }
+ hashMap.put("/**", "user");
+ shiroFilter.setFilterChainDefinitionMap(hashMap);
+ return shiroFilter;
+ }
+
+ @Bean
+ public MethodInvokingFactoryBean methodInvokingFactoryBean(DefaultWebSecurityManager securityManager) {
+ MethodInvokingFactoryBean bean = new MethodInvokingFactoryBean();
+ bean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager");
+ bean.setArguments(new Object[]{securityManager});
+ return bean;
+ }
+
+ @Bean
+ public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
+ return new LifecycleBeanPostProcessor();
+ }
+
+ @Bean
+ public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
+ AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
+ authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
+ return authorizationAttributeSourceAdvisor;
+ }
+}
diff --git a/casic-web/src/main/java/com/casic/missiles/config/WebMvcConfig.java b/casic-web/src/main/java/com/casic/missiles/config/WebMvcConfig.java
index 9a96d67..52d207a 100644
--- a/casic-web/src/main/java/com/casic/missiles/config/WebMvcConfig.java
+++ b/casic-web/src/main/java/com/casic/missiles/config/WebMvcConfig.java
@@ -8,7 +8,6 @@
class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
-
registry.addResourceHandler("swagger-ui.html").addResourceLocations(
"classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations(
diff --git a/casic-web/pom.xml b/casic-web/pom.xml
index cdd13f2..a2bdad6 100644
--- a/casic-web/pom.xml
+++ b/casic-web/pom.xml
@@ -38,16 +38,6 @@
-
-
-
-
-
-
-
-
-
-
com.casic
@@ -86,6 +76,21 @@
com.casic
casic-admin-core
${admin.version}
+
+
+ io.springfox
+ springfox-swagger2
+
+
+ io.springfox
+ springfox-core
+
+
+ io.springfox
+ springfox-spring-web
+
+
+
com.casic
@@ -169,18 +174,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+ com.github.xiaoymin
+
+ knife4j-spring-boot-starter
+ 3.0.3
+
diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
index 6eebb1a..862cbc6 100644
--- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
+++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java
@@ -27,7 +27,10 @@
@EnableTransactionManagement(proxyTargetClass = true)
@EnableAsync
@Slf4j
-//@EnableSwagger2
+@ComponentScan(excludeFilters =
+ {@ComponentScan.Filter(
+ type = FilterType.REGEX,
+ pattern = {"com.casic.missiles.config.web.ShiroConfig"})})
public class CasicApplication {
public static void main(String[] args) {
SpringApplication.run(CasicApplication.class, args);
diff --git a/casic-web/src/main/java/com/casic/missiles/config/Knife4jConfiguration.java b/casic-web/src/main/java/com/casic/missiles/config/Knife4jConfiguration.java
new file mode 100644
index 0000000..2e7b78d
--- /dev/null
+++ b/casic-web/src/main/java/com/casic/missiles/config/Knife4jConfiguration.java
@@ -0,0 +1,38 @@
+package com.casic.missiles.config;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+@Configuration
+@EnableKnife4j
+public class Knife4jConfiguration {
+
+ @Value(value = "${swagger.enable}")
+ public boolean enable;
+ @Value(value = "${swagger.groupName}")
+ public String groupName;
+
+ @Bean(value = "dockerBean")
+ public Docket dockerBean() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(new ApiInfoBuilder()
+ //描述字段支持Markdown语法
+ .description("# Knife4j RESTful APIs")
+ .termsOfServiceUrl("https://doc.casic.com/")
+ .version("1.0")
+ .build())
+ //分组名称
+ .groupName(groupName)
+ .select()
+ .apis(RequestHandlerSelectors.basePackage("com.casic"))
+ .paths(PathSelectors.any()).build().enable(enable);
+ }
+
+}
\ No newline at end of file
diff --git a/casic-web/src/main/java/com/casic/missiles/config/ShiroConfigs.java b/casic-web/src/main/java/com/casic/missiles/config/ShiroConfigs.java
new file mode 100644
index 0000000..af7da37
--- /dev/null
+++ b/casic-web/src/main/java/com/casic/missiles/config/ShiroConfigs.java
@@ -0,0 +1,177 @@
+package com.casic.missiles.config;
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by Fernflower decompiler)
+//
+
+
+import com.casic.missiles.config.properties.CasicProperties;
+import com.casic.missiles.core.filter.UserLoginFilter;
+import com.casic.missiles.core.listener.ShiroSessionListener;
+import com.casic.missiles.core.shiro.ShiroDbRealm;
+import com.casic.missiles.core.shiro.ShiroSessionManager;
+import com.casic.missiles.core.shiro.dao.RedisSessionDao;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.Filter;
+import org.apache.shiro.cache.CacheManager;
+import org.apache.shiro.codec.Base64;
+import org.apache.shiro.session.SessionListener;
+import org.apache.shiro.session.mgt.SessionManager;
+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.CookieRememberMeManager;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.apache.shiro.web.servlet.Cookie;
+import org.apache.shiro.web.servlet.SimpleCookie;
+import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.data.redis.core.RedisTemplate;
+
+@Configuration
+@DependsOn({"springContextHolder"})
+public class ShiroConfigs {
+ public ShiroConfigs() {
+ }
+
+ @Bean
+ public DefaultWebSecurityManager securityManager(CacheManager cacheShiroManager, SessionManager sessionManager) {
+ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+ securityManager.setRealm(this.shiroDbRealm());
+ securityManager.setCacheManager(cacheShiroManager);
+ securityManager.setSessionManager(sessionManager);
+ return securityManager;
+ }
+
+ @Bean
+ @ConditionalOnProperty(
+ prefix = "casic",
+ name = {"spring-session-open"},
+ havingValue = "true"
+ )
+ public DefaultWebSessionManager servletContainerSessionManager(@Autowired(required = false) RedisTemplate redisTemplate, CasicProperties casicProperties, SessionListener sessionListener, @Value("${spring.redis.redisValueSerializer:org.springframework.data.redis.serializer.StringRedisSerializer}") String redisValueSerializer) {
+ DefaultWebSessionManager sessionManager = new ShiroSessionManager();
+ sessionManager.setSessionDAO(new RedisSessionDao((long)(casicProperties.getSessionInvalidateTime() * 1000), redisTemplate, redisValueSerializer));
+ sessionManager.setSessionValidationInterval((long)(casicProperties.getSessionValidationInterval() * 1000));
+ sessionManager.setGlobalSessionTimeout((long)(casicProperties.getSessionInvalidateTime() * 1000));
+ sessionManager.setDeleteInvalidSessions(true);
+ sessionManager.setSessionValidationSchedulerEnabled(true);
+ Cookie cookie = new SimpleCookie("JSESSIONID");
+ cookie.setName("shiroCookie");
+ cookie.setHttpOnly(true);
+ sessionManager.setSessionIdCookie(cookie);
+ List listeners = new ArrayList();
+ listeners.add(sessionListener);
+ sessionManager.setSessionListeners(listeners);
+ return sessionManager;
+ }
+
+ @Bean
+ @ConditionalOnProperty(
+ prefix = "casic",
+ name = {"spring-session-open"},
+ havingValue = "false"
+ )
+ public DefaultWebSessionManager defaultWebSessionManager(CacheManager cacheShiroManager, CasicProperties CasicProperties, SessionListener sessionListener) {
+ DefaultWebSessionManager sessionManager = new ShiroSessionManager();
+ sessionManager.setCacheManager(cacheShiroManager);
+ sessionManager.setSessionValidationInterval((long)(CasicProperties.getSessionValidationInterval() * 1000));
+ sessionManager.setGlobalSessionTimeout((long)(CasicProperties.getSessionInvalidateTime() * 1000));
+ sessionManager.setDeleteInvalidSessions(true);
+ sessionManager.setSessionValidationSchedulerEnabled(true);
+ Cookie cookie = new SimpleCookie("JSESSIONID");
+ cookie.setName("shiroCookie");
+ cookie.setHttpOnly(true);
+ sessionManager.setSessionIdCookie(cookie);
+ List listeners = new ArrayList();
+ listeners.add(sessionListener);
+ sessionManager.setSessionListeners(listeners);
+ return sessionManager;
+ }
+
+ @Bean
+ public SessionListener defaultSessionListener() {
+ return new ShiroSessionListener();
+ }
+
+ @Bean
+ public ShiroDbRealm shiroDbRealm() {
+ return new ShiroDbRealm();
+ }
+
+ @Bean
+ public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) {
+ CookieRememberMeManager manager = new CookieRememberMeManager();
+ manager.setCipherKey(Base64.decode("Z3VucwAAAAAAAAAAAAAAAA=="));
+ manager.setCookie(rememberMeCookie);
+ return manager;
+ }
+
+ @Bean
+ public SimpleCookie rememberMeCookie() {
+ SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
+ simpleCookie.setHttpOnly(true);
+ simpleCookie.setMaxAge(604800);
+ return simpleCookie;
+ }
+
+ @Bean
+ public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager, CasicProperties CasicProperties) {
+ LoggerFactory.getLogger(this.getClass()).info("bili bili!! Talk is cheap,Show me the code!");
+ ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
+ shiroFilter.setSecurityManager(securityManager);
+ shiroFilter.setLoginUrl("/sys/user/login");
+ shiroFilter.setSuccessUrl(CasicProperties.getSuccessUrl());
+ shiroFilter.setUnauthorizedUrl("/global/error");
+ HashMap myFilters = new HashMap();
+ myFilters.put("user", new UserLoginFilter(CasicProperties));
+ shiroFilter.setFilters(myFilters);
+ Map hashMap = new LinkedHashMap();
+ hashMap.put("/static/**", "anon");
+ hashMap.put("/doc.html", "anon");
+ hashMap.put("/swagger-resources/**", "anon");
+ hashMap.put("/v2/api-docs", "anon");
+ hashMap.put("/v2/api-docs-ext", "anon");
+ hashMap.put("/webjars/**", "anon");
+ Iterator var6 = CasicProperties.getNoLoginUrls().iterator();
+ while(var6.hasNext()) {
+ String url = (String)var6.next();
+ hashMap.put(url, "anon");
+ }
+ hashMap.put("/**", "user");
+ shiroFilter.setFilterChainDefinitionMap(hashMap);
+ return shiroFilter;
+ }
+
+ @Bean
+ public MethodInvokingFactoryBean methodInvokingFactoryBean(DefaultWebSecurityManager securityManager) {
+ MethodInvokingFactoryBean bean = new MethodInvokingFactoryBean();
+ bean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager");
+ bean.setArguments(new Object[]{securityManager});
+ return bean;
+ }
+
+ @Bean
+ public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
+ return new LifecycleBeanPostProcessor();
+ }
+
+ @Bean
+ public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
+ AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
+ authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
+ return authorizationAttributeSourceAdvisor;
+ }
+}
diff --git a/casic-web/src/main/java/com/casic/missiles/config/WebMvcConfig.java b/casic-web/src/main/java/com/casic/missiles/config/WebMvcConfig.java
index 9a96d67..52d207a 100644
--- a/casic-web/src/main/java/com/casic/missiles/config/WebMvcConfig.java
+++ b/casic-web/src/main/java/com/casic/missiles/config/WebMvcConfig.java
@@ -8,7 +8,6 @@
class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
-
registry.addResourceHandler("swagger-ui.html").addResourceLocations(
"classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations(
diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml
index 6e69581..d8aab53 100644
--- a/casic-web/src/main/resources/config/application-dev.yml
+++ b/casic-web/src/main/resources/config/application-dev.yml
@@ -31,7 +31,7 @@
casic:
kaptcha-open: false #是否开启登录时验证码 (true/false)
#kaptcha-open: false #是否开启登录时验证码 (true/false)
- no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken
+ no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/doc.html
db:
init:
enable: false