技术圈开发者交流群:

PHP-Casbin 在分布式服务中利用 Watcher 做策略同步

分布式服务,是将多个具有不同或相同功能的服务分散在不同的服务器上,对外提供服务。

那么在分布式服务中,使用 PHP-Casbin 作为权限控制时,不同服务器上的服务的策略要保证是同步的。这里我们主要探讨常驻内存的 PHP 服务,在常驻内存的服务中,PHP-Casbin 一般是单例模式,所有的策略都会加载到内存,性能出色。

PHP-FPM 下每次都重新初始化 Enforcer 并重新加载策略,不需要做额外的策略同步。

PHP 2023年07月11日 8721

使用 PHP-Casbin 在 SaaS 应用中做多租户权限系统架构设计

多租户(multi-tenancy)是一种软件架构技术,是实现在多租户的环境下共用相同的系统或程序组件,并且保证各用户间的数据隔离,也可称作域租户

PHP-Casbin 不仅提供了全局的RBAC的权限模型,而且还支持特定域的权限模型。特定租户/域的角色意味着当用户在不同的租户/域中时,用户可以拥有不同的角色,亦拥有不同的权限策略。在大型项目中,特别是在像SaaS PaaS这种云服务中,不同的租户需要拥有独立的权限控制,这就非常有用。

这里我以一个多商户的电商平台为例,电商平台的商户就是租户,每个商户有自己的管理人员,可以分配不同的角色,定义自己的权限。这些商户间的数据在逻辑上是完全隔离的,但他们共享这个电商平台的其他资源。

多商户电商平台

商户1,用户1,属于管理员角色
      商品1

商户2,用户2,属于管理员角色
      商品2
PHP 2023年06月03日 1278

Redis 列表(List) 相关命令

列表(List),就是存放一组数据的列表,就相当于我们编程语言中所使用的数组列表顺序就是插入的顺序,可以从列表的头部插入元素,也可以从尾部插入元素。

Redis 中一个列表最多包含 2 的 32 次方 - 1 (4294967295)个元素。

LPUSH 命令是向列表中插入一个或多个元素,是列表的头部插入。列表如果不存在则会自动创建。

工具 2023年04月01日 763

主流编程语言的包管理工具

术业有专攻,闻道有先后。班门弄斧,请指教。

编程语言五花八门,在历史的洪流中,不断有新的编程语言、新的工具诞生。有的老牌语言依然是中流砥柱,有的新生代语言突飞猛进,后生可畏。

一个编程语言要想发展起来,包管理工具必不可少,包的数量与质量,决定着编程语言的周边生态的好坏。

工具 2023年03月09日 1180

Go语言中实现RSA加解密、签名验证算法

随着互联网的高速发展,人们对安全的要求也越来越高。密码学中两大经典算法,一个是对称加解密,另一个是非对称加解密,这里就来分享一下非对称加密算法的代表:RSA加解密。

在Go语言中实现RSA加解密还是比较简单的,网上很多教程都是基于Go原生标准库写的,代码量较多。这里分享一个好用的库:https://github.com/forgoer/openssl

go get https://github.com/forgoer/openssl

秘钥可以生成在文件里,也是生成到Buffer里,只要实现了io.Writer即可。

GoLang 2022年12月09日 577

工作中常用的git命令

今天又加班了,趁睡前10分钟,抽空记录一下git常用命令。

git是程序开发人员必不可少的工具,前一天在v站看到有人吐槽几年经验的前端不会git

其实也没什么,只是一个工具而已,可能人家之前的工作并不需要git罢了。对于一般开发者而言,掌握几个基本的git命令就够用了。

版本控制?顾名思义就是用来版本控制的。看到这个解释,是不是觉得听君一席话听君一席话

工具 2022年11月22日 932

如何在Ubuntu上安装快速安装PHP?

快速安装,到底有多快?

这里以目前最新的PHP8.2为例,我的电脑尝试了一些10分钟之内搞定,如果网络好可能更快。

PPA个人软件包存档(Personal Package Archive)是一项服务,允许用户上传使用Launchpad构建和发布的Ubuntu源软件包作为apt信息库。

为什么要添加PPA存储库,因为Ubuntu系统带的镜像库中PHP的版本太旧,没有最新的PHP版本。

PHP 2022年11月02日 866

Go语言中实现HmacSHA256加密算法

HmacSHA256加密算法比较常用的加密算法之一,它比MD5更加安全。HmacSHA256也是微信支付推荐的加密方式。

在Go语言中实现HmacSHA256还是比较简单的,虽然没有PHPhash_hmac一个函数搞定的方式简单,但比起Java中的实现还是简单不少。

package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/base64"
    "encoding/hex"
    "fmt"
)

// HmacSha256 计算HmacSha256
// key 是加密所使用的key
// data 是加密的内容
func HmacSha256(key string, data string) []byte {
    mac := hmac.New(sha256.New, []byte(key))
    _, _ = mac.Write([]byte(data))

    return mac.Sum(nil)
}

// HmacSha256ToHex 将加密后的二进制转16进制字符串
func HmacSha256ToHex(key string, data string) string {
    return hex.EncodeToString(HmacSha256(key, data))
}

// HmacSha256ToHex 将加密后的二进制转Base64字符串
func HmacSha256ToBase64(key string, data string) string {
    return base64.URLEncoding.EncodeToString(HmacSha256(key, data))
}

func main() {
    // secret 是加密要使用的key
    // apple 是要加密的内容
    fmt.Printf("HmacSha256转16字符串: %s\n", HmacSha256ToHex("secret", "apple"))
    fmt.Printf("HmacSha256转base字符串: %s\n", HmacSha256ToBase64("secret", "apple"))
}
GoLang 2022年10月09日 1126

npm直接从git(github/gitlab)仓库安装

npm是前端开发常用的包管理工具。

如果需要依赖第三方包时,直接使用npm安装npm仓库中的包,但在日常工作和学习中,如果没有将开发好的包发布到npm仓库怎么办呢?

Node.js 2022年09月10日 2188

Go语言切片删除指定元素

Go语言中并没有提供内置函数来删除切片,熟悉Java/PHP的都知道,在Java/PHP中都提供对list或数组的filter操作,那么在Go语言中就需要多用几行代码来实现删除切片中的指定元素了。

假设有个1~9的数组,要删除掉其中的偶数,那么这里先进行for循环,依次判断元素是否为偶数,然后将偶数的元素通过索引截取掉,下标i向左移动一位。

    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    for i := 0; i < len(numbers); i++ {
        if numbers[i]%2 == 0 { // 如果是偶数就删除
            // 通过截取删除
            numbers = append(numbers[:i], numbers[i+1:]...)
            i--
        }
    }
    fmt.Println(numbers) // [1 3 5 7 9]

同样是1~9的数组,通过遍历,将不需要删除的元素依次在原来的数组上覆盖原有元素。最后只截取前面j个有效元素即可。

GoLang 2022年09月05日 1229

Go语言中的切片

切片,是一组可变长度的、同类元素的集合

与数组相比切片的长度是不固定的。切片可以追加元素,在追加元素时可能使切片的容量增大。

GoLang 2022年08月29日 525
鄂ICP备19028750号-1 @copyright 2024 tech1024.com