├── public
├── favicon.ico
├── robots.txt
├── img
│ ├── login.png
│ ├── dashboard.png
│ ├── user list.png
│ ├── roles list.png
│ └── profile setting.png
├── index.php
├── .htaccess
└── css
│ └── app.css
├── database
├── .gitignore
├── migrations
│ ├── 2025_08_04_064724_add_is_active_column_to_users_table.php
│ ├── 2025_08_04_064707_create_roles_table.php
│ ├── 2025_08_04_064721_create_user_roles_table.php
│ ├── 2025_08_04_064724_create_role_permissions_table.php
│ ├── 2025_08_04_064717_create_permissions_table.php
│ ├── 0001_01_01_000001_create_cache_table.php
│ ├── 0001_01_01_000000_create_users_table.php
│ ├── 0001_01_01_000002_create_jobs_table.php
│ └── 2025_08_04_073354_add_database_indexes_for_optimization.php
├── factories
│ └── UserFactory.php
└── seeders
│ ├── DatabaseSeeder.php
│ ├── PermissionSeeder.php
│ └── RoleSeeder.php
├── bootstrap
├── cache
│ └── .gitignore
├── providers.php
└── app.php
├── resources
├── js
│ ├── app.js
│ └── bootstrap.js
├── sass
│ ├── _variables.scss
│ └── app.scss
├── views
│ ├── roles
│ │ └── index.blade.php
│ ├── users
│ │ └── index.blade.php
│ ├── home.blade.php
│ ├── auth
│ │ ├── verify.blade.php
│ │ ├── passwords
│ │ │ ├── email.blade.php
│ │ │ ├── confirm.blade.php
│ │ │ └── reset.blade.php
│ │ ├── register.blade.php
│ │ └── login.blade.php
│ ├── livewire
│ │ ├── profile-form.blade.php
│ │ ├── password-form.blade.php
│ │ ├── users
│ │ │ └── user-form.blade.php
│ │ ├── roles
│ │ │ └── role-form.blade.php
│ │ └── settings
│ │ │ └── profile-settings.blade.php
│ └── profile
│ │ └── index.blade.php
└── css
│ └── app.css
├── storage
├── logs
│ └── .gitignore
├── app
│ ├── private
│ │ └── .gitignore
│ ├── public
│ │ └── .gitignore
│ └── .gitignore
└── framework
│ ├── testing
│ └── .gitignore
│ ├── views
│ └── .gitignore
│ ├── cache
│ ├── data
│ │ └── .gitignore
│ └── .gitignore
│ ├── sessions
│ └── .gitignore
│ └── .gitignore
├── postcss.config.js
├── tests
├── TestCase.php
├── Unit
│ └── ExampleTest.php
└── Feature
│ └── ExampleTest.php
├── .gitattributes
├── routes
├── console.php
└── web.php
├── .editorconfig
├── app
├── Http
│ └── Controllers
│ │ ├── Controller.php
│ │ ├── HomeController.php
│ │ └── Auth
│ │ ├── ForgotPasswordController.php
│ │ ├── ResetPasswordController.php
│ │ ├── ConfirmPasswordController.php
│ │ ├── LoginController.php
│ │ ├── VerificationController.php
│ │ └── RegisterController.php
├── Domains
│ ├── Permission
│ │ └── Models
│ │ │ └── Permission.php
│ ├── User
│ │ └── Models
│ │ │ └── User.php
│ └── Role
│ │ └── Models
│ │ └── Role.php
├── Shared
│ ├── Middleware
│ │ ├── CheckRole.php
│ │ └── CheckPermission.php
│ ├── Traits
│ │ ├── HasPermissions.php
│ │ ├── WithAlerts.php
│ │ └── HasRoles.php
│ └── Services
│ │ ├── CacheService.php
│ │ └── LoggerService.php
├── Livewire
│ ├── ProfileForm.php
│ ├── PasswordForm.php
│ ├── Users
│ │ ├── UserForm.php
│ │ └── UserList.php
│ └── Roles
│ │ ├── RoleForm.php
│ │ └── RoleList.php
└── Providers
│ └── AppServiceProvider.php
├── vite.config.js
├── .gitignore
├── artisan
├── package.json
├── tailwind.config.js
├── config
├── services.php
├── filesystems.php
├── cache.php
├── mail.php
├── queue.php
├── auth.php
├── app.php
├── logging.php
├── database.php
└── session.php
├── phpunit.xml
├── .env.example
├── composer.json
└── README.md
/public/favicon.ico:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/database/.gitignore:
--------------------------------------------------------------------------------
1 | *.sqlite*
2 |
--------------------------------------------------------------------------------
/bootstrap/cache/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/resources/js/app.js:
--------------------------------------------------------------------------------
1 | import './bootstrap';
2 |
--------------------------------------------------------------------------------
/storage/logs/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Disallow:
3 |
--------------------------------------------------------------------------------
/storage/app/private/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/app/public/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/testing/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/views/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/cache/data/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/sessions/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/cache/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !data/
3 | !.gitignore
4 |
--------------------------------------------------------------------------------
/storage/app/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !private/
3 | !public/
4 | !.gitignore
5 |
--------------------------------------------------------------------------------
/bootstrap/providers.php:
--------------------------------------------------------------------------------
1 |
5 |
Update your account's profile information and email address.
7 |Update your password and manage security settings.
7 |Manage your account information
18 |
189 |
190 | ### Dashboard
191 |
192 |
193 | ### User Management
194 |
195 |
196 | ### Role Management
197 |
198 |
199 | ### Profile Settings
200 |
201 |
202 | ## 📖 Documentation
203 |
204 | - [Installation Guide](docs/installation.md)
205 | - [Architecture Overview](docs/architecture.md)
206 | - [User Management](docs/user-management.md)
207 | - [Roles & Permissions](docs/roles-permissions.md)
208 | - [Customization Guide](docs/customization.md)
209 | - [API Documentation](docs/api.md)
210 |
211 | ## 🤝 Support
212 |
213 | - **Documentation**: Comprehensive guides and examples
214 | - **Code Comments**: Well-documented codebase
215 | - **Best Practices**: Following Laravel and PHP standards
216 | - **Community**: Active discussion and updates
217 |
218 | ## 📄 License
219 |
220 | This project is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
221 |
222 | ## 🏆 Features Checklist
223 |
224 | - ✅ User CRUD operations
225 | - ✅ Role & Permission management
226 | - ✅ Dynamic authorization middleware
227 | - ✅ Blade directives for UI control
228 | - ✅ Responsive Tailwind CSS design
229 | - ✅ Livewire dynamic components
230 | - ✅ Secure authentication system
231 | - ✅ Email verification
232 | - ✅ Password reset functionality
233 | - ✅ Database seeders with sample data
234 | - ✅ Comprehensive test coverage
235 | - ✅ Clean DDD architecture
236 | - ✅ Production-ready configuration
237 |
238 | ---
239 |
240 | **Ready to build your next application on a solid foundation? This boilerplate eliminates months of development time while providing enterprise-grade security and scalability.**
241 |
--------------------------------------------------------------------------------
/config/session.php:
--------------------------------------------------------------------------------
1 | env('SESSION_DRIVER', 'database'),
22 |
23 | /*
24 | |--------------------------------------------------------------------------
25 | | Session Lifetime
26 | |--------------------------------------------------------------------------
27 | |
28 | | Here you may specify the number of minutes that you wish the session
29 | | to be allowed to remain idle before it expires. If you want them
30 | | to expire immediately when the browser is closed then you may
31 | | indicate that via the expire_on_close configuration option.
32 | |
33 | */
34 |
35 | 'lifetime' => (int) env('SESSION_LIFETIME', 120),
36 |
37 | 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
38 |
39 | /*
40 | |--------------------------------------------------------------------------
41 | | Session Encryption
42 | |--------------------------------------------------------------------------
43 | |
44 | | This option allows you to easily specify that all of your session data
45 | | should be encrypted before it's stored. All encryption is performed
46 | | automatically by Laravel and you may use the session like normal.
47 | |
48 | */
49 |
50 | 'encrypt' => env('SESSION_ENCRYPT', false),
51 |
52 | /*
53 | |--------------------------------------------------------------------------
54 | | Session File Location
55 | |--------------------------------------------------------------------------
56 | |
57 | | When utilizing the "file" session driver, the session files are placed
58 | | on disk. The default storage location is defined here; however, you
59 | | are free to provide another location where they should be stored.
60 | |
61 | */
62 |
63 | 'files' => storage_path('framework/sessions'),
64 |
65 | /*
66 | |--------------------------------------------------------------------------
67 | | Session Database Connection
68 | |--------------------------------------------------------------------------
69 | |
70 | | When using the "database" or "redis" session drivers, you may specify a
71 | | connection that should be used to manage these sessions. This should
72 | | correspond to a connection in your database configuration options.
73 | |
74 | */
75 |
76 | 'connection' => env('SESSION_CONNECTION'),
77 |
78 | /*
79 | |--------------------------------------------------------------------------
80 | | Session Database Table
81 | |--------------------------------------------------------------------------
82 | |
83 | | When using the "database" session driver, you may specify the table to
84 | | be used to store sessions. Of course, a sensible default is defined
85 | | for you; however, you're welcome to change this to another table.
86 | |
87 | */
88 |
89 | 'table' => env('SESSION_TABLE', 'sessions'),
90 |
91 | /*
92 | |--------------------------------------------------------------------------
93 | | Session Cache Store
94 | |--------------------------------------------------------------------------
95 | |
96 | | When using one of the framework's cache driven session backends, you may
97 | | define the cache store which should be used to store the session data
98 | | between requests. This must match one of your defined cache stores.
99 | |
100 | | Affects: "dynamodb", "memcached", "redis"
101 | |
102 | */
103 |
104 | 'store' => env('SESSION_STORE'),
105 |
106 | /*
107 | |--------------------------------------------------------------------------
108 | | Session Sweeping Lottery
109 | |--------------------------------------------------------------------------
110 | |
111 | | Some session drivers must manually sweep their storage location to get
112 | | rid of old sessions from storage. Here are the chances that it will
113 | | happen on a given request. By default, the odds are 2 out of 100.
114 | |
115 | */
116 |
117 | 'lottery' => [2, 100],
118 |
119 | /*
120 | |--------------------------------------------------------------------------
121 | | Session Cookie Name
122 | |--------------------------------------------------------------------------
123 | |
124 | | Here you may change the name of the session cookie that is created by
125 | | the framework. Typically, you should not need to change this value
126 | | since doing so does not grant a meaningful security improvement.
127 | |
128 | */
129 |
130 | 'cookie' => env(
131 | 'SESSION_COOKIE',
132 | Str::snake((string) env('APP_NAME', 'laravel')).'_session'
133 | ),
134 |
135 | /*
136 | |--------------------------------------------------------------------------
137 | | Session Cookie Path
138 | |--------------------------------------------------------------------------
139 | |
140 | | The session cookie path determines the path for which the cookie will
141 | | be regarded as available. Typically, this will be the root path of
142 | | your application, but you're free to change this when necessary.
143 | |
144 | */
145 |
146 | 'path' => env('SESSION_PATH', '/'),
147 |
148 | /*
149 | |--------------------------------------------------------------------------
150 | | Session Cookie Domain
151 | |--------------------------------------------------------------------------
152 | |
153 | | This value determines the domain and subdomains the session cookie is
154 | | available to. By default, the cookie will be available to the root
155 | | domain and all subdomains. Typically, this shouldn't be changed.
156 | |
157 | */
158 |
159 | 'domain' => env('SESSION_DOMAIN'),
160 |
161 | /*
162 | |--------------------------------------------------------------------------
163 | | HTTPS Only Cookies
164 | |--------------------------------------------------------------------------
165 | |
166 | | By setting this option to true, session cookies will only be sent back
167 | | to the server if the browser has a HTTPS connection. This will keep
168 | | the cookie from being sent to you when it can't be done securely.
169 | |
170 | */
171 |
172 | 'secure' => env('SESSION_SECURE_COOKIE'),
173 |
174 | /*
175 | |--------------------------------------------------------------------------
176 | | HTTP Access Only
177 | |--------------------------------------------------------------------------
178 | |
179 | | Setting this value to true will prevent JavaScript from accessing the
180 | | value of the cookie and the cookie will only be accessible through
181 | | the HTTP protocol. It's unlikely you should disable this option.
182 | |
183 | */
184 |
185 | 'http_only' => env('SESSION_HTTP_ONLY', true),
186 |
187 | /*
188 | |--------------------------------------------------------------------------
189 | | Same-Site Cookies
190 | |--------------------------------------------------------------------------
191 | |
192 | | This option determines how your cookies behave when cross-site requests
193 | | take place, and can be used to mitigate CSRF attacks. By default, we
194 | | will set this value to "lax" to permit secure cross-site requests.
195 | |
196 | | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value
197 | |
198 | | Supported: "lax", "strict", "none", null
199 | |
200 | */
201 |
202 | 'same_site' => env('SESSION_SAME_SITE', 'lax'),
203 |
204 | /*
205 | |--------------------------------------------------------------------------
206 | | Partitioned Cookies
207 | |--------------------------------------------------------------------------
208 | |
209 | | Setting this value to true will tie the cookie to the top-level site for
210 | | a cross-site context. Partitioned cookies are accepted by the browser
211 | | when flagged "secure" and the Same-Site attribute is set to "none".
212 | |
213 | */
214 |
215 | 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false),
216 |
217 | ];
218 |
--------------------------------------------------------------------------------
/resources/views/livewire/roles/role-form.blade.php:
--------------------------------------------------------------------------------
1 | Update your account's profile information and email address.
7 |