所有的 Rest 服务最终都是暴露在公网上的,也就是说如果你的 Rest 服务属于一些你自己公司的私人业务,这样的结果会直接 导致你信息的泄漏,所以对于 Rest 访问,安全性是首要的因素。
2.1、配置安全验证如果要想进行安全的验证处理,那么首先一定要先在服务的提供方上进行处理。1、 【microcloud-provider-dept-8001】修改 pom.xml 配置文件,追加 SpringSecurity 相关依赖包引入:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>如果你现在配置了安全框架,则在启动时会出现有如下的一个提示信息:Using default security password: 75f5d975-0cfc-16e9-b9cc-68fbb0b56465
2、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,进行安全的用户名配置:security.basic.enabled=true
security.user.name=studyjava
security.user.password=hello
security.user.role=USER随后在项目之中访问 Rest 服务接口:http://localhost:8001/dept/list,此时在访问的时候会直接询问用户要求用户输入用户 名以及密码。这个时候有一种更简化的方法进行内容的输入:http:/studyjava:hello@localhost:8001/dept/list[{"deptno":1,"dname":"开发部","loc":"study8001"},
{"deptno":2,"dname":"财务部","loc":"study8001"},
{"deptno":3,"dname":"市场部","loc":"study8001"},
{"deptno":4,"dname":"后勤部","loc":"study8001"},
{"deptno":5,"dname":"公关部","loc":"study8001"},
{"deptno":6,"dname":"测试部-1551928957533","loc":"study8001"}]
 2.2、服务消费端处理在实际的开发之中,对于 Rest 服务提供者是不可能被用户直接进行访问的,于是肯定需要有一个 Rest客户端(WEB 端、 SpringBoot)进行调用,可是现在 Rest 提供者的服务上有了认证信息,那么该如何访问呢?public static final String DEPT_GET_URL
= "http://studyjava:hello@localhost/dept/get/";如果这个时候在 Rest 客户端上直接使用用户名和密码做加密处理,那么根本就无法进行访问,此时会出现
有 401 的错误代码, 因为认证出现了错误。之所以无法访问,是因为所有的认证的处理操作,应该以头信息
的模式来进行处理。而后要使用Base64进行加密处理后才可以得到一个正确的访问路径。
 1、 【microcloud-consumer-80】修改 RestConfig 配置类,在这个配置类上追加有新的 Bean 配置
项HttpHeaders package cn.study.microcloud.config;import java.nio.charset.Charset;
import java.util.Base64;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestConfig {@Beanpublic HttpHeaders getHeaders() { // 要进行一个Http头信息配置HttpHeaders headers = new HttpHeaders(); // 定义一个HTTP的头信息String auth = "studyjava:hello"; // 认证的原始信息byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes(Charset.forName("US-ASCII")));
// 进行一个加密的处理// 在进行授权的头信息内容配置的时候加密的信息一定要与“Basic”之间有一个空格String authHeader = "Basic " + new String(encodedAuth);headers.set("Authorization", authHeader);return headers;}@Beanpublic RestTemplate getRestTemplate() {return new RestTemplate() ;}
}
 2、 【microcloud-consumer-80】修改 ConsumerDeptController 配置类,在进行 Rest 访问的时候设置好这个头部的信息package cn.study.microcloud.controller;import java.util.List;import javax.annotation.Resource;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 cn.study.vo.Dept;@RestController
public class ConsumerDeptController {public static final String DEPT_GET_URL = "http://localhost:8001/dept/get/";public static final String DEPT_LIST_URL = "http://localhost:8001/dept/list/";public static final String DEPT_ADD_URL = "http://localhost:8001/dept/add?dname=";@Resourceprivate RestTemplate restTemplate;@Resourceprivate HttpHeaders headers;@RequestMapping(value = "/consumer/dept/get")public Object getDept(long id) {Dept dept = this.restTemplate.exchange(DEPT_GET_URL + id, HttpMethod.GET,new HttpEntity<Object>(this.headers), Dept.class).getBody();return dept;}@SuppressWarnings("unchecked")@RequestMapping(value = "/consumer/dept/list")public Object listDept() {List<Dept> allDepts = this.restTemplate.exchange(DEPT_LIST_URL, HttpMethod.GET,new HttpEntity<Object>(this.headers), List.class).getBody();return allDepts;}@RequestMapping(value = "/consumer/dept/add")public Object addDept(Dept dept) throws Exception {Boolean flag = this.restTemplate.exchange(DEPT_ADD_URL, HttpMethod.POST,new HttpEntity<Object>(dept, this.headers), Boolean.class).getBody();return flag;}
}
3、无状态 Session 配置通过之前一系列的演示可以发现整个 Rest 项目中的一个问题所在,所有的 Rest 都是基于 HTTP 协议的
一种应用,而在这种应 用上,所有的 WEB 容器一般都会提供有一个 Session 的机制,也就是说每一个用户
访问之后如果该用户一直连接,则认为该用户 应该一直被服务器保存状态,但是微服务有可能同时并发访问
几十万人,那么如果所有的 Session 状态都被维护着就会出现内存泄漏1、 【microcloud-provider-dept-8001】现在修改 Rest 程序类,追加一个取得 session id 的方法:package cn.study.microcloud.rest;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import cn.study.microcloud.service.IDeptService;
import cn.study.vo.Dept;@RestController
public class DeptRest { @Resourceprivate IDeptService deptService ;@RequestMapping("/dept/sessionId")public Object id(HttpServletRequest request) {return request.getSession().getId() ;}   @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)public Object get(@PathVariable("id") long id) {return this.deptService.get(id) ;}@RequestMapping(value="/dept/add",method=RequestMethod.GET)public Object add(@RequestBody Dept dept) {return this.deptService.add(dept) ;}@RequestMapping(value="/dept/list",method=RequestMethod.GET)public Object list() {return this.deptService.list() ;}
}随后进行提供者的 Rest 连接访问:
http://studyjava:hello@localhost:8001/dept/sessionId
会发现每访问一次就会出现不同的session idnode02ax7wat4gc981qmfgx47ldoez0node0ni0bvx01totn1tfxrdl572no01
 2、 在有一些的 SpringCloud 的配置之中,默认是会保存有 Session 状态的,而后如果用户有需要则可以根据“SessionCreationPolicy” 枚举类进行不同的 session 状态设置,但是从整体的操作来说,session 最好设置为无状态。application.propertiessecurity.sessions=always· 以下为无状态的 Session 设置(服务器不保存 Session 状态,每一次连接都是一个新的用户):application.propertiessecurity.sessions=stateless不管你以后的项目或者支持类中是否有设置无状态的问题,你最好都进行一下设置,否则你的 Rest 服务将受到严重的内存困 扰,最严重的问题就是内存溢出。
 4、定义公共安全配置程序类在进行 Rest 服务开发的时候,为了保证安全所有的程序里面都需要进行 Spring-Security 安全认证处理,
