mirror of
https://github.com/stancl/tenancy-docs.git
synced 2025-12-12 10:14:03 +00:00
wip docs page related to archtechx/tenancy/issues/760
This commit is contained in:
parent
3222b1668b
commit
dfa97b2d5b
5 changed files with 17577 additions and 25 deletions
|
|
@ -144,6 +144,7 @@ return [
|
||||||
'children' => [
|
'children' => [
|
||||||
'The two applications' => 'the-two-applications',
|
'The two applications' => 'the-two-applications',
|
||||||
'Tenants' => 'tenants',
|
'Tenants' => 'tenants',
|
||||||
|
'Encrypt Attributes' => 'encrypt-attributes',
|
||||||
'Domains' => 'domains',
|
'Domains' => 'domains',
|
||||||
'Event system' => 'event-system',
|
'Event system' => 'event-system',
|
||||||
'Routes' => 'routes',
|
'Routes' => 'routes',
|
||||||
|
|
|
||||||
17506
package-lock.json
generated
17506
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -1,2 +1,2 @@
|
||||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=2)}({2:function(e,t,n){e.exports=n("j7ye")},j7ye:function(e,t,n){"use strict";n.r(t);var r="undefined"!=typeof window,o=[],i=function(){r&&!window.splitbee||(a.track=window.splitbee.track,a.user=window.splitbee.user,a.enableCookie=window.splitbee.enableCookie,a.reset=window.splitbee.reset,o.forEach((function(e){"track"===e.type?window.splitbee.track.apply(null,e.payload):"user"===e.type?window.splitbee.user.set.apply(null,e.payload):"enableCookie"===e.type?window.splitbee.enableCookie.apply(null,e.payload):"reset"===e.type&&window.splitbee.reset()})),o=[])},l=function(e){return function(){try{for(var t=arguments.length,n=new Array(t),l=0;l<t;l++)n[l]=arguments[l];return o.push({type:e,payload:n}),r&&window.splitbee&&i(),Promise.resolve()}catch(e){return Promise.reject(e)}}},a={track:l("track"),user:{set:l("user")},init:function(e){if(r&&!window.splitbee){var t=window.document,n=null!=e&&e.scriptUrl?e.scriptUrl:"https://cdn.splitbee.io/sb.js",o=t.querySelector("script[src='"+n+"']");if(o)o.onload=i;else{var l=t.createElement("script");l.src=n,l.async=!0,e&&(e.apiUrl&&(l.dataset.api=e.apiUrl),e.token&&(l.dataset.token=e.token),e.disableCookie&&(l.dataset.noCookie="1")),l.onload=i,t.head.appendChild(l)}}},enableCookie:l("enableCookie"),reset:l("reset")},s=a;s.init({scriptUrl:"https://tenancyforlaravel.com/bee.js",apiUrl:"https://tenancyforlaravel.com/_hive"}),window.auth=function(e){e&&s.user.set({userId:e.substr(1)}).finally((function(){window.location.replace("https://github.com/tenancy-for-laravel/saas-boilerplate")}))}}});
|
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=2)}({2:function(e,t,n){e.exports=n("j7ye")},j7ye:function(e,t,n){"use strict";n.r(t);var r="undefined"!=typeof window,o=[],i=function(){r&&!window.splitbee||(l.track=window.splitbee.track,l.user=window.splitbee.user,l.enableCookie=window.splitbee.enableCookie,l.reset=window.splitbee.reset,o.forEach((function(e){"track"===e.type?window.splitbee.track.apply(null,e.payload):"user"===e.type?window.splitbee.user.set.apply(null,e.payload):"enableCookie"===e.type?window.splitbee.enableCookie.apply(null,e.payload):"reset"===e.type&&window.splitbee.reset()})),o=[])},a=function(e){return function(){try{for(var t=arguments.length,n=new Array(t),a=0;a<t;a++)n[a]=arguments[a];return o.push({type:e,payload:n}),r&&window.splitbee&&i(),Promise.resolve()}catch(e){return Promise.reject(e)}}},l={track:a("track"),user:{set:a("user")},init:function(e){if(r&&!window.splitbee){var t=window.document,n=null!=e&&e.scriptUrl?e.scriptUrl:"https://cdn.splitbee.io/sb.js",o=t.querySelector("script[src='"+n+"']");if(o)o.onload=i;else{var a=t.createElement("script");a.src=n,a.async=!0,e&&(e.apiUrl&&(a.dataset.api=e.apiUrl),e.token&&(a.dataset.token=e.token),e.disableCookie&&(a.dataset.noCookie="1")),a.onload=i,t.head.appendChild(a)}}},enableCookie:a("enableCookie"),reset:a("reset")},s=l;s.init({scriptUrl:"https://tenancyforlaravel.com/bee.js",apiUrl:"https://tenancyforlaravel.com/_hive"}),window.auth=function(e){if(!e)return window.location.replace("https://github.com/tenancy-for-laravel/saas-boilerplate");s.user.set({userId:e.substr(1)}).finally((function(){window.location.replace("https://github.com/tenancy-for-laravel/saas-boilerplate")}))}}});
|
||||||
//# sourceMappingURL=extsb.js.map
|
//# sourceMappingURL=extsb.js.map
|
||||||
File diff suppressed because one or more lines are too long
91
source/docs/v3/encrypt-attributes.blade.md
Normal file
91
source/docs/v3/encrypt-attributes.blade.md
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
---
|
||||||
|
title: Encrypt Attributes
|
||||||
|
extends: _layouts.documentation
|
||||||
|
section: content
|
||||||
|
---
|
||||||
|
|
||||||
|
# Encrypt Tenant Attributes {#encrypt}
|
||||||
|
|
||||||
|
We can encrypt the tenant attributes if needed. In the example below, We will encrypt the database username and password.
|
||||||
|
|
||||||
|
# Encrypt Tenant Username And Password {#encrypt-username-password}
|
||||||
|
|
||||||
|
When resolving the tenant's database configuration, this package is using the values in the `data` column stored as `tenancy_db_username` and `tenancy_db_password`
|
||||||
|
to create the values used in the db config as `username` and `password`, respectively. So the Tenancy package is looking in the [Virtual Column](https://github.com/archtechx/virtualcolumn) for `tenancy_db_username` and `tenancy_db_password`.
|
||||||
|
|
||||||
|
The package provides a place in the migrations for your own custom columns and a method to tell the model that it should be looking for the data in an actual database column instead of the virtual column.
|
||||||
|
|
||||||
|
This means, we can do this:
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class CreateTenantsTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::create('tenants', function (Blueprint $table) {
|
||||||
|
$table->string('id')->primary();
|
||||||
|
|
||||||
|
// Your custom columns
|
||||||
|
$table->string('tenancy_db_username', 512);
|
||||||
|
$table->string('tenancy_db_password', 512);
|
||||||
|
|
||||||
|
$table->timestamps();
|
||||||
|
$table->json('data')->nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To create the columns in the database. Then let the model know about them And combine this with [Laravel encrypted casts](https://laravel.com/docs/9.x/eloquent-mutators#encrypted-casting)
|
||||||
|
(or, better yet, a custom cast) to encrypt and decrypt these when needed:
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Stancl\Tenancy\Database\Models\Tenant as BaseTenant;
|
||||||
|
use Stancl\Tenancy\Contracts\TenantWithDatabase;
|
||||||
|
use Stancl\Tenancy\Database\Concerns\HasDatabase;
|
||||||
|
use Stancl\Tenancy\Database\Concerns\HasDomains;
|
||||||
|
|
||||||
|
class Tenant extends BaseTenant implements TenantWithDatabase
|
||||||
|
{
|
||||||
|
use HasDatabase, HasDomains;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The attributes that sould be cast.
|
||||||
|
*
|
||||||
|
* @var string[]
|
||||||
|
*/
|
||||||
|
protected $casts = [
|
||||||
|
'tenancy_db_username' => 'encrypted',
|
||||||
|
'tenancy_db_password' => 'encrypted',
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define custom columns for this model (that shouldn't be accessed via 'data' property).
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function getCustomColumns(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'id',
|
||||||
|
'tenancy_db_username',
|
||||||
|
'tenancy_db_password',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
Loading…
Add table
Add a link
Reference in a new issue