Agent-skills-standard laravel-security
Harden Laravel apps with Policies for model authorization, Gate-based RBAC, validated mass assignment, and CSRF protection. Use when creating authorization policies, securing env config access, or preventing mass assignment vulnerabilities. (triggers: app/Policies/**/*.php, config/*.php, policy, gate, authorize, env, config)
install
source · Clone the upstream repo
git clone https://github.com/HoangNguyen0403/agent-skills-standard
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/HoangNguyen0403/agent-skills-standard "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/laravel/laravel-security" ~/.claude/skills/hoangnguyen0403-agent-skills-standard-laravel-security && rm -rf "$T"
manifest:
skills/laravel/laravel-security/SKILL.mdsource content
Laravel Security
Priority: P0 (CRITICAL)
Workflow: Secure Resource
- Generate policy —
.php artisan make:policy PostPolicy --model=Post - Implement policy methods — Return
forbool
,view
,update
actions.delete - Authorize in controller — Call
.$this->authorize('update', $post) - Add Gate bypass — Define
for admin users inGate::before()
.AuthServiceProvider - Validate inputs — Use Form Request with
for$request->validated()
.Model::create()
Policy Example
See implementation examples for Policy class with controller authorization.
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 .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 @csrf directive 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.