问答 / 0 / 9 / 创建于 4年前 / 更新于 4年前
需求是对所有api的相关id加密,
当前想到的是在模型设置访问器加密,效果完美,但是发现laravel-admin [id] 加密以后无法正常使用了,后又想到在api资源进行加密处理,但又发现如果关联查询,关联的数据的id无法加密,纠结!不知道大家有相关处理经验可以分享吗?
前几天刚搬运的,看看是不是你需要的 翻译:在 Laravel 7 中使用 UUID
使用uuid,然后在输出的时候隐藏id 你看user模型隐藏密码,手机码字不方便
004. 哈希数据 ID —— vinkla/hashids
这个是不是你需要的
方案如下(伪代码理解即可):
$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); }
这样既能保证该机密的加密,需要查询的照样查询,互不影响
我以前也遇到这个问题,最终我把数据库的id改成uuid
我没搞懂问题是在哪里, 既然是只有API的加密,那就是输出层的问题,和laravel-admin 或者是关联模型等有啥子关系?这东西就和 dingo/api 的 transform 配合laravel model 的 访问器(getXXXAttribute)不就解决了吗?
laravel-admin
关联模型
dingo/api
transform
访问器
@heimiao 我品啥啊,增加访问器和laravel-admin一点关系都没有,laravel-admin 中根本就不会用到添加的这个访问器,比如 我本来user_id 是1 ,我增加一个访问器,hash_user_id , api接口返回的时候[‘user_id’=>$model->hash_user_id] laravel-admin 中会用到user_id, hash_user_id 在laravel-admin 中根本用不到。
我比较钟情模型访问器,对于api太方便了,就是对laravel-admin影响很耿直!我也尝试实现动态访问器,但解决起来也很棘手,一对多依然是灾难,而且想动态隐藏字段对于一对多也没找到办法,关联模型毕竟不能把关联的键隐藏了。我甚至也想过要不api单独用一套模型,爱咋折腾咋折腾,但不知道这种形式是否合理
加一个scope 默认加上 这个scope 在 laravel-admin 中使用的时候, 不使用这个 scope
在我看来评论中已经有答案了,但是你并没有理解我直接给你写伪代码:
用户模型User:
User
class User { /** * 这里表示有哪些属性(或者表里有哪些字段) */ attribute id attribute name attribute mobile /** * 这个会在模型中增加一个 hash_id 的属性,用来代替加密后的用户编号 */ public function getHashIdAttribute(){ return Hashids::encode($this->id); } }
订单模型Order:
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 这个属性,为啥会报错呢?
hash_id
楼上@pan_zoe兄弟的代码想通过模型来隐藏掉真实id,但他没考虑laravel-admin怎么办,你的办法解决来laravel-admin可以用真实的id进行业务处理,同时解决api隐藏真实id,有个更好办法用api资源自动处理,但当我尝试一对多关联的时候,我发现已经无法处理关联的数据的id,不单单是数据表自增的id还有表字段内的id,如果我要处理这些数据只能单独进行遍历处理,无法做到自动处理。如果在模型动手,必然影响laravel-admin的使用,毕竟模型都是同一个
我也面临这个问题。应该是要通过行的自定义属性,自定义操作按钮,默认的将会失效,这样就是太麻烦了,每个模型都要修改
我要举报该,理由是:
前几天刚搬运的,看看是不是你需要的 翻译:在 Laravel 7 中使用 UUID
使用uuid,然后在输出的时候隐藏id 你看user模型隐藏密码,手机码字不方便
004. 哈希数据 ID —— vinkla/hashids
这个是不是你需要的
方案如下(伪代码理解即可):
这样既能保证该机密的加密,需要查询的照样查询,互不影响
我以前也遇到这个问题,最终我把数据库的id改成uuid
我没搞懂问题是在哪里, 既然是只有API的加密,那就是输出层的问题,和
laravel-admin
或者是关联模型
等有啥子关系?这东西就和dingo/api
的transform
配合laravel model 的访问器
(getXXXAttribute)不就解决了吗?加一个scope 默认加上 这个scope 在 laravel-admin 中使用的时候, 不使用这个 scope
在我看来评论中已经有答案了,但是你并没有理解我直接给你写伪代码:
用户模型
User
:订单模型
Order
:API Controller :
这样你返回的数据中 id 就是加密过的,但是这个和你关联模型没有任何关系,laravel-admin 中根本就不会用到
hash_id
这个属性,为啥会报错呢?我也面临这个问题。应该是要通过行的自定义属性,自定义操作按钮,默认的将会失效,这样就是太麻烦了,每个模型都要修改