• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

SpringCloud27授权控制实现

武飞扬头像
不死鸟.亚历山大.狼崽子
帮助1

很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制(黑白名单控制)的功能。来源访问控制根据资源的请求来源(origin)判断资源访问是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

1 重要的属性

来源访问控制规则(AuthorityRule)非常简单,主要有以下配置项:

  • resource :资源名,即限流规则的作用对象。
  • limitApp :请求来源,对应的黑名单/白名单,多个用","分隔,如 appA,appB。
  • strategy :限制模式,AUTHORITY_WHITE为白名单模式,AUTHORITY_BLACK为黑名单模式,默认为白名单模式。

这里演示实现Ip地址白名单和黑名单配置规则

2 实现步骤

授权控制规则设置有两种方式

  • 本地代码设置
  • 在Sentinel控制台动态设置

3 本地代码设置

1.创建WhiteBlackController,在其中编写修改以下代码

  1.  
    package com.example.demo.controller;
  2.  
     
  3.  
    import com.alibaba.csp.sentinel.annotation.SentinelResource;
  4.  
    import com.alibaba.csp.sentinel.slots.block.BlockException;
  5.  
    import com.alibaba.csp.sentinel.slots.block.RuleConstant;
  6.  
    import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;
  7.  
    import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager;
  8.  
    import org.springframework.web.bind.annotation.GetMapping;
  9.  
    import org.springframework.web.bind.annotation.RestController;
  10.  
     
  11.  
    import javax.annotation.PostConstruct;
  12.  
    import java.util.ArrayList;
  13.  
    import java.util.List;
  14.  
     
  15.  
    @RestController
  16.  
    public class WhiteBlackController {
  17.  
    //定义限流资源和限流讲解回调函数
  18.  
    @SentinelResource(value = "Sentinel_Rule", blockHandler = "exceptionHandler")
  19.  
    @GetMapping("origin")
  20.  
    public String hello() {
  21.  
    return "Hello Sentinel!";
  22.  
    }
  23.  
    // blockHandler函数,原方法调用被限流/降级/系统保护的时候调用
  24.  
    public String exceptionHandler(BlockException ex) {
  25.  
    ex.printStackTrace();
  26.  
    return "系统繁忙,请稍候";
  27.  
    }
  28.  
    /**
  29.  
    * 白名单设置
  30.  
    *
  31.  
    * @PostConstruct :在构造函数执行完毕后执行
  32.  
    */
  33.  
    @PostConstruct
  34.  
    private static void initWhiteRules() {
  35.  
    //1.创建存放授权规则的集合
  36.  
    List<AuthorityRule> rules = new ArrayList<AuthorityRule>();
  37.  
    //2.创建授权规则
  38.  
    AuthorityRule rule = new AuthorityRule();
  39.  
    //定义资源
  40.  
    rule.setResource("Sentinel_Rule");
  41.  
    //设置授权模式 RuleConstant.AUTHORITY_WHITE :白名单
  42.  
    rule.setStrategy(RuleConstant.AUTHORITY_WHITE);
  43.  
    //设置白名单
  44.  
    rule.setLimitApp("192.168.1.3");
  45.  
    //将授权规则添加到集合中
  46.  
    rules.add(rule);
  47.  
    //3.加载授权规则
  48.  
    AuthorityRuleManager.loadRules(rules);
  49.  
    }
  50.  
    /**
  51.  
    * 黑名单设置
  52.  
    *
  53.  
    * @PostConstruct :在构造函数执行完毕后执行
  54.  
    */
  55.  
    @PostConstruct
  56.  
    private static void initBlackRules() {
  57.  
    //1.创建存放授权规则的集合
  58.  
    List<AuthorityRule> rules = new ArrayList<AuthorityRule>();
  59.  
    //2.创建授权规则
  60.  
    AuthorityRule rule = new AuthorityRule();
  61.  
    //定义资源
  62.  
    rule.setResource("Sentinel_Rule");
  63.  
    //设置授权模式 RuleConstant.AUTHORITY_BLACK :黑名单
  64.  
    rule.setStrategy(RuleConstant.AUTHORITY_BLACK);
  65.  
    //设置黑名单
  66.  
    rule.setLimitApp("127.0.0.1");
  67.  
    //将授权规则添加到集合中
  68.  
    rules.add(rule);
  69.  
    //3.加载授权规则
  70.  
    AuthorityRuleManager.loadRules(rules);
  71.  
    }
  72.  
    }

白名单和黑名单只要配置一个就可以满足需求。

2.创建SentinelConfig,设置请求来源解析

  1.  
    package com.example.demo.config;
  2.  
     
  3.  
    import com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser;
  4.  
    import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager;
  5.  
    import org.springframework.stereotype.Component;
  6.  
     
  7.  
    import javax.annotation.PostConstruct;
  8.  
    import javax.servlet.http.HttpServletRequest;
  9.  
     
  10.  
    @Component
  11.  
    public class SentinelConfig {
  12.  
    @PostConstruct
  13.  
    public void init(){
  14.  
    //获取请求来源ip地址
  15.  
    WebCallbackManager.setRequestOriginParser(new RequestOriginParser() {
  16.  
    @Override
  17.  
    public String parseOrigin(HttpServletRequest httpServletRequest) {
  18.  
    return httpServletRequest.getRemoteAddr();
  19.  
    }
  20.  
    });
  21.  
    }
  22.  
    }

3.运行测试

通过浏览器输入http://192.168.1.3:8080/origin进行访问,则显示”Hello Sentinel”;当浏览器输入http://127.0.0.1:8080/origin,则显示”系统繁忙,请稍候”,这说明授权控制规则设置成功。

4 在Sentinel控制台动态设置

将WhiteBlackController中的代码设置授权控制规则删除,重启项目,在Sentinel控制台动态设置授权控制规则。

在Sentinel控制台的左侧菜单中选择“授权规则”,点击“新增授权规则”按钮,增加白名单或者黑名单。只用设置一个即可,设置白名单,则白名单以外的皆为黑名单,设置黑名单,则黑名单以外的都是白名单。

白名单如下:

学新通

黑名单如下:

学新通

学新通

 之后,通过浏览器输入http://192.168.1.3:8080/origin进行访问,则显示”Hello Sentinel”;当浏览器输入http://127.0.0.1:8080/origin,则显示”系统繁忙,请稍候”,这说明授权控制规

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgaagfb
系列文章
更多 icon
同类精品
更多 icon
继续加载