From 2af06bbdd6e887b975dfad983f6116931bcf4414 Mon Sep 17 00:00:00 2001 From: macro Date: Fri, 18 Oct 2019 17:03:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0SpringCloud=20Feign=E6=94=AF?= =?UTF-8?q?=E6=8C=81=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=AF=B9mall-admin?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=9A=84=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mall-demo/pom.xml | 18 ++-- .../com/macro/mall/MallDemoApplication.java | 2 + .../macro/mall/demo/bo/AdminUserDetails.java | 56 ------------- .../component/FeignRequestInterceptor.java | 32 ++++++++ .../macro/mall/demo/config/FeignConfig.java | 23 ++++++ .../mall/demo/config/RestTemplateConfig.java | 2 + .../mall/demo/config/SecurityConfig.java | 82 ------------------- .../mall/demo/config/Swagger2Config.java | 49 ++++++++++- .../demo/controller/FeignAdminController.java | 36 ++++++++ .../mall/demo/dto/UmsAdminLoginParam.java | 19 +++++ .../mall/demo/service/FeignAdminService.java | 21 +++++ mall-demo/src/main/resources/application.yml | 11 +-- .../src/main/resources/logback-spring.xml | 15 ---- 13 files changed, 190 insertions(+), 176 deletions(-) delete mode 100644 mall-demo/src/main/java/com/macro/mall/demo/bo/AdminUserDetails.java create mode 100644 mall-demo/src/main/java/com/macro/mall/demo/component/FeignRequestInterceptor.java create mode 100644 mall-demo/src/main/java/com/macro/mall/demo/config/FeignConfig.java delete mode 100644 mall-demo/src/main/java/com/macro/mall/demo/config/SecurityConfig.java create mode 100644 mall-demo/src/main/java/com/macro/mall/demo/controller/FeignAdminController.java create mode 100644 mall-demo/src/main/java/com/macro/mall/demo/dto/UmsAdminLoginParam.java create mode 100644 mall-demo/src/main/java/com/macro/mall/demo/service/FeignAdminService.java delete mode 100644 mall-demo/src/main/resources/logback-spring.xml diff --git a/mall-demo/pom.xml b/mall-demo/pom.xml index 481cd1f..ff533cf 100644 --- a/mall-demo/pom.xml +++ b/mall-demo/pom.xml @@ -26,21 +26,19 @@ com.macro.mall mall-mbg - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-security - org.springframework.cloud spring-cloud-starter-netflix-eureka-client - net.logstash.logback - logstash-logback-encoder + org.springframework.cloud + spring-cloud-starter-openfeign + + + org.springframework.security + spring-security-core + 5.1.6.RELEASE + compile diff --git a/mall-demo/src/main/java/com/macro/mall/MallDemoApplication.java b/mall-demo/src/main/java/com/macro/mall/MallDemoApplication.java index 308b020..c104a3d 100644 --- a/mall-demo/src/main/java/com/macro/mall/MallDemoApplication.java +++ b/mall-demo/src/main/java/com/macro/mall/MallDemoApplication.java @@ -3,7 +3,9 @@ package com.macro.mall; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +@EnableFeignClients @EnableDiscoveryClient @SpringBootApplication public class MallDemoApplication{ diff --git a/mall-demo/src/main/java/com/macro/mall/demo/bo/AdminUserDetails.java b/mall-demo/src/main/java/com/macro/mall/demo/bo/AdminUserDetails.java deleted file mode 100644 index 2140de0..0000000 --- a/mall-demo/src/main/java/com/macro/mall/demo/bo/AdminUserDetails.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.macro.mall.demo.bo; - -import com.macro.mall.model.UmsAdmin; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; - -import java.util.Arrays; -import java.util.Collection; - -/** - * SpringSecurity需要的用户详情 - */ -public class AdminUserDetails implements UserDetails { - private UmsAdmin umsAdmin; - - public AdminUserDetails(UmsAdmin umsAdmin) { - this.umsAdmin = umsAdmin; - } - - @Override - public Collection getAuthorities() { - //返回当前用户的权限 - return Arrays.asList(new SimpleGrantedAuthority("TEST")); - } - - @Override - public String getPassword() { - return umsAdmin.getPassword(); - } - - @Override - public String getUsername() { - return umsAdmin.getUsername(); - } - - @Override - public boolean isAccountNonExpired() { - return true; - } - - @Override - public boolean isAccountNonLocked() { - return true; - } - - @Override - public boolean isCredentialsNonExpired() { - return true; - } - - @Override - public boolean isEnabled() { - return true; - } -} diff --git a/mall-demo/src/main/java/com/macro/mall/demo/component/FeignRequestInterceptor.java b/mall-demo/src/main/java/com/macro/mall/demo/component/FeignRequestInterceptor.java new file mode 100644 index 0000000..a74a038 --- /dev/null +++ b/mall-demo/src/main/java/com/macro/mall/demo/component/FeignRequestInterceptor.java @@ -0,0 +1,32 @@ +package com.macro.mall.demo.component; + +import feign.RequestInterceptor; +import feign.RequestTemplate; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.Enumeration; + +/** + * 用于Feign传递请求头的拦截器 + * Created by macro on 2019/10/18. + */ +public class FeignRequestInterceptor implements RequestInterceptor { + @Override + public void apply(RequestTemplate requestTemplate) { + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder + .getRequestAttributes(); + if (attributes != null) { + HttpServletRequest request = attributes.getRequest(); + Enumeration headerNames = request.getHeaderNames(); + if (headerNames != null) { + while (headerNames.hasMoreElements()) { + String name = headerNames.nextElement(); + String values = request.getHeader(name); + requestTemplate.header(name, values); + } + } + } + } +} diff --git a/mall-demo/src/main/java/com/macro/mall/demo/config/FeignConfig.java b/mall-demo/src/main/java/com/macro/mall/demo/config/FeignConfig.java new file mode 100644 index 0000000..32ff244 --- /dev/null +++ b/mall-demo/src/main/java/com/macro/mall/demo/config/FeignConfig.java @@ -0,0 +1,23 @@ +package com.macro.mall.demo.config; + +import com.macro.mall.demo.component.FeignRequestInterceptor; +import feign.Logger; +import feign.RequestInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Created by macro on 2019/9/5. + */ +@Configuration +public class FeignConfig { + @Bean + Logger.Level feignLoggerLevel() { + return Logger.Level.FULL; + } + + @Bean + RequestInterceptor requestInterceptor() { + return new FeignRequestInterceptor(); + } +} diff --git a/mall-demo/src/main/java/com/macro/mall/demo/config/RestTemplateConfig.java b/mall-demo/src/main/java/com/macro/mall/demo/config/RestTemplateConfig.java index cbc4ba5..ad8b09f 100644 --- a/mall-demo/src/main/java/com/macro/mall/demo/config/RestTemplateConfig.java +++ b/mall-demo/src/main/java/com/macro/mall/demo/config/RestTemplateConfig.java @@ -1,5 +1,6 @@ package com.macro.mall.demo.config; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @@ -11,6 +12,7 @@ import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { @Bean + @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } diff --git a/mall-demo/src/main/java/com/macro/mall/demo/config/SecurityConfig.java b/mall-demo/src/main/java/com/macro/mall/demo/config/SecurityConfig.java deleted file mode 100644 index fe37ffc..0000000 --- a/mall-demo/src/main/java/com/macro/mall/demo/config/SecurityConfig.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.macro.mall.demo.config; - -import com.macro.mall.demo.bo.AdminUserDetails; -import com.macro.mall.mapper.UmsAdminMapper; -import com.macro.mall.model.UmsAdmin; -import com.macro.mall.model.UmsAdminExample; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - -import java.util.List; - -/** - * SpringSecurity的配置 - */ -@Configuration -@EnableWebSecurity -public class SecurityConfig extends WebSecurityConfigurerAdapter { - @Autowired - private UmsAdminMapper umsAdminMapper; - - @Override - protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests()//配置权限 -// .antMatchers("/").access("hasRole('TEST')")//该路径需要TEST角色 - .antMatchers("/").authenticated()//该路径需要登录认证 -// .antMatchers("/brand/list").hasAuthority("TEST")//该路径需要TEST权限 - .antMatchers("/**").permitAll() - .antMatchers("/actuator/**")// 允许SpringBoot Admin 访问监控信息 - .permitAll() - .and()//启用基于http的认证 - .httpBasic() - .realmName("/") - .and()//配置登录页面 - .formLogin() - .loginPage("/login") - .failureUrl("/login?error=true") - .and()//配置退出路径 - .logout() - .logoutSuccessUrl("/") -// .and()//记住密码功能 -// .rememberMe() -// .tokenValiditySeconds(60*60*24) -// .key("rememberMeKey") - .and()//关闭跨域伪造 - .csrf() - .disable() - .headers()//去除X-Frame-Options - .frameOptions() - .disable(); - } - - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(userDetailsService()).passwordEncoder(new BCryptPasswordEncoder()); - } - - @Bean - public UserDetailsService userDetailsService() { - //获取登录用户信息 - return new UserDetailsService() { - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - UmsAdminExample example = new UmsAdminExample(); - example.createCriteria().andUsernameEqualTo(username); - List umsAdminList = umsAdminMapper.selectByExample(example); - if (umsAdminList != null && umsAdminList.size() > 0) { - return new AdminUserDetails(umsAdminList.get(0)); - } - throw new UsernameNotFoundException("用户名或密码错误"); - } - }; - } -} diff --git a/mall-demo/src/main/java/com/macro/mall/demo/config/Swagger2Config.java b/mall-demo/src/main/java/com/macro/mall/demo/config/Swagger2Config.java index d7a2d62..cf7069b 100644 --- a/mall-demo/src/main/java/com/macro/mall/demo/config/Swagger2Config.java +++ b/mall-demo/src/main/java/com/macro/mall/demo/config/Swagger2Config.java @@ -6,10 +6,17 @@ import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; +import springfox.documentation.service.SecurityReference; import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; +import java.util.ArrayList; +import java.util.List; + /** * Swagger2API文档的配置 */ @@ -21,17 +28,51 @@ public class Swagger2Config { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() - .apis(RequestHandlerSelectors.basePackage("com.macro.mall.demo")) + .apis(RequestHandlerSelectors.basePackage("com.macro.mall.demo.controller")) .paths(PathSelectors.any()) - .build(); + .build() + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()); } private ApiInfo apiInfo() { return new ApiInfoBuilder() - .title("SwaggerUI演示") - .description("Demo模块") + .title("mall-demo系统") + .description("SpringCloud版本中的一些示例") .contact("macro") .version("1.0") .build(); } + + private List securitySchemes() { + //设置请求头信息 + List result = new ArrayList<>(); + ApiKey apiKey = new ApiKey("Authorization", "Authorization", "header"); + result.add(apiKey); + return result; + } + + private List securityContexts() { + //设置需要登录认证的路径 + List result = new ArrayList<>(); + result.add(getContextByPath("/feign/admin/brand.*")); + return result; + } + + private SecurityContext getContextByPath(String pathRegex){ + return SecurityContext.builder() + .securityReferences(defaultAuth()) + .forPaths(PathSelectors.regex(pathRegex)) + .build(); + } + + private List defaultAuth() { + List result = new ArrayList<>(); + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + result.add(new SecurityReference("Authorization", authorizationScopes)); + return result; + } + } diff --git a/mall-demo/src/main/java/com/macro/mall/demo/controller/FeignAdminController.java b/mall-demo/src/main/java/com/macro/mall/demo/controller/FeignAdminController.java new file mode 100644 index 0000000..265a320 --- /dev/null +++ b/mall-demo/src/main/java/com/macro/mall/demo/controller/FeignAdminController.java @@ -0,0 +1,36 @@ +package com.macro.mall.demo.controller; + +/** + * Created by macro on 2019/10/18. + */ + +import com.macro.mall.common.api.CommonResult; +import com.macro.mall.demo.dto.UmsAdminLoginParam; +import com.macro.mall.demo.service.FeignAdminService; +import com.macro.mall.model.PmsBrand; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * Feign调用mall-admin接口示例 + */ +@Api(tags = "FeignAdminController", description = "Feign调用mall-admin接口示例") +@RestController +@RequestMapping("/feign/admin") +public class FeignAdminController { + @Autowired + private FeignAdminService adminService; + + @PostMapping("/login") + public CommonResult login(@RequestBody UmsAdminLoginParam loginParam) { + return adminService.login(loginParam); + } + + @GetMapping("/brand/listAll") + public CommonResult getBrandList(){ + return adminService.getList(); + } +} diff --git a/mall-demo/src/main/java/com/macro/mall/demo/dto/UmsAdminLoginParam.java b/mall-demo/src/main/java/com/macro/mall/demo/dto/UmsAdminLoginParam.java new file mode 100644 index 0000000..98cd507 --- /dev/null +++ b/mall-demo/src/main/java/com/macro/mall/demo/dto/UmsAdminLoginParam.java @@ -0,0 +1,19 @@ +package com.macro.mall.demo.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.validator.constraints.NotEmpty; + +/** + * 用户登录参数 + * Created by macro on 2018/4/26. + */ +@Getter +@Setter +public class UmsAdminLoginParam { + @ApiModelProperty(value = "用户名", required = true) + private String username; + @ApiModelProperty(value = "密码", required = true) + private String password; +} diff --git a/mall-demo/src/main/java/com/macro/mall/demo/service/FeignAdminService.java b/mall-demo/src/main/java/com/macro/mall/demo/service/FeignAdminService.java new file mode 100644 index 0000000..cec18f0 --- /dev/null +++ b/mall-demo/src/main/java/com/macro/mall/demo/service/FeignAdminService.java @@ -0,0 +1,21 @@ +package com.macro.mall.demo.service; + +import com.macro.mall.common.api.CommonResult; +import com.macro.mall.demo.dto.UmsAdminLoginParam; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * Created by macro on 2019/10/18. + */ +@FeignClient("mall-admin") +public interface FeignAdminService { + + @PostMapping("/admin/login") + CommonResult login(@RequestBody UmsAdminLoginParam loginParam); + + @GetMapping("/brand/listAll") + CommonResult getList(); +} diff --git a/mall-demo/src/main/resources/application.yml b/mall-demo/src/main/resources/application.yml index 640ab81..e339027 100644 --- a/mall-demo/src/main/resources/application.yml +++ b/mall-demo/src/main/resources/application.yml @@ -7,12 +7,6 @@ spring: url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: root - thymeleaf: - mode: HTML5 - encoding: utf-8 - servlet: - content-type: text/html - cache: false #开发时关闭缓存,不然没法看到实时页面 mybatis: mapper-locations: - classpath:mapper/*.xml @@ -21,11 +15,10 @@ logging: level: root: info #日志配置DEBUG,INFO,WARN,ERROR com.macro.mall: debug -# file: demo_log.log #配置日志生成路径 -# path: /var/logs #配置日志文件名称 + com.macro.mall.demo.service.FeignAdminService: debug host: mall: - admin: http://localhost:8080 + admin: http://mall-admin eureka: client: register-with-eureka: true diff --git a/mall-demo/src/main/resources/logback-spring.xml b/mall-demo/src/main/resources/logback-spring.xml deleted file mode 100644 index 0baa1dd..0000000 --- a/mall-demo/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - localhost:4560 - - - - - - - - -