grafana使用JWT

grafana使用JWT

项目背景:

由于grafana的dashboard界面需要内嵌到自己的项目iframe中,而iframe又不能携带请求头这些进行登录访问,如果设置匿名登录就会造成无需密码就可以查看,对甲方来说这是一个严重漏洞,我就查阅了官方文档得出可以使用jwt进行url拼接token进行访问,由于官方文档具体流程不是很清晰,只讲述了配置,所以我这里记录一次从头到尾的实现jwt登录的操作。
我的版本:grafana version 10.2.2
这里附上官方文档地址:https://grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-authentication/jwt/

操作流程

  1. 生成私钥

    openssl genrsa -out private.pem 2048
    
  2. 根据私钥生成公钥

    openssl rsa -in private.pem -pubout -out public.pem
    
  3. 编写python代码,环境要有pyjwt,python3(python应该也可以,未尝试过)

    pip install pyjwt
    vim jwtTest.py
    
    import jwt
    import datetime
     
    # 读取私钥和公钥
    with open('/Users/zhb/Documents/private.pem', 'r') as f:
        private_key = f.read()
     
    with open('/Users/zhb/Documents/public.pem', 'r') as f:
        public_key = f.read()
     
    # 需要传递的信息
    payload = {
        'iss': 'zhb',  # 签发者
        'iat': int(datetime.datetime.now().timestamp()),  # 签发时间
        'exp': int(datetime.datetime.now().timestamp()) + 3600,  # 过期时间(一小时,可根据需求修改)
        'sub': 'views'# 即用户名,注意不能写默认用户名admin
    }
     
    # 使用私钥生成JWT
    token = jwt.encode(payload, private_key, algorithm='RS256')
    print('Generated Token:', token)
     
    # 使用公钥验证JWT
    try:
        decoded = jwt.decode(token, public_key, algorithms=['RS256'])
        print('Decoded Token:', decoded)
    except jwt.ExpiredSignatureError:
        print('Token is expired')
    except jwt.InvalidTokenError as e:
        print('Token is invalid:', str(e))
    
  4. 运行代码

    cd /usr/local/bin/ #python3执行程序安装完后一般在这个目录下
    
    python3 /Users/xxx/Documents/jwtTest.py  #运行该命令
     
     #返回内容如下
     Generated Token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGIiLCJpYXQiOjE3MTEzNjA3MDUsImV4cCI6MTcxMTM5NjcwNSwic3ViIjoiYWRtaW4ifQ.MxpMQXRosMDOgTN5-KbIMbv-NlTv_ZPk-FPJ_WlQc5-Hz1nIXxhfSltLvf4O64BJBJ39vECzqtWRZE9EhqD6i9EOnQH7nA0ewxM8NTm3GUidBNU40DpLVDVQlyWw--GYLtf7Z0qjrDKFZFniQ3zx3aefWh-AAshN1PI9X7lBSugX8kQH0gNRvCuxgXtCacB3eczI_mQG3uBynCsCT8MAV096j-QpOxJZcPi-4gQC-kyv9wVWWo_ulyaHWTUPDcLZ_2iGFxsqTTErYYKI-r7sfnUUOJo7CUqRGpHJMA5hsu8XhJ_n6YmVeGGhD_0KdmamAyRJyVef2jmsALSoquNNlg
    Decoded Token: {'iss': 'zhb', 'iat': 1711360705, 'exp': 1711396705, 'sub': 'views'}
    ##我们只需要token的内容:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGIiLCJpYXQiOjE3MTEzNjA3MDUsImV4cCI6MTcxMTM5NjcwNSwic3ViIjoiYWRtaW4ifQ.MxpMQXRosMDOgTN5-KbIMbv-NlTv_ZPk-FPJ_WlQc5-Hz1nIXxhfSltLvf4O64BJBJ39vECzqtWRZE9EhqD6i9EOnQH7nA0ewxM8NTm3GUidBNU40DpLVDVQlyWw--GYLtf7Z0qjrDKFZFniQ3zx3aefWh-AAshN1PI9X7lBSugX8kQH0gNRvCuxgXtCacB3eczI_mQG3uBynCsCT8MAV096j-QpOxJZcPi-4gQC-kyv9wVWWo_ulyaHWTUPDcLZ_2iGFxsqTTErYYKI-r7sfnUUOJo7CUqRGpHJMA5hsu8XhJ_n6YmVeGGhD_0KdmamAyRJyVef2jmsALSoquNNlg
    
  5. 修改grafana的配置文件

    [auth.anonymous]
    # 这个是匿名登录的配置,true代表允许,因为项目需求不允许匿名登录,所以这里不去修改了
    ;enabled = false
    [users]
    # disable user signup / registration 这里要修改成true,使允许注册账号
    allow_sign_up = true
    #################################### Auth JWT ##########################
    [auth.jwt]
    enabled = true
    header_name = X-JWT-Assertion
    #代表使用请求体中的sub的值来当做用户名
    email_claim = sub
    ;username_claim = sub
    ;jwk_set_url = https://foo.bar/.well-known/jwks.json
    ;jwk_set_file = /path/to/jwks.json
    ;cache_ttl = 60m
    ;expect_claims = {"aud": ["foo", "bar"]}
    #需要把公钥的文件配置进去
    key_file = /path/to/key/public.pem
    # Use in conjunction with key_file in case the JWT token's header specifies a key ID in "kid" field
    ;key_id = kid
    ;role_attribute_path =
    ;role_attribute_strict = false
    #这个为true代表用户名自动匹配,为匹配到就去注册
    auto_sign_up = true
    #这个指标代表运行url中带token,不然这个token还是得写在请求头中
    url_login = true
    ;allow_assign_grafana_admin = false
    
  6. 配置好后重新启动即可通过url进行访问

    http://10.8.0.22:3000/d/fe1b2ab1-05f7-472b-86d0-123/linuxe4b8bb-e69cba-e79b91-e68ea7?orgId=1&auth_token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGIiLCJpYXQiOjE3MTEzNjA3MDUsImV4cCI6MTcxMTM5NjcwNSwic3ViIjoiYWRtaW4ifQ.MxpMQXRosMDOgTN5-KbIMbv-NlTv_ZPk-FPJ_WlQc5-Hz1nIXxhfSltLvf4O64BJBJ39vECzqtWRZE9EhqD6i9EOnQH7nA0ewxM8NTm3GUidBNU40DpLVDVQlyWw--GYLtf7Z0qjrDKFZFniQ3zx3aefWh-AAshN1PI9X7lBSugX8kQH0gNRvCuxgXtCacB3eczI_mQG3uBynCsCT8MAV096j-QpOxJZcPi-4gQC-kyv9wVWWo_ulyaHWTUPDcLZ_2iGFxsqTTErYYKI-r7sfnUUOJo7CUqRGpHJMA5hsu8XhJ_n6YmVeGGhD_0KdmamAyRJyVef2jmsALSoquNNlg
    
  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Spring Boot 和 Vue.js 都是非常流行的技术栈,用于构建现代化的 Web 应用程序。下面是一些有关 Spring Boot + Vue.js 项目的架构设计的建议: 1. 前后端分离架构:Spring Boot 作为后端 API 服务,Vue.js 作为前端 UI 层。前后端分离可以使得前后端开发团队可以独立地开发和测试,提高协作效率。 2. RESTful API 设计:Spring Boot 作为后端 API 服务,应该遵循 RESTful API 设计原则。RESTful API 应该清晰、简单、易于维护和扩展,并且应该使用标准 HTTP 方法和状态码。 3. 数据库访问:Spring Boot 可以轻松地集成各种数据库,如 MySQL、PostgreSQL 和 MongoDB 等。使用 JPA 或者 Mybatis 等持久化框架来进行数据访问。 4. 安全认证:Spring Security 可以帮助你实现安全认证和授权,以保护你的应用程序免受攻击。可以使用 JWT 令牌来进行身份认证和授权。 5. 前端 UI 库:Vue.js 有许多优秀的 UI 库,如 Element UI、Ant Design Vue、Vuetify 等,可以帮助你快速地构建美观、易用的前端 UI。 6. 构建工具:使用 Webpack、Gradle 或者 Maven 等构建工具来构建和打包应用程序。可以使用 Vue CLI 来构建 Vue.js 应用程序。 7. 部署环境:可以使用 Docker 容器来部署应用程序,以便在不同的环境中运行。可以使用 Kubernetes 或者 Docker Compose 等容器编排工具来管理容器。也可以使用云服务提供商如 AWS、Azure 或者 Google Cloud 等来进行部署。 8. 日志和监控:使用 Spring Boot Actuator 来监控应用程序的运行状态和性能。可以使用 Logback 或者 Log4j2 等日志框架来记录日志。可以使用 Prometheus 和 Grafana 等工具来监控应用程序的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想吃饼干吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值