权限控制,是一个系统当中必须的重要功能。张三只能访问输入张三的特定功能,李四不能访问属于赵六的特定菜单。这就要求对整个体系做一个完善的权限控制体系。该体系应该具备针区分用户、权限、角色等各种必须的功能。

本系列教程

【微服务】轻松搞定SpringCloud微服务目录

【微服务】轻松搞定SpringCloud微服务目录-独立博客

本系列为连载文章,阅读本文之前强烈建议您先阅读前面几篇。

上一节我们讲到API网关zuul ,对于Spring Cloud 来说,zuul除了可以做api接口的统一暴露,还应该具备权限控制的相关功能。

单例应用权限控制

在没有引入Spring Cloud成套体系中,对于单体springboot 所开发的应用使用springmvc自带拦截器就可以实现对路径的拦截,截取request中特定的参数进行校验,如果合法就可以访问,如果不合法便返回403。

Spring Cloud Zuul 过滤器简介

对于组件zuul中,其实带有权限认证的功能,那就是ZuulFilter过滤器。

ZuulFilter是Zuul中核心组件,通过继承该抽象类,覆写几个关键方法达到自定义调度请求的作用。

开始起飞

起飞之前,还是那句话,推荐先看前面博文。本次还是基于api网关功能的延伸,因此为了避免和前一片文章中子项目冲突,我们新建一个子项目,然后复制api-gateway-zuul项目的代码。

配置AccessTokenFilter文件

在新建的子项目下面,我们创建一个包config ,然后在下面创建AccessTokenFilter文件,清单如下:

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import javax.servlet.http.HttpServletRequest; /**
* Created by Administrator on 2017/12/21.
*/
public class AccessTokenFilter extends ZuulFilter { @Override
public String filterType() {
return "pre";//前置过滤器
} @Override
public int filterOrder() {
return 0;//优先级为0,数字越大,优先级越低
} @Override
public boolean shouldFilter() {
return true;//是否执行该过滤器,此处为true,说明需要过滤
} @Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String username = request.getParameter("token");
if (null != username && username.equals("www.hanyahong.com")) {//暂时简单化测试
ctx.setSendZuulResponse(true);// 对该请求进行路由
ctx.setResponseStatusCode(200);
ctx.set("isSuccess", true);// 设值,可以在多个过滤器时使用
return null;
} else {
ctx.setSendZuulResponse(false);// 过滤该请求,不对其进行路由
ctx.setResponseStatusCode(403);// 返回错误码
ctx.setResponseBody("{\"result\":\"Request illegal!the token is null\"}");// 返回错误内容
ctx.set("isSuccess", false);
return null;
}
}
}

说明:

filterOrder: filter执行顺序,通过数字指定

shouldFilter: filter是否需要执行 true执行 false 不执行

run : filter具体逻辑

filterType : filter类型,分为pre、error、post、 route

> pre:请求执行之前filter

route: 处理请求,进行路由

post: 请求处理完成后执行的filter

error:出现错误时执行的filter

官网给出一个四种类型的示意图:

注入AccessToeknFilter

自行创建Filter需要手动加载到容器进行统一管理。在主方法Application.java中,可以加入以下代码:

/**
* 加载过滤器
* @return
*/
@Bean
public AccessTokenFilter accessFilter() {
return new AccessTokenFilter();
}

启动并测试

分别启动子项目 cloud-hyh-discovery-eurekacloud-hyh-service-1 以及刚刚创建的api网关的新子项目。

首先可以访问 http://localhost:8081/ 查看服务是否已经都启动完毕。

其次通过网关访问service-1服务中的/ribbon/name 接口,查看是否允许访问。http://localhost:8080/cloud-service/ribbon/name。通过访问可以看到浏览器提示:

{"result":"Request illegal!the token is null"}

最后,访问带有权限认证的url,http://localhost:8080/cloud-service/ribbon/name?token=www.hanyahong.com

可以看到浏览器可以通过验证,进入了子系统中的API,并返回了相关结果。

千万之路刚开始-www.hanyahong.com-beijing该服务器端口8071

说明

一般token会通过一系列加密处理,另外一般是放在请求头部。如果前后端分离的话就会设计跨域的问题。这个我们会在后面开一篇专门讲解跨域访问的文章细致讲解。

另外,在实际应用中还有很多需要配置的地方,绝非这般简单的配置。这个希望在实际的项目当中,你们可以自己体会。

源码

本文出处:http://www.hanyahong.com/

Github源码:https://github.com/hanyahong/spring-cloud-microservice

