Repository navigation
Fix: Update user tanpa cek kepemilikan dan role mentah dapat memberi super-admin - #1785
Open
pandigresik wants to merge 5 commits into
Open
pandigresik wants to merge 5 commits into
pandigresik wants to merge 5 commits into
Conversation
…dmin UserController::update() tidak memeriksa kepemilikan dan memproses role mentah dari request, sehingga administrator-website bisa mengubah user lain dan memberikan role super-admin. - Non super-admin hanya boleh mengubah profilnya sendiri (403 jika tidak). - Hanya super-admin yang boleh menyinkronkan role. - Pengecekan ditempatkan di luar try agar abort(403) tidak tertangkap. Fixes #1782 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Contributor
|
🔄 AI PR Review sedang antri di server...
|
…access.setting Route edit dan update profil user berada di bawah middleware access.setting, sehingga role admin-kecamatan (yang sengaja tidak punya akses setting) mendapat 403 saat membuka profilnya sendiri. - Pindahkan route setting.user.edit dan setting.user.update ke grup yang hanya memakai auth. Kepemilikan tetap dicek di UserController (non super-admin hanya boleh mengakses id miliknya). - Route pengaturan user lain dan foto profil tetap dilindungi access.setting. - Tambah test untuk profil sendiri tanpa access.setting, serta penjagaan bahwa edit user lain dan daftar user tetap ditolak. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Pembatasan edit email (hanya untuk akun sendiri) sebelumnya hanya ada di view. Field readonly tetap ikut terkirim, sehingga nilai email user lain bisa diubah lewat request. - Di UserController::update(), email dibuang dari input jika user yang diubah bukan akun yang sedang login. Berlaku untuk semua role, termasuk super-admin, sesuai aturan di form.blade.php. - Test super-admin mengubah user lain diubah: nama tetap berubah, email tidak. - Tambah test: super-admin bisa mengubah email akunnya sendiri, dan non super-admin bisa mengubah email profilnya sendiri. Fixes #1783 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Role dibuat dengan firstOrCreate tanpa guard_name, sehingga Spatie mengambil role guard api yang tidak punya permission. Akibatnya test dashboard admin-kecamatan mendapat 403. - Tentukan guard_name web, sama seperti seeder. - Berikan permission access.dashboard secara eksplisit, supaya test tidak bergantung pada isi database. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull Request: Fix: Keamanan manajemen user (update tanpa kepemilikan, role mentah, dan email di sisi klien)
Description
Tiga celah di
UserController::update()dan route profil diperbaiki dalam satu PR. Update user tidak mengecek kepemilikan dan memprosesrolementah dari request, sehinggaadministrator-websitebisa mengubah user lain dan memberi rolesuper-admin. Pembatasan email hanya ada di view, sehingga nilai email user lain tetap bisa diubah lewat request. Di sisi lain, route profil sendiri ikut terkunci olehaccess.setting, sehingga user sepertiadmin-kecamatantidak bisa membuka profilnya sendiri.Changes made:
app/Http/Controllers/User/UserController.php— non super-admin yang mengaksesupdate()untuk user lain mendapat403. Pengecekan ditempatkan sebelum bloktry, karenacatch (\Exception)akan menangkapabort(403).app/Http/Controllers/User/UserController.php—syncRoles()hanya dijalankan untuk super-admin. Inputroledari role lain diabaikan.app/Http/Controllers/User/UserController.php—emaildibuang dari input jika user yang diubah bukan akun yang sedang login. Berlaku untuk semua role, termasuk super-admin, sesuai aturan diresources/views/user/form.blade.php.routes/web.php—setting.user.editdansetting.user.updatedipindah ke grup yang hanya memakaiauth. Kepemilikan tetap dicek di controller. Route pengaturan user lain dan foto profil tetap dilindungiaccess.setting.tests/Feature/UserControllerTest.php— test baru dan perubahan test super-admin, mencakup 403 untuk user lain, role diabaikan, email user lain tidak berubah, perubahan email akun sendiri, dan profil sendiri tanpaaccess.setting.Reason for change:
update()tidak mengecek kepemilikan, berbeda denganedit()yang sudah mengecek. Akibatnya user non super-admin bisa mengubah akun siapa pun berdasarkanid.roledibaca langsung dari request dan tidak divalidasi, sehingga rolesuper-adminbisa diberikan.access.setting. Roleadmin-kecamatansengaja tidak punya akses pengaturan, tetapi tetap perlu mengelola profilnya sendiri.Impact of change:
✅ Akun user lain terlindungi: non super-admin tidak bisa lagi mengubah user lain, dan super-admin tidak bisa mengubah email user lain melalui request.
✅ Eskalasi privilege ditutup: role
super-adminhanya bisa diberikan oleh super-admin.✅ Profil sendiri tetap bisa dikelola: nama, alamat, dan email profil sendiri bisa diubah oleh semua user yang login, tanpa membuka menu pengaturan lain.
Related Issue
#1782
#1783
Steps to Reproduce
Before fix (problem):
administrator-websitePUT /setting/user/update/{id}denganiduser lain, mengisinamedanemailbaruPUTke profil sendiri denganrole[]=super-adminsuper-adminberhasil diberikan ke akun non super-adminadmin-kecamatan, bukaGET /setting/user/edit/{id}untuk profil sendiri403, karena route memakaiaccess.settingAfter fix (solution):
administrator-websitePUT /setting/user/update/{id}denganiduser lain403 Anda tidak berhak mengubah user tersebut, data user lain tidak berubahPUTke profil sendiri denganrole[]=super-adminrolediabaikan, role akun tetapadministrator-websiteadmin-kecamatan, bukaGET /setting/user/edit/{id}untuk profil sendiriTesting on related features:
access.setting) ✅ Testtest_update_updates_profile_and_redirects_to_dashboard_for_regular_userlulusaccess.setting✅ Testtest_edit_displays_own_profile_without_access_setting_permissiondantest_update_own_profile_without_access_setting_permissionlulusaccess.settingtetap ditolak ✅ Testtest_edit_forbids_another_user_without_access_setting_permissionlulusaccess.settingtetap ditolak ✅ Testtest_index_forbids_user_without_access_setting_permissionlulustest_update_updates_user_successfully_for_super_adminlulus (email user lain tidak berubah)test_update_allows_super_admin_to_change_own_emaillulusadmin-kecamatan✅AuthorizationTestlulus. Sebelumnya gagal karena setup test memakai role guardapi, sudah diperbaiki di commit1d22b971.Checklist
Technical Details
Technical Explanation
Alur
update()setelah perbaikan:Route profil setelah perbaikan:
Route
photo-profildanupdate-photomasih memakaiaction_permission:access.setting, sehinggaadmin-kecamatanbelum bisa mengganti foto profilnya sendiri. Ini di luar cakupan PR ini.Route
PUT /setting/user/update/{id}untuk user lain sekarang juga memberi403bagi non super-admin. SebelumnyaUserController::update()menerima request tersebut.Perbaikan ini ada di level controller dan tidak bergantung pada nama permission
access.setting.edit, yang tidak ada di seeder.Configuration changes
Tidak ada.
Dependencies added
No new dependencies
Testing
Manual Testing
administrator-website, coba edit user lain → harus 403administrator-website, edit profil sendiri → berhasiladmin-kecamatan, buka dan simpan profil sendiri → berhasiladmin-kecamatan, buka/setting/user→ 403super-admin, edit user lain → nama dan role berubah, email tidakAutomated Testing
Tests\Feature\UserControllerTest(22 test lulus, termasuk test baru dan test yang diubah)Tests\Feature\Auth,Permission,UserControllerTest: 82 lulus (termasukAuthorizationTestsetelah perbaikan setup test)Settings,ExportRouteMiddlewareTest,TokenRegisteredMiddlewareTestdijalankan bersama kelompok di atas sebelum perbaikanAuthorizationTest: lulus semua kecualiAuthorizationTest, yang kini sudah diperbaikiCatatan: suite Feature penuh belum bisa dijalankan dengan
pest --parallel, karenatests/Feature/JumlahDashboardTest.phpmemakaiuse Mockery;dan gagal saat dimuat. File itu tidak diubah dalam PR ini.Browser Compatibility (if applicable)
Tidak ada perubahan UI.
Screenshots / Video
simplescreenrecorder-2026-10-28_07.41.50.mp4
Breaking Changes
Ya, perilaku ini berubah:
PUTke user lain sebelumnya berhasil, sekarang mendapat403.PUTke user lain dengan email baru: nama dan role tetap diproses, tetapi email diabaikan.roledari non super-admin sebelumnya diproses, sekarang diabaikan tanpa error.Migration Guide
Not required
References
Additional notes:
test_update_ignores_email_change_when_editing_another_user.access.setting.edittidak ada di tabelpermissionsproduksi. Perbaikan ini tidak bergantung pada hal itu, tetapi belum diverifikasi terhadap data produksi.🤖 Generated with Claude Code