日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

不使用三方包时,如何在ThinkSNS中建立优雅的用户权限管理

發(fā)布時(shí)間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不使用三方包时,如何在ThinkSNS中建立优雅的用户权限管理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文主要全面講解在不適用第三方包的情況下,如何在基于Laravel框架上,研發(fā)社交系統(tǒng)ThinkSNS+時(shí),簡歷一套優(yōu)雅而不失性價(jià)比的用戶權(quán)限管理體系功能,【內(nèi)含ThinkSNS真實(shí)代碼】。

需求場景

就是用戶組+權(quán)限節(jié)點(diǎn),這個需求 laravel 有很多很好的第三方包實(shí)現(xiàn)。下面描述代碼不參與緩存機(jī)制純數(shù)據(jù)庫查詢,給大家提供一個思路。

下面的代碼都是來自于ThinkSNS+,是基于 Laravel 全新開發(fā)的 ThinkSNS 社交開源項(xiàng)目,遵循 Apache-2.0 開源協(xié)議。歡迎 Star 哦。

數(shù)據(jù)表設(shè)計(jì)

其實(shí)這一塊我個人是參考的 Zizaco/entrust 因?yàn)槲矣X得,大多數(shù)情況下,我們要用的角色和權(quán)限節(jié)點(diǎn)都是真多用戶的。數(shù)據(jù)表設(shè)計(jì)如下:

可以看到關(guān)系如下 user -> role -> ability ,其中關(guān)系全部都是多對多關(guān)系。一個用戶可以擁有多個 role,一個 ability 可以被分配給多個 role 。

鏈?zhǔn)椒椒ㄔO(shè)計(jì)

$user->ability('create user'); // 判斷是否有 create user 權(quán)限。
$user->ability('owner', 'delete user'); // 判斷用戶是否擁有 owner 用戶組,且是否這個組擁有 delete user 權(quán)限。
$user->ability(); // 返回一個 Ability 實(shí)例。
$user->roles; // 讀取用戶所擁有的所有用戶組。
$user->roles(); // 獲取 Builder 實(shí)例。
$user->roles('owner'); // 檢查用戶是否擁有 owner 用戶組,擁有返回 model 實(shí)例,否則返回 false。
$user->ability()->roles(); // 讀取用戶所擁有的所有用戶組。返回的是一個 集合。可用集合所有方法。
$user->ability()->roles('owner'); // 檢查用戶是否擁有 owner 用戶組,擁有返回 model 實(shí)例,否則返回 false。
$user->ability()->all(); // 返回用戶擁有的所有權(quán)限集合。
$user->ability()->all('create user'); // 檢查用戶是否擁有 create user 權(quán)限,沒有返回 false ,有返回 ability 實(shí)例。
其中調(diào)用 $user->ability()->all() 和 $user->ability()->all() 都是返回的 集合 可以鏈?zhǔn)秸{(diào)用集合下的所有方法進(jìn)一步操作。

ability 用戶 Trait

<?php

namespace ZhiyiPlusModelsConcerns;

use ZhiyiPlusModelsRole;
use ZhiyiPlusServicesUserAbility;

trait UserHasAbility
{

/*** Abiliry service instance.** @var \Zhiyi\Plus\Services\UserAbility*/ protected $ability;/*** User ability.** @param array $parameters* ability();* ability($ability);* ability($role, $ability);* @return mixed* @author Seven Du <shiweidu@outlook.com>*/ public function ability(...$parameters) {if (isset($parameters[1])) {return ($role = $this->resolveAbility()->roels($parameters[0]))? $role->ability($parameters[1]): false;} elseif (isset($parameters[0])) {return $this->resolveAbility()->all($parameters[0]);}return $this->resolveAbility(); }/*** The user all roles.** @param string $role* @return mied* @author Seven Du <shiweidu@outlook.com>*/ public function roles(string $role = '') {if ($role) {return $this->ability()->roles($role);}return $this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id'); }/*** Resolve ability service.** @return \Zhiyi\Plus\Services\UserAbility* @author Seven Du <shiweidu@outlook.com>*/ protected function resolveAbility() {if (! ($this->ability instanceof UserAbility)) {$this->ability = new UserAbility();}return $this->ability->setUser($this); }

}
Ability 實(shí)例

<?php
namespace ZhiyiPlusServices;
use IlluminateSupportCollection;
use ZhiyiPlusModelsUser as UserModel;
use ZhiyiPlusContractsModelUserAbility as UserAbilityContract;

class UserAbility implements UserAbilityContract
{

protected $user;/*** Get all roles or get first role.** @param string $role* @return mixed* @author Seven Du <shiweidu@outlook.com>*/ public function roles(string $role = '') {$roles = $this->user()->roles()->get()->keyBy('name');if (! $role) {return $roles;}return $roles->get($role, false); } /*** Get all abilities or get first ability.** @param string $ability* @return mixed* @author Seven Du <shiweidu@outlook.com>*/ public function all(string $ability = '') {$roles = $this->roles();$roles->load('abilities');$abilities = $roles->reduce(function ($collect, $role) {return $collect->merge($role->abilities->keyBy('name'));}, new Collection());if (! $ability) {return $abilities;}return $abilities->get($ability, false); } /*** Get user instance.** @return \Zhiyi\Plus\Models\User* @author Seven Du <shiweidu@outlook.com>*/ public function user(): UserModel {return $this->user; } /*** Set user model.** @param \Zhiyi\Plus\Models\User $user* @author Seven Du <shiweidu@outlook.com>*/ public function setUser(UserModel $user) {$this->user = $user;return $this; }

}
Role 模型所需代碼

<?php
namespace ZhiyiPlusModels;
use IlluminateDatabaseEloquentModel;

class Role extends Model
{

/*** Get all abilities of the role.** @return \Illuminate\Database\Eloquent\Relations\BelongsToMany* @author Seven Du <shiweidu@outlook.com>*/ public function abilities() {return $this->belongsToMany(Ability::class, 'ability_role', 'role_id', 'ability_id'); } /*** Get or check The role ability.** @param string $ability* @return false|\User\Plus\Models\Ability* @author Seven Du <shiweidu@outlook.com>*/ public function ability(string $ability) {return $this->abilities->keyBy('name')->get($ability, false); }

}
使用

然后我們打開 User 模型wen jia文件添加如下代碼:

class User ...
{

use UserHasAbility;

}
總結(jié)

其實(shí)性狀在 User 模型中只暴露了 roles 和 ability 兩個公開方法。但是已經(jīng)足以勝任用戶組權(quán)限判斷邏輯了。

整個 ability 都是結(jié)合在集合之上的一些封裝,這樣是的代碼調(diào)用更加優(yōu)雅。

以上代碼是在開發(fā)ThinkSNS+中的實(shí)際真實(shí)代碼。具體的實(shí)現(xiàn)可參考項(xiàng)目。

以上代碼都來自于ThinkSNS Plus,看完整的開發(fā)代碼可以看倉庫:

GitHub: https://github.com/slimkit/thinksns-plus
(開源不易,求 Star )

ThinkSNS產(chǎn)品免費(fèi)體驗(yàn):http://www.thinksns.com/experience.html

總結(jié)

以上是生活随笔為你收集整理的不使用三方包时,如何在ThinkSNS中建立优雅的用户权限管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。