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