SpringCloud 配置安全验证、服务消费端处理、无状态 Session 配置、定义公共安全配置程序类
所有的 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 配置、定义公共安全配置程序类相关推荐
- 源码分析Dubbo服务消费端启动流程
通过前面文章详解,我们知道Dubbo服务消费者标签dubbo:reference最终会在Spring容器中创建一个对应的ReferenceBean实例,而ReferenceBean实现了Spring生 ...
- SpringCloud系列研究---Eureka服务消费Feign
转载自:https://www.cnblogs.com/chxuyuan/p/8358998.html SpringCloud系列研究---Eureka服务消费Feign 一.Feign简介 Feig ...
- Dubbo学习记录(十七)-服务调用【三】- 服务消费端Invoker的包装
服务消费端Invoker的包装 服务消费端的Invoker涉及到服务导出流程, 由ReferenceConfigde#get()方法生成一个代理实例Invoker返回: 这次目的的就是 把整个包装链路 ...
- 小程序 身份认证服务器,如何实现微信小程序与.net core应用服务端的无状态身份验证...
随着.net core2的发布,越来越多人使用.net core2开发各种应用服务端,下面我就结合自己最近开发的一款小程序,给大家分享下,怎么使用小程序登录后,小程序与服务端交互的权限控制. 服务端的 ...
- (二)SpringCloud,Alibaba微服务架构之——核心模块及相应技术
一.微服务架构中核心模块及其使用技术总览 二.各模块详细说明 1.注册中心 该模块主要功能为 自动提供服务的注册与发现,集中式管理服务,让 服务调用端发现服务,让服务提供端注册服务,倘若没有注册中心, ...
- 【springcloud alibaba】 一条龙服务实现微服务案例
第一章 微服务介绍 1.1 系统架构演变 1.1.1 SpringCloud Spring Cloud是一系列框架的集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发, ...
- 配置CITRIX XML 服务与IIS 7.x共享端口
配置CITRIX XML服务与IIS 7.x共享端口,请按照以下步骤配置即可: 1.停止并注销 Citrix XML 服务 1.1 停止 XML 服务 单击[开始]→[运行],输入"CMD& ...
- 疫情启示 | 服务消费按下“暂停”键,生鲜消费重返“线上”
疫情启示 | 服务消费按下"暂停"键,生鲜消费重返"线上" 2020年的春节是如此不同寻常.伴随新冠肺炎疫情的爆发,全国范围内的线上.线下消费"冰火两 ...
- IPv6地址的无状态自动配置
首先我们看看IPv4是如何动态配置的IP地址的,在IPv4中,动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)实现了主机IP地址及其相关配置的自动设 ...
最新文章
- 【Socket】linux广播技术
- 天使投资乱象频出 熟人元素何时剔除
- vue可视化拖拽生成工具_vdesjs: 基于vue的可视化拖拽,代码生成工具。提升前端开发效率,或者集成至项目作为在线拖拽工具。(持续迭代升级中)...
- Python数值类型:小数与百分数的转换
- vant自定义二级菜单
- php ayui表格,layui表格使用
- oracle的文件后缀名,转:数据文件的扩展名是ora,dbf,dat的,有什么区别?
- ChatForFun 公众号使用说明
- python缺少标准库_干货分享:Python如何自动导入缺失的库
- “百变”Redis带你见识不同场景下的产品技术架构
- 织梦dedecms绿色高端生活家具装饰公司网站模板
- java冒泡法程序,Java基础之冒泡法的实现
- Java-重定向输出流实现程序日志
- 推挽输出和开漏输出_平台/输入amp;输出
- 保护公民信息安全 中国在行动
- parallelstudio license 位置_UAV位置测量仪器Apogee-D Dual GPS INS
- 常用的linux巡检命令,linux常用巡检命令
- 19款资源整合类网站推荐:每一个网站都堪称以一敌百
- dp算法求解矩阵连乘的问题
- ES集群状态检查报错:master_not_discovered_exception 503错误
热门文章
- LA 4328 Priest John's Busiest Day (Greedy)
- WPF的自定义控件 依赖属性,DependencyProperty 路由事件RoutedEvent
- “许巍日”新歌提前曝光 《爱如少年》10/15温暖登场!
- 悟透JavaScript(美绘本)
- SL专题2:加入并熟悉Second Life世界
- 【Spring学习】spring注解自动注入bean
- 管理之善,在于让员工有机会试错
- 潮美之夜见证“夜拍王”诞生,荣耀10 GT照亮三里屯
- 《大咖讲Wireshark网络分析》目录—导读
- Oracle的奇葩设置之非归档模式与RMAN备份