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

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

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

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9
Marrigan

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

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

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

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

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

这个是不是你需要的

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

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

$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);
}

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

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

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

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

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

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

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

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

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

用户模型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 这个属性,为啥会报错呢?

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

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

4年前 评论

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