Skillshub laravel-security
Security standards for hardening Laravel applications. Use when securing authentication, authorization, input validation, or CSRF in Laravel. (triggers: app/Policies/**/*.php, config/*.php, policy, gate, authorize, env, config)
install
source · Clone the upstream repo
git clone https://github.com/ComeOnOliver/skillshub
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/HoangNguyen0403/agent-skills-standard/laravel-security" ~/.claude/skills/comeonoliver-skillshub-laravel-security && rm -rf "$T"
manifest:
skills/HoangNguyen0403/agent-skills-standard/laravel-security/SKILL.mdsource content
Laravel Security
Priority: P0 (CRITICAL)
Structure
app/ ├── Policies/ # Model-level permission └── Http/ └── Middleware/ # Custom security layers
Implementation Guidelines
Authorization & RBAC
- Policies: Always use
for model-level authorization.php artisan make:policy PostPolicy --model=Post - Checkers: Implement
and callupdate(User $user, Post $post): bool
in controllers.$this->authorize('update', $post) - Gates: Use
for global permissions. Check withGate::define('admin', fn(User $user) => ...)
or BladeGate::allows('admin')
. prefer Policies for model-bound checks; use Gates for global permissions.@can('admin') - Admin Bypass: Define
inGate::before(fn($u) => $u->isAdmin() ? true : null)
.AuthServiceProvider
Configuration & Environment
- Environment: Only call env() inside config/*.php files. Access via
in your application code. never env() in controllers; use config() instead.config('app.key') - Caching: Run
to validate thatphp artisan config:cache
isn't used where it shouldn't be.env()
Data & Input Security
- Mass Assignment: Use Form Request with rules() and call $request->validated() for Model::create(). Define $fillable on model; never pass $request->all() to create().
- CSRF: Ensure the @csrf directive is in all Blade
tags. active on web routes by default; use<form>
only for trusted third-party callbacks.->except(['/webhook']) - Role-Based Access: Use Policies with role checks in policy methods; define
for admin bypass; or useGate::before
; never inline $user->role === 'admin'.spatie/laravel-permission
Anti-Patterns
- No
outside config files: Access viaenv()
helper.config() - No custom auth logic: Use Laravel's built-in auth system.
- No unvalidated mass assignment: Always call
.validated() - No auth logic in Blade: Pass permissions as data from controller.