可是之前所进行的认 证处理都是在 application.yml 配置文件完成的,这样的配置明显是非常不合乎逻辑
的,因为如果此时你要开发的微服务很多,并且 这些微服务都要求使用统一的用户名和密码的时候就非常
不方便了。所以现在最简单的做法是进行统一的设置。1、 创建一个 microcloud-security 的 Maven 模块;2、 【microcloud-security】修改 pom.xml 配置文件添加spring-boot-starter-security:<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"><modelVersion>4.0.0</modelVersion><groupId>microcloud-security</groupId><artifactId>microcloud-security</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><thymeleaf.version>3.0.9.RELEASE</thymeleaf.version><thymeleaf-layout-dialect.version>2.3.0</thymeleaf-layout-dialect.version><!-- 布局功能的支持程序 thymeleaf3主程序 layout2以上版本 --><!-- thymeleaf2 layout1 --><thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version></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</groupId><artifactId>springloaded</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency></dependencies></project>
 3、 【microcloud-security】建立一个统一的安全配置类:package cn.study.microcloud.config;import javax.annotation.Resource;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;@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Resourcepublic void configGlobal(AuthenticationManagerBuilder auth)throws Exception {auth.inMemoryAuthentication().withUser("studyjava").password("hello").roles("USER").and().withUser("admin").password("hello").roles("USER", "ADMIN");}@Overrideprotected void configure(HttpSecurity http) throws Exception {// 表示所有的访问都必须进行认证处理后才可以正常进行http.httpBasic().and().authorizeRequests().anyRequest().fullyAuthenticated();// 所有的Rest服务一定要设置为无状态,以提升操作性能http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);}
}
 4、 【microcloud-provider-dept-8001】修改 pom.xml 配置文件,引入安全配置模块:<dependency><groupId>cn.study</groupId><artifactId>microcloud-security</artifactId><version>0.0.1-SNAPSHOT</version></dependency>
 5、 【microcloud-provider-dept-8001】删除掉 application.properties 中与安全有关的配置项(以下内容删除);security.basic.enabled=true
security.user.name=studyjava
security.user.password=hello
security.user.role=USERsecurity.sessions=stateless由于现在所写的安全处理类是在程序启动类的子包之中,应该可以自动扫描到。
 6、 访问地址:http://studyjava:hello@localhost:8001/dept/sessionIdnode0nqwfqd6r0uex16g8xyig67nu11node01brkfm3euw64r720arye6pvbx2

