基于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); } }