基于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里面的设置

结束

最新文章

  1. iOS SpriteKit 问题
  2. jQuery-1.9.1源码分析系列(十一) DOM操作续——克隆节点
  3. 怎样用ZBrush对模型进行渲染(二)
  4. Linux:文件解压与压缩
  5. js库中$冲突的解决方法
  6. 函数buf_page_hash_get_low
  7. Junit4学习笔记
  8. SQL中ISNULL的使用
  9. ubuntu 下搭建一个python3的虚拟环境(用于django配合postgresql数据库开发)
  10. 《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅳ
  11. 根据父节点parentid查询节点信息
  12. 《javascript语言精粹》读书笔记 Item2 对象
  13. mysql数据库中case when 的用法
  14. 初级安全入门——Windows操作系统的安全加固
  15. 配置Spring框架编写XML的提示
  16. 问答项目---用户注册的那些事儿(PHP验证)
  17. Ubuntu14.04下Ambari安装搭建部署大数据集群(图文分五大步详解)(博主强烈推荐)
  18. ORB-SLAM2实现(kinect V1/ROS)
  19. EPF与Myeclipse 增强代码自动智能提示
  20. 那些年我们追过的SQL

热门文章

  1. LightOJ - 1311 - Unlucky Bird(相遇问题)
  2. Tensorflow细节-P202-数据集的高层操作
  3. terminal mvn 打包
  4. Oracle 重新编译存储过程/函数等
  5. Processing玩抠图
  6. 20、Task原理剖析与源码分析
  7. 【一起来烧脑】读懂HTTP知识体系
  8. (13)打鸡儿教你Vue.js
  9. 一个有趣的js隐式转换的问题
  10. C# 坦克大战笔记(1)