基于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[0];
            String password = items[1];
            User user = userRepository.findByUsername(username);
            if(user!=null && StringUtils.equals(password,user.getPassword())){
                request.setAttribute("user",user);
            }
        }
        filterChain.doFilter(request,response);
    }
}
Filter代码

相关文章:

  • 2021-11-26
  • 2021-11-25
  • 2021-11-15
  • 2022-01-25
  • 2021-07-19
  • 2021-06-07
  • 2021-11-21
  • 2022-02-09
猜你喜欢
  • 2021-06-09
  • 2021-06-11
  • 2022-02-25
  • 2021-06-06
  • 2021-09-07
  • 2021-10-13
  • 2021-10-10
相关资源
相似解决方案