SpringCloud 配置安全验证、服务消费端处理、无状态 Session 配置、定义公共安全配置程序类相关推荐

  1. 源码分析Dubbo服务消费端启动流程

    通过前面文章详解,我们知道Dubbo服务消费者标签dubbo:reference最终会在Spring容器中创建一个对应的ReferenceBean实例,而ReferenceBean实现了Spring生 ...

  2. SpringCloud系列研究---Eureka服务消费Feign

    转载自:https://www.cnblogs.com/chxuyuan/p/8358998.html SpringCloud系列研究---Eureka服务消费Feign 一.Feign简介 Feig ...

  3. Dubbo学习记录(十七)-服务调用【三】- 服务消费端Invoker的包装

    服务消费端Invoker的包装 服务消费端的Invoker涉及到服务导出流程, 由ReferenceConfigde#get()方法生成一个代理实例Invoker返回: 这次目的的就是 把整个包装链路 ...

  4. 小程序 身份认证服务器,如何实现微信小程序与.net core应用服务端的无状态身份验证...

    随着.net core2的发布,越来越多人使用.net core2开发各种应用服务端,下面我就结合自己最近开发的一款小程序,给大家分享下,怎么使用小程序登录后,小程序与服务端交互的权限控制. 服务端的 ...

  5. (二)SpringCloud,Alibaba微服务架构之——核心模块及相应技术

    一.微服务架构中核心模块及其使用技术总览 二.各模块详细说明 1.注册中心 该模块主要功能为 自动提供服务的注册与发现,集中式管理服务,让 服务调用端发现服务,让服务提供端注册服务,倘若没有注册中心, ...

  6. 【springcloud alibaba】 一条龙服务实现微服务案例

    第一章 微服务介绍 1.1 系统架构演变 1.1.1 SpringCloud Spring Cloud是一系列框架的集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发, ...

  7. 配置CITRIX XML 服务与IIS 7.x共享端口

    配置CITRIX XML服务与IIS 7.x共享端口,请按照以下步骤配置即可: 1.停止并注销 Citrix XML 服务 1.1 停止 XML 服务 单击[开始]→[运行],输入"CMD& ...

  8. 疫情启示 | 服务消费按下“暂停”键,生鲜消费重返“线上”

    疫情启示 | 服务消费按下"暂停"键,生鲜消费重返"线上" 2020年的春节是如此不同寻常.伴随新冠肺炎疫情的爆发,全国范围内的线上.线下消费"冰火两 ...

  9. IPv6地址的无状态自动配置

    首先我们看看IPv4是如何动态配置的IP地址的,在IPv4中,动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)实现了主机IP地址及其相关配置的自动设 ...

最新文章

  1. 【Socket】linux广播技术
  2. 天使投资乱象频出 熟人元素何时剔除
  3. vue可视化拖拽生成工具_vdesjs: 基于vue的可视化拖拽,代码生成工具。提升前端开发效率,或者集成至项目作为在线拖拽工具。(持续迭代升级中)...
  4. Python数值类型:小数与百分数的转换
  5. vant自定义二级菜单
  6. php ayui表格,layui表格使用
  7. oracle的文件后缀名,转:数据文件的扩展名是ora,dbf,dat的,有什么区别?
  8. ChatForFun 公众号使用说明
  9. python缺少标准库_干货分享:Python如何自动导入缺失的库
  10. “百变”Redis带你见识不同场景下的产品技术架构
  11. 织梦dedecms绿色高端生活家具装饰公司网站模板
  12. java冒泡法程序,Java基础之冒泡法的实现
  13. Java-重定向输出流实现程序日志
  14. 推挽输出和开漏输出_平台/输入amp;输出
  15. 保护公民信息安全 中国在行动
  16. parallelstudio license 位置_UAV位置测量仪器Apogee-D Dual GPS INS
  17. 常用的linux巡检命令,linux常用巡检命令
  18. 19款资源整合类网站推荐:每一个网站都堪称以一敌百
  19. dp算法求解矩阵连乘的问题
  20. ES集群状态检查报错:master_not_discovered_exception 503错误

热门文章

  1. LA 4328 Priest John's Busiest Day (Greedy)
  2. WPF的自定义控件 依赖属性,DependencyProperty 路由事件RoutedEvent
  3. “许巍日”新歌提前曝光 《爱如少年》10/15温暖登场!
  4. 悟透JavaScript(美绘本)
  5. SL专题2:加入并熟悉Second Life世界
  6. 【Spring学习】spring注解自动注入bean
  7. 管理之善,在于让员工有机会试错
  8. 潮美之夜见证“夜拍王”诞生,荣耀10 GT照亮三里屯
  9. 《大咖讲Wireshark网络分析》目录—导读
  10. Oracle的奇葩设置之非归档模式与RMAN备份