Laravel 对相关 XXX_id 加密,但是导致 Laravel-admin 无法使用

需求是对所有api的相关id加密,

比如:uid,user_id,order_id等等,不是单纯user表的id,是所有涉及id的值加密,只是api给出的时候加密,数据库依然是int值

当前想到的是在模型设置访问器加密,效果完美,但是发现laravel-admin [id] 加密以后无法正常使用了,后又想到在api资源进行加密处理,但又发现如果关联查询,关联的数据的id无法加密,纠结!不知道大家有相关处理经验可以分享吗?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 9
Marrigan

前几天刚搬运的,看看是不是你需要的 翻译:在 Laravel 7 中使用 UUID

3年前 评论
臭鼬 (楼主) 3年前

使用uuid,然后在输出的时候隐藏id 你看user模型隐藏密码,手机码字不方便

3年前 评论
臭鼬 (楼主) 3年前
小学毕业生 (作者) 3年前
臭鼬 (楼主) 3年前

004. 哈希数据 ID —— vinkla/hashids

这个是不是你需要的

3年前 评论
臭鼬 (楼主) 3年前

方案如下(伪代码理解即可):

$appends = ['user_id_hash','order_id_hash'];
$hidden=['user_id','order_id'];
public function getUserIdHashAttribute()
{
      return openssl_encrypt($this->user_id);
}

public function getOrderIdHashAttribute()
{
      return openssl_encrypt($this->order_id);
}

这样既能保证该机密的加密,需要查询的照样查询,互不影响

3年前 评论
臭鼬 (楼主) 3年前
pan_zoe (作者) 3年前
臭鼬 (楼主) 3年前
pan_zoe (作者) 3年前
臭鼬 (楼主) 3年前

我以前也遇到这个问题,最终我把数据库的id改成uuid

3年前 评论
臭鼬 (楼主) 3年前
臭鼬 (楼主) 3年前
朕略显ぼうっと萌

我没搞懂问题是在哪里, 既然是只有API的加密,那就是输出层的问题,和laravel-admin 或者是关联模型等有啥子关系?这东西就和 dingo/apitransform 配合laravel model 的 访问器(getXXXAttribute)不就解决了吗?

3年前 评论
臭鼬 (楼主) 3年前
朕略显ぼうっと萌 (作者) 3年前
臭鼬 (楼主) 3年前
臭鼬 (楼主) 3年前
臭鼬 (楼主) 3年前
nfangxu

加一个scope 默认加上 这个scope 在 laravel-admin 中使用的时候, 不使用这个 scope

3年前 评论
朕略显ぼうっと萌

在我看来评论中已经有答案了,但是你并没有理解我直接给你写伪代码:

用户模型User:

class User {
      /**
       *  这里表示有哪些属性(或者表里有哪些字段)
       */
      attribute  id
      attribute  name
      attribute  mobile

     /**
      * 这个会在模型中增加一个 hash_id 的属性,用来代替加密后的用户编号
      */
     public function getHashIdAttribute(){
       return Hashids::encode($this->id);
    }
}

订单模型Order:

class Order {
    attribute  id
    attribute  order_sn
    attribute  user_id

    public function user(){
       return $this->belongsTo(User::class);
    }
}

API Controller :

public function show(){
      $user = User::find(1);

      return [
            'id'=>$user->hash_id,
            'name'=>$user->name,
      ];
}

这样你返回的数据中 id 就是加密过的,但是这个和你关联模型没有任何关系,laravel-admin 中根本就不会用到 hash_id 这个属性,为啥会报错呢?

3年前 评论
臭鼬 (楼主) 3年前
臭鼬 (楼主) 3年前

我也面临这个问题。应该是要通过行的自定义属性,自定义操作按钮,默认的将会失效,这样就是太麻烦了,每个模型都要修改

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!