zoukankan      html  css  js  c++  java
  • springcloud provider:security--->consumer:HttpHeaders

    服务提供方配置安全验证

    前面的文章只是简单搭建了服务之间的调用,学习springCloud(一)之项目的搭建

    使用了RestTemplate进行远程接口调用,但要注意,这些Rest服务最终都可能暴露在公网的,任何人都可能调用,如果你的Rest服务属于一些私密信息,这样会导致信息的泄露。

    如果想进行安全方面的处理,首先要在服务的提供方上进行处理。

    【springcloud-provider-product】修改pom文件,追加 SpringSecurity 相关依赖信息

    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4

    【springcloud-provider-product】修改application.yml配置文件,进行安全的用户名配置

    spring: 
     security:
       user:
         name: admin  # 认证用户名
         password: enjoy  # 认证密码
         roles:
          - USER # 授权角色
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在项目中访问rest接口,localhost:8080/prodcut/list,这个时候会要求先输入用户名以及密码才能允许访问
    在这里插入图片描述
    输入用户名密码就可以调用前面的接口了

    服务消费方处理

    服务提供方目前已经使用了密码验证,这个时候服务的消费方如果想直接访问就不可能了,这个时候一个以头的信息进行处理,然后使用Base64进行加密处理后才能得到正确的访问路径

    【springcloud-consumer】 修改RestConfig配置类,在里面添加 HttpHeaders 的配置信息

    package cn.enjoy.config;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.HttpHeaders;
    import org.springframework.web.client.RestTemplate;
    import java.nio.charset.Charset;
    import java.util.Base64;
    @Configuration
    public class RestConfig {
        @Bean
        public RestTemplate restTemplate() {
            return  new RestTemplate();
        }
    
        @Bean
        public HttpHeaders getHeaders() { // 要进行一个Http头信息配置
            HttpHeaders headers = new HttpHeaders(); // 定义一个HTTP的头信息
            String auth = "admin:enjoy"; // 认证的原始信息
            byte[] encodedAuth = Base64.getEncoder()
                    .encode(auth.getBytes(Charset.forName("US-ASCII"))); // 进行一个加密的处理
            String authHeader = "Basic " + new String(encodedAuth);
            headers.set("Authorization", authHeader);
            return headers;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    【springcloud-consumer】 修改ConsumerProductController,在进行服务端调用的时候加上这个头信息

    package cn.enjoy.controller;
    import cn.enjoy.vo.Product;
    import org.springframework.http.HttpEntity;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpMethod;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    import javax.annotation.Resource;
    import java.util.List;
    
    @RestController
    @RequestMapping("/consumer")
    public class ConsumerProductController {
        public static final String PRODUCT_GET_URL = "http://localhost:8080/prodcut/get/";
        public static final String PRODUCT_LIST_URL="http://localhost:8080/prodcut/list/";
        public static final String PRODUCT_ADD_URL = "http://localhost:8080/prodcut/add/";
    
        @Resource
        private RestTemplate restTemplate;
    
        @Resource
        private HttpHeaders httpHeaders;
    
        @RequestMapping("/product/get")
        public Object getProduct(long id) {
            Product product = restTemplate.exchange(PRODUCT_GET_URL + id,HttpMethod.GET,new HttpEntity<Object>(httpHeaders), Product.class).getBody();
            return  product;
        }
    
        @RequestMapping("/product/list")
        public  Object listProduct() {
            List<Product> list = restTemplate.exchange(PRODUCT_LIST_URL,HttpMethod.GET,new HttpEntity<Object>(httpHeaders), List.class).getBody();
            return  list;
        }
    
        @RequestMapping("/product/add")
        public Object addPorduct(Product product) {
            Boolean result = restTemplate.exchange(PRODUCT_ADD_URL, HttpMethod.POST,new HttpEntity<Object>(product,httpHeaders), Boolean.class).getBody();
            return  result;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    【springcloud-security】模块

    现在服务提供方只有一个Product服务,但真实的项目开发中必然有多个服务提供方,绝大多数情况下,这些服务都会用到安全验证,而且密码也会一样,如果每个服务都单独维护,每次密码变动改动都会很大,所以应该单独建立一个安全验证的模块
    创建一个springcloud-security模块,修改其pom文件如下

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>springcloud</artifactId>
            <groupId>enjoy</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
        <version>1.0.0</version>
    
        <artifactId>springcloud-security</artifactId>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
            </dependency>
        </dependencies>
    
    </project>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    【springcloud】修改父工程pom文件,把相应的版本依赖加到里面

    <dependency>
                <groupId>enjoy</groupId>
                <artifactId>springcloud-api</artifactId>
                <version>1.0.0</version>
            </dependency>
            <dependency>
                <groupId>enjoy</groupId>
                <artifactId>springcloud-security</artifactId>
                <version>1.0.0</version>
            </dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    【springcloud-security】建立一个统一的安全配置类,这个类负责用户以及密码相关的配置

    package cn.enjoy.config;
    
    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.config.http.SessionCreationPolicy;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    
    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        @Override
        public void configure(AuthenticationManagerBuilder auth)
                throws Exception {
                    auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser("root").password(new BCryptPasswordEncoder().encode("enjoy")).roles("USER").
                            and().withUser("admin").password(new BCryptPasswordEncoder().encode("enjoy")).roles("USER", "ADMIN");
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
    
    
            http.httpBasic().and().authorizeRequests().anyRequest()
                    .fullyAuthenticated();
            http.sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    【springcloud-provider-product】修改pom文件,删除spring-boot-starter-security的依赖信息,并加入自己定义的springcloud-security依赖

     <!--<dependency>-->
                <!--<groupId>org.springframework.boot</groupId>-->
                <!--<artifactId>spring-boot-starter-security</artifactId>-->
            <!--</dependency>-->
            <dependency>
                <groupId>enjoy</groupId>
                <artifactId>springcloud-security</artifactId>
            </dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    【springcloud-provider-product】修改application.yml,删除与安全相关的配置项。

    # security:
    #   user:
    #     roles:
    #      - USER # 授权角色
    #     name:  root
    #     password:  enjoy
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    调用测试
    新增:http://localhost/consumer/product/add?productName=lison
    列表查询:http://localhost/consumer/product/list
    获得单个数据:http://localhost/consumer/product/get?id=1

    转https://blog.csdn.net/wang852575989/article/details/101996562

  • 相关阅读:
    JavaScript与C# Windows应用程序交互方法
    CREATE TABLE 表名 AS SELECT 语句
    从新开始
    window下安装redis
    最终,我们都变成了机器
    这个网址很学习
    改变你一生命运的话语 不得不信
    看《超级演说家》有感
    网页布局的一点感触
    最近状态不好
  • 原文地址:https://www.cnblogs.com/smallfa/p/14078321.html
Copyright © 2011-2022 走看看