Spring cloud微服务安全实战-3-5 API安全机制之认证(2)
基于Http协议的认证方式有很多。本节我们只讲一个最简单的HttpBasic认证。聪明就可以看出来,这是一个最基础的认证,好处是简单方便,所有的主流浏览器都支持,问题就是并不是非常安全的,但是帮我们大家理解认证这个概念是足够的。

首先要对认证信息做Base64的加密,加密之前要把这两个信息组合起来。用户名冒号密码组合成这样一个字符串。然后拿这个字符串做Base64的字符串的加密。并生成一个字符串。

把生成的串放到http请求的 请求头里面。带个前缀 Basic +空格 + 加密后的字符串。

开始写代码
先加上字符串处理的工具的引用。commons-lang3这里面有个字符串处理的工具类

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
建一个新的过滤器BaseicAuthecationFilter

继承OncePerRequestFilter

@Component声明称一个组件,这样SpringBoot会自动把他加到应用的过滤器链上。

注入UserRepository


用java.util这个包下的也可以,用Base64Utils这个也可以。

根据冒号拆分成两个字符串

创建这个根据UserName查询的方法


之前写的findByName删掉。

User findByUsername(String username);
StringUtils用的都是apache.commons.lang3这个包下的类。

package com.imooc.security.filter; import com.imooc.security.user.User;
import com.imooc.security.user.UserRepository;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Base64Utils;
import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @Component
public class BasicAuthecationFilter extends OncePerRequestFilter { @Autowired
private UserRepository userRepository; protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String authHeader = request.getHeader("Authorization");
if(StringUtils.isNotBlank(authHeader)){
String token64 = StringUtils.substringAfter(authHeader, "Basic ");
String token = new String(Base64Utils.decodeFromString(token64));//解码
//根据冒号拆分成两个字符串
String[] items = StringUtils.splitByWholeSeparatorPreserveAllTokens(token, ":");
String username = items[];
String password = items[];
User user = userRepository.findByUsername(username);
if(user!=null && StringUtils.equals(password,user.getPassword())){
request.setAttribute("user",user);
}
}
filterChain.doFilter(request,response);
}
}
Filter代码
因为我们还没有写审计等的代码,这里我们先在controller里面写代码,先看到效果。
user里面getId获取到id和当前的接口传递过来的参数id对象,如果不相等就抛出异常。

遇到的错误

出现问题的原因

修改成Long即可

继续
在User实体类里面。写一个方法,buildInfo,。把User对象转换成UserInfo对象。

public UserInfo buildInfo(){
UserInfo info=new UserInfo();
BeanUtils.copyProperties(this,info);
return info;
}
JPA提供的findById默认的返回类型是一个Optional的类型。

UserServiceImpl 。所以要先get()再调用buildInfo()

public UserInfo get(Long id) {
return userRepository.findById(id).get().buildInfo();
}
运行测试
现在在请求头里面根本没有带认证信息。这里是个get请求。查询id为1的用户信息

{
"timestamp": "2019-12-10T09:05:46.377+0000",
"status": ,
"error": "Internal Server Error",
"message": "身份认证信息异常,获取用户信息失败",
"path": "/users/1"
}
在过滤器里面,相当于这一段完全没有执行

经过过滤器会进入到controller里面。在Arttribute里面拿到的是空。所以就抛出了异常。

@GetMapping("/{id}")
public UserInfo get(@PathVariable Long id, HttpServletRequest request){
User user=(User) request.getAttribute("user");
if(user == null || !user.getId().equals(id)) {
throw new RuntimeException("身份认证信息异常,获取用户信息失败");
}
return userService.get(id);
}


发出去的完整的信息里面已经带了请求头的信息了。但是 依然报了异常

这是因为创建的用户的id是5 但是回去的用户信息id是1。所以造成了id的不匹配。

把请求的id改成5

这样用户信息成功返回

以上就是认证起作用的一个简单的例子。
postman里面的设置

结束
Spring cloud微服务安全实战-3-5 API安全机制之认证(2)的更多相关文章
- 《Spring Cloud微服务 入门 实战与进阶》
很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...
- Spring Cloud微服务安全实战_00_前言
一.前言: 一直以来对服务安全都很感兴趣,所以就学习.这是学习immoc的 jojo老师的 <Spring Cloud微服务安全实战课程>的笔记,讲的很好. 课程简介: 二.最终形成的架 ...
- Spring cloud微服务安全实战_汇总
Spring cloud微服务安全实战 https://coding.imooc.com/class/chapter/379.html#Anchor Spring Cloud微服务安全实战-1-1 课 ...
- Spring Cloud微服务安全实战_4-5_搭建OAuth2资源服务器
上一篇搭建了一个OAuth2认证服务器,可以生成token,这篇来改造下之前的订单微服务,使其能够认这个token令牌. 本篇针对订单服务要做三件事: 1,要让他知道自己是资源服务器,他知道这件事后, ...
- Spring Cloud微服务安全实战_4-3_订单微服务&价格微服务
实现一个场景: 订单微服务: POM: <?xml version="1.0" encoding="UTF-8"?> <project xml ...
- Spring cloud微服务安全实战 最新完整教程
课程资料获取链接:点击这里 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务 ...
- Spring Cloud微服务安全实战_4-4_OAuth2协议与微服务安全
接上篇文章,在这个流程中,PostMan可以代表客户端应用,订单服务是资源服务器,唯一缺少的是 认证服务器 ,下面来搭建认证服务器 项目结构: Pom.xml : DependencyManager ...
- Spring cloud微服务安全实战-6-8sentinel限流实战
阿里2018年开源的. 简单来说就是干三件事,最终的结果就是保证你的服务可用,不会崩掉.保证服务高可用. 流控 先从最简单的场景来入手. 1.引用一个依赖, 2,声明一个资源. 3.声明一个规则 注意 ...
- Spring cloud微服务安全实战-6-4权限控制改造
授权,权限的控制 令牌里的scope包含fly就有权限访问.根据Oauth的scope来做权限控制, 要让@PreAuthorize生效,就要在启动类里面写一个注解. 里面有一个属性叫做,就是在方法的 ...
- Spring cloud微服务安全实战-6-2JWT认证之认证服务改造
首先来解决认证的问题. 1.效率低,每次认证都要去认证服务器调一次服务. 2.传递用户身份,在请求头里面, 3.服务之间传递请求头比较麻烦. jwt令牌. spring提供了工具,帮你在微服务之间传递 ...
随机推荐
- HTML5 Canvas 绘制图片不显示的问题
问题: 慕名赶来,却一脚踩空,低头一看,地上一个大坑. 事情是这样的,在我看完w3c的介绍和很有说服力和教学力的demo后,本着实践出真知的思想决定上手一试,这一试不要紧~ 我按照流水线工程铺设以下几 ...
- 结构型模式(三) 装饰模式(Decorator)
一.动机(Motivate) 在房子装修的过程中,各种功能可以相互组合,来增加房子的功用.类似的,如果我们在软件系统中,要给某个类型或者对象增加功能,如果使用"继承"的方案来写代码 ...
- composer 发布一个自己的扩展包
练习写了一个扩展包,步骤参考github项目的readme.md 文件.https://github.com/codingmonkey9/test 说明:只是自己简单记录一下,没有详细写. 如何发布具 ...
- Linux 格式化磁盘
格式化磁盘: mkfs -t ext4 /dev/sdb 初始化磁盘 mkfs.ext4 /dev/sdb
- HDP 企业级大数据平台
一 前言 阅读本文前需要掌握的知识: Linux基本原理和命令 Hadoop生态系统(包括HDFS,Spark的原理和安装命令) 由于Hadoop生态系统组件众多,导致大数据平台多节点的部署,监控极其 ...
- webuploader+php如何实现分片+断点续传
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
- if后的判断条件
转自https://blog.csdn.net/lxn18392641463/article/details/78321080 先说明原因.这里不只是有代码规范的问题,还有汇编语言的问题,要知道为什么 ...
- kubernetes 1.14安装部署EFK日志收集系统
简单介绍: EFK 组合插件是k8s项目的一个日志解决方案,它包括三个组件:Elasticsearch, Fluentd, Kibana.相对于ELK这样的架构,k8s官方推行了EFK,可能Fluen ...
- 深度学习面试题14:Dropout(随机失活)
目录 卷积层的dropout 全连接层的dropout Dropout的反向传播 Dropout的反向传播举例 参考资料 在训练过程中,Dropout会让输出中的每个值以概率keep_prob变为原来 ...
- 【转】禁用chrome firefox 的 WebRTC功能防止真实IP泄漏
无论是使用VPN还是其它代理方式,很多时候我们不希望暴露自己的真实IP,且一直以来我们认为VPN是安全的,所有流量都会走VPN. 但最近暴露出一个WebRTC特性,会暴露我们的真实IP.适用浏览器:c ...