Spring Cloud微服务安全实战_3-4_API安全机制之认证

 认证:登录和认证是 两个概念,比如你两周、一个月,可能只登录了一次,但认证却是每次访问都要经过的步骤。

对于图中的认证不成功,也要继续处理,这个我觉得得看业务,比如管理系统,不登录就不让你访问,但对于比如电商的商品信息,不登录,也是可以访问的。

一、写一个用户注册服务

数据库user表:

User类:

单一职责原则:用户注册服务,得新建一个UserInfo类,用来接收前端传过来的注册用户信息,而最好不要使用User类直接接收。

新增方法,可以将UserInfo返回,前端可以做相应的展示。

Controller:

Service:

PostMan调用,成功。

 二、HttpBasic认证

在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。

具体做法是,将用户名、密码用:号隔开,然后base64编码,放在请求头的Authorization字段里,值是Basic  base64编码的字符串

RequestHeader

    Authorization:Basic Base64(用户名:密码)

比较简单,但是安全性不高。

下面写一个HttpBasic过滤器,做认证

package com.nb.security.filter;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.nb.security.entity.User;
import com.nb.security.service.IUserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
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;

/**
 * 处理httpbasic认证过滤器
 * httpbasic:请求头,即Authorization:Basic 加密字符串
 * 加密字符串为Base64编码的用户名:密码字符串
 * Authorization  Basic bGh5OmxoeWFwcA==
 * 在SpringBoot里,任何实现了Filter接口的类,SpringBoot会自动把它加到web应用的过滤器链里,只要声名为Component就行了
 */
//@Order(2)
@Component
public class BasicAuthorizationFilter extends OncePerRequestFilter {//确保在一次请求只通过一次filter,并不是所有的container都像我们期望的只过滤一次,servlet版本不同,表现也不同

    @Autowired
    private IUserService userService;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        System.err.println("++++认证++++");
        String authHeader = request.getHeader("Authorization");
        if (StringUtils.isNotBlank(authHeader)) {
            String token64 = StringUtils.substringAfter(authHeader, "Basic ");
            String token = new String(Base64Utils.decodeFromString(token64));//base64解码
            String[] items = StringUtils.splitByWholeSeparatorPreserveAllTokens(token, ":");//分隔用户名和密码
            String username = items[0];
            String password = items[1];
            User user = userService.getOne(new QueryWrapper<User>().eq("username", username));
            if (user != null && StringUtils.equals(user.getPassword(), password)) {
                //将用户信息放到request
                request.setAttribute("user", user);
            }
        }

        //继续执行其他过滤器
        filterChain.doFilter(request, response);
    }
}

Controller:

Postman访问,在请求头输入数据库已存在的username、password:

错误的访问

httpbasic至此完成,问题:不能每个请求都带上用户名密码吧?

+++++++++++++++++++++++++++++分割线++++++++++++++++++++++++++++++

小结

本篇说了 httpbasic过滤器进行HTTPBasic认证

代码:https://github.com/lhy1234/springcloud-security/tree/master/nb-user-api

原文地址:https://www.cnblogs.com/lihaoyang/p/11967121.html

时间: 2024-08-30 17:35:50

Spring Cloud微服务安全实战_3-4_API安全机制之认证的相关文章

Spring Cloud微服务框架 实战企业级优惠券系统

第1章 课程介绍[终于等到你,快来认识我]本章中将对课程中涉及到的技术.工具.业务等进行简单介绍. 第2章 准备工作[工欲善其事,必先利其器]本章中将对课程中使用到的技术工具做介绍,包括Maven.MySQL.Redis.Kafka:会对它们的功能.安装.基本的使用方法进行介绍. 第3章 SpringBoot 开发框架[基础打不牢,学问攀不高]课程主体业务使用SpringCloud框架开发实现,但是SpringCloud基于SpringBoot实现.为便于更顺畅学习,本章中会对SpringBoo

Spring cloud微服务安全实战

第1章 课程导学我们会对整个课程的内容做一个简要的介绍,包括章节的安排,使用的主要技术栈,实战案例的介绍以及前置知识的介绍等内容. 第2章 环境搭建开发工具的介绍及安装,介绍项目代码结构并搭建,基本的依赖和参数设置. 第3章 API安全我们从简单的API场景入手,讲述API安全相关的知识.首先我们会介绍要保证一个API安全都需要考虑哪些问题,然后我们针对这些问题介绍常见的安全机制,我们会针对每种问题和安全机制编写相应的代码,让大家对这些问题和安全机制有一个初步的认识.... 第4章 微服务网关安

Spring cloud微服务安全实战完整教程

本文配套视频教程及资料获取:点击这里 Spring Cloud微服务安全实战 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务场景,解决上述三大问题痛点,并结合实际给出相应解决方案.帮助大家形成对安全问题的系统性思考,实战开发一套可在中小公司落地的完整的安全方案. 学习目标: 技术要点: 环境参数: 本文配套视频教程及资料获取:点击这里 原文地址:https://www.c

spring cloud微服务架构b2b2c电子商务-Eureka保护机制

首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的,没有ZK中角色的概念, 即使N-1个节点挂掉也不会影响其他节点的正常运行.了解springcloud架构可以加求求:三五三六二四七二五九 默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例.但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机

Spring Cloud微服务安全实战_4-5_搭建OAuth2资源服务器

上一篇搭建了一个OAuth2认证服务器,可以生成token,这篇来改造下之前的订单微服务,使其能够认这个token令牌. 本篇针对订单服务要做三件事: 1,要让他知道自己是资源服务器,他知道这件事后,才会在前边加一个过滤器去验令牌(配置@EnableResourceServer 配置类) 2,要让他知道自己是什么资源服务器(配置资源服务器ID) 3,配置去哪里验令牌,怎么验令牌,要带什么信息去验 (配置@EnableWebSecurity 配置TokenServices,配置Authentica

Spring cloud微服务安全实战-4-7重构代码以适应真实环境

现在有了认证服务器,也配置了资源服务器.也根据OAuth协议,基于令牌认证的授权也跑通了.基本的概念也有了简单的理解. 往下深入之前,有几个点,还需要说一下 使用scopes来控制权限,scopes可以理解为之前的ACL 第三章的时候自己写的ACL来控制的读写权限.在OAuth协议里面用scopes来实现ACL的权限控制,两方面,首先在服务器这一端,可以针对不同的应用发出去不同权限的令牌, . 比如针对oderApp可以有读权限,也可以有写的权限. 针对orderService发出去的就只有re

Spring cloud微服务安全实战-5-7实现基于session的SSO(客户端应用的Session有效期)

授权模式改造成了Authorization code完成了改造的同时也实现了SSO.微服务环境下的前后端分离的单点登陆. 把admin的服务重启.刷新页面 并没有让我去登陆,直接就进入了首页. order的API控制台 只要你在认证服务器上的session没过期.认证服务器就知道你是谁,他就不会让你输入用户名密码了.直接跳回到客户端应用. 一共有三个有效期. 退出操作 退出的时候.现在前端服务器清空session,认证服务器也需要清空session 在前端服务器退出后,再跳转到认证服务器执行退出

Spring cloud微服务安全实战-6-2JWT认证之认证服务改造

首先来解决认证的问题. 1.效率低,每次认证都要去认证服务器调一次服务. 2.传递用户身份,在请求头里面, 3.服务之间传递请求头比较麻烦. jwt令牌. spring提供了工具,帮你在微服务之间传递令牌.让你不用去写额外的代码 服务器端的改造 看一下认证服务器配置的这个类.这里有个tokenStore,就是令牌的存储器.现在用的是jdbc的TokenStore,令牌是存在数据库里的 我们new  一个jwtTokenStore它 需要一个参数jwtTokenEnhancer 需要set一个ke

Spring Cloud微服务安全实战_4-10_用spring-cloud-zuul-ratelimit做限流

本篇讲网关上的限流 用开源项目spring-cloud-zuul-ratelimit 做网关上的限流 (项目github:https://github.com/marcosbarbero/) 1,在网关项目里,引入限流组件的maven依赖: 2,在网关项目yml配置里,配限流相关配置 github也有相关配置说明:https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit 限流框架限流需要存一些信息,可以存在数据库里,也可以存在red

Spring Cloud微服务安全实战_5-2_基于session的SSO

上一篇将OAuth2授权模式的password模式改造成了授权码模式,并初步实现了一个前后端分离架构下基于session的微服务的SSO.用户在客户端点击登录,会跳转到认证服务器的登录页面进行登录,登录成功后,认证服务器回调到客户端应用的callback方法,并携带了授权码,客户端拿着授权码去认证服务器换取access_token ,客户端拿到access_token后存到自己的session,就认为该用户已登录成功. 上边这个流程是一个基于session的SSO,其中有三个效期: 1,客户端应