转发请注明出处!

【微服务】之七:轻松搞定SpringCloud微服务-API权限控制的更多相关文章

  1. 【微服务】之四:轻松搞定SpringCloud微服务-负载均衡Ribbon

    对于任何一个高可用高负载的系统来说,负载均衡是一个必不可少的名称.在大型分布式计算体系中,某个服务在单例的情况下,很难应对各种突发情况.因此,负载均衡是为了让系统在性能出现瓶颈或者其中一些出现状态下可 ...

  2. 【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign

    上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使 ...

  3. 【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul

    通过前面几篇文章的介绍,我们可以轻松搭建起来微服务体系中比较重要的几个基础构建服务.那么,在本篇博文中,我们重点讲解一下,如何将所有微服务的API同意对外暴露,这个就设计API网关的概念. 本系列教程 ...

  4. 【微服务】之二:从零开始,轻松搞定SpringCloud微服务系列--注册中心(一)

    微服务体系,有效解决项目庞大.互相依赖的问题.目前SpringCloud体系有强大的一整套针对微服务的解决方案.本文中,重点对微服务体系中的服务发现注册中心进行详细说明.本篇中的注册中心,采用Netf ...

  5. 【微服务】之三:从零开始,轻松搞定SpringCloud微服务-配置中心

    在整个微服务体系中,除了注册中心具有非常重要的意义之外,还有一个注册中心.注册中心作为管理在整个项目群的配置文件及动态参数的重要载体服务.Spring Cloud体系的子项目中,Spring Clou ...

  6. 从零开始,轻松搞定SpringCloud微服务系列

    本系列博文目录 [微服务]之一:从零开始,轻松搞定SpringCloud微服务系列–开山篇(spring boot 小demo) [微服务]之二:从零开始,轻松搞定SpringCloud微服务系列–注 ...

  7. 【微框架】之一:从零开始,轻松搞定SpringCloud微服务系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

  8. 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

  9. 带你十天轻松搞定 Go 微服务系列(二)

    上篇文章开始,我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分(本文) 用户服务 产品服务 订单服务 支付服务 RPC 服务 ...

随机推荐

  1. MVC原理图解

    注解: 视图中通过Action方法向控制器请求数据 控制器通过view()方法向视图呈现数据

  2. Python 面向对象的进阶

    类的成员 类的成员可以分为三大类 :  字段 , 方法 和  属性 注 :  所有的成员中,只有普通字段的内容保存对象中,  即 : 根据此类创建了对象,在内存就有多少个普通字段.  而其他的成员,则 ...

  3. MySQL备份还原之一mydumper

    1)源码编译安装 1.下载 mydumper源码 2.解压 [mysql@localhost ~]$ tar -xvf mydumper-0.9.1.tar mydumper-0.9.1/CMakeL ...

  4. 《转》我的ARM学习经历

    1.基础阶段     话说06年第一份工作从事的是PLC开发,用protel画原理图和PCB,写AVR单片机程序,焊焊板子,还去过华强北买器件,比较杂,但是接触面比较广,为进一步学ARM打下了基础. ...

  5. java Web jsp嵌入代码的三种方式

    1,表达式标签  <%= 2+3%> 唯一有显示功能的标签 作用: 计算表达式的返回值 将表达式的返回值显示到网页中. 注意: 表达式中不能有分号 2,普通脚本标签  <% %> ...

  6. 读excle

    1.OleDbConnection读取Excel ///<summary>///上传文件到临时目录中 ///</ummary>private void Upload(){ Ht ...

  7. PHP学习笔记之continue与break

    百度中有人这样解释:break是结束整个循环体,continue是结束单个循环体.昨天看燕十八老师PHP视频,讲到break,continue时,举了一个例子,理解更容易.天龙八部中,西夏国公主选婿, ...

  8. Flask解决跨域

    Flask解决跨域 问题:网页上(client)有一个ajax请求,Flask sever是直接返回 jsonify. 然后ajax就报错:No 'Access-Control-Allow-Origi ...

  9. Part5核心初始化_lesson4---关闭mmu

    1.ARM存储体系 2.cache 3.虚拟地址 那么谁来完成把虚拟地址转换成物理地址呢? 4.这个工作就由MMU来转换!! 5.关闭MMU和cache 他们都是通过cp15协处理器来控制的!应该在A ...

  10. eclipse——配置maven插件

    Step 1 配置installations installations:指定Maven核心程序的位置  从本地磁盘中找到本地maven的位置 Step 2 配置user settings user ...