Melaksanakan Sistem RBAC Dinamik untuk Aplikasi Perusahaan - Dipermudahkan
pengenalan
Dalam landskap digital hari ini, pengurusan akses yang berkesan adalah penting untuk mendapatkan sumber dan data. Sistem Kawalan Akses Berasaskan Peranan (RBAC) menyediakan pendekatan berstruktur untuk mengurus kebenaran dan peranan pengguna. Blog ini menggariskan dua variasi sistem RBAC yang disesuaikan dengan keperluan aplikasi yang berbeza: Aplikasi Perniagaan Biasa dan Aplikasi Perniagaan Perusahaan.
Untuk menggambarkan konsep, kami akan menyediakan coretan kod demo untuk kawalan akses pengurusan perkhidmatan, serta penerangan terperinci bagi setiap jadual yang digunakan dalam sistem RBAC.
Komponen Sistem RBAC
Aplikasi Perniagaan Biasa
Untuk kebanyakan aplikasi perniagaan biasa, sistem RBAC boleh diperkemas untuk mengurus peranan dan kebenaran dengan berkesan tanpa kerumitan tambahan. Komponen utama ialah:
-
Jadual Pengguna
- Tujuan: Menyimpan maklumat pengguna seperti nama pengguna, cincang kata laluan, e-mel dan tahap pelepasan.
- Lajur Utama: id_pengguna, nama pengguna, cincang_kata laluan, e-mel, jabatan, peringkat_kelegaan
-
Jadual Peranan
- Tujuan: Mentakrifkan peranan dalam aplikasi, memperincikan nama dan huraian setiap peranan.
- Lajur Utama: role_id, role_name, description
-
Jadual Modul
- Tujuan: Menyenaraikan modul aplikasi atau sumber, menerangkan tujuan dan fungsinya.
- Lajur Utama: module_id, module_name, description
-
Jadual Kebenaran_Modul
- Tujuan: Menentukan kebenaran yang dikaitkan dengan setiap modul, seperti akses baca atau tulis.
- Lajur Utama: module_permission_id, module_id, permission_type
-
Jadual Kebenaran_Peranan
- Tujuan: Peta berperanan kepada kebenaran modul, menentukan tindakan yang boleh dilakukan oleh peranan pada modul.
- Lajur Utama: role_permission_id, role_id, module_permission_id
-
Jadual Peranan_Pengguna
- Tujuan: Mengurus perhubungan antara pengguna dan peranan, mendayakan kawalan akses berasaskan peranan.
- Lajur Utama: user_role_id, user_id, role_id
Aplikasi Perniagaan Perusahaan
Aplikasi perniagaan perusahaan mungkin memerlukan komponen tambahan untuk mengendalikan keperluan kawalan akses yang lebih kompleks. Ini termasuk:
-
Jadual Polisi
- Tujuan: Mentakrifkan peraturan dan syarat akses tambahan, memberikan kawalan yang lebih terperinci.
- Lajur Utama: policy_id, policy_name, description
-
Jadual Dasar_Peranan
- Tujuan: Memautkan peranan kepada dasar, membenarkan peranan dikawal oleh peraturan dan syarat tertentu.
- Lajur Utama: role_policy_id, role_id, policy_id
-
Jadual Dasar_Pengguna
- Tujuan: Menetapkan dasar terus kepada pengguna, menampung kebenaran individu.
- Lajur Utama: user_policy_id, user_id, policy_id
-
Jadual_Syarat Polisi
- Tujuan: Menentukan syarat untuk dasar, seperti kekangan berdasarkan konteks atau atribut.
- Lajur Utama: policy_condition_id, policy_id, condition_type, condition_value
-
Jadual Kebenaran_Kontekstual
- Tujuan: Menggunakan dasar berdasarkan konteks tertentu, seperti jabatan pengguna atau lokasi.
- Lajur Utama: contextual_permission_id, policy_id, context_type, context_value
-
Jadual Kekangan_Temporal
- Tujuan: Mengurus akses berasaskan masa, menentukan masa mula dan tamat untuk keberkesanan dasar.
- Lajur Utama: temporal_constraint_id, policy_id, start_time, end_time
-
Meja Perwakilan
- Tujuan: Memudahkan penugasan peranan sementara, membenarkan pengguna mewakilkan peranan dengan tarikh tamat tempoh yang ditentukan.
- Lajur Utama: delegation_id, delegate_user_id, delegator_user_id, role_id, delegated_at, expiration_date
-
Jadual_Log Audit
- Tujuan: Merekod tindakan pengguna, interaksi modul dan perubahan peranan untuk pengauditan keselamatan dan pematuhan.
- Lajur Utama: audit_log_id, user_id, action, module_id, role_id, timestamp, details
Kod Demo: Perkhidmatan Kawalan Akses
Berikut ialah contoh pelaksanaan AccessControlService dalam Java, menunjukkan cara mengurus kawalan akses dalam sistem RBAC dinamik. Contoh ini merangkumi komponen penting dan menggambarkan cara mengendalikan kebenaran dan dasar.
import java.time.LocalDateTime; import java.util.List; @Service @Transactional public class AccessControlService { @Autowired private UserRepository userRepository; @Autowired private RoleRepository roleRepository; @Autowired private ModulePermissionRepository modulePermissionRepository; @Autowired private RolePermissionRepository rolePermissionRepository; @Autowired private UserRoleRepository userRoleRepository; @Autowired private PolicyRepository policyRepository; @Autowired private UserPolicyRepository userPolicyRepository; @Autowired private RolePolicyRepository rolePolicyRepository; @Autowired private PolicyConditionRepository policyConditionRepository; @Autowired private ContextualPermissionRepository contextualPermissionRepository; @Autowired private TemporalConstraintRepository temporalConstraintRepository; @Autowired private DelegationRepository delegationRepository; public boolean hasAccess(String username, Long moduleId, String permissionType) { // Fetch user User user = userRepository.findByUsername(username); if (user == null) { return false; } // Check if user has any delegations boolean hasDelegatedAccess = checkDelegatedAccess(user.getUserId(), moduleId, permissionType); if (hasDelegatedAccess) { return true; } // Check if user has direct access via roles List<UserRole> userRoles = userRoleRepository.findByUserId(user.getUserId()); for (UserRole userRole : userRoles) { List<RolePermission> rolePermissions = rolePermissionRepository.findByRoleId(userRole.getRoleId()); for (RolePermission rolePermission : rolePermissions) { ModulePermission modulePermission = modulePermissionRepository.findById(rolePermission.getModulePermissionId()).orElse(null); if (modulePermission != null && modulePermission.getModuleId().equals(moduleId) && modulePermission.getPermissionType().equals(permissionType)) { // Check if role has any associated policies if (hasPolicyAccess(user.getUserId(), moduleId, permissionType, modulePermission.getModuleId())) { return true; } } } } return false; } private boolean checkDelegatedAccess(Long userId, Long moduleId, String permissionType) { List<Delegation> delegations = delegationRepository.findByDelegateUserId(userId); LocalDateTime now = LocalDateTime.now(); for (Delegation delegation : delegations) { // Check if delegation is expired if (delegation.getExpirationDate() != null && delegation.getExpirationDate().isBefore(now)) { continue; } List<RolePermission> rolePermissions = rolePermissionRepository.findByRoleId(delegation.getRoleId()); for (RolePermission rolePermission : rolePermissions) { ModulePermission modulePermission = modulePermissionRepository.findById(rolePermission.getModulePermissionId()).orElse(null); if (modulePermission != null && modulePermission.getModuleId().equals(moduleId) && modulePermission.getPermissionType().equals(permissionType)) { return true; } } } return false; } private boolean hasPolicyAccess(Long userId, Long moduleId, String permissionType, Long modulePermissionId) { // Check policies assigned directly to the user List<UserPolicy> userPolicies = userPolicyRepository.findByUserId(userId); for (UserPolicy userPolicy : userPolicies) { if (isPolicyValid(userPolicy.getPolicyId(), moduleId, permissionType)) { return true; } } // Check policies assigned to roles List<UserRole> userRoles = userRoleRepository.findByUserId(userId); for (UserRole userRole : userRoles) { List<RolePolicy> rolePolicies = rolePolicyRepository.findByRoleId(userRole.getRoleId()); for (RolePolicy rolePolicy : rolePolicies) { if (isPolicyValid(rolePolicy.getPolicyId(), moduleId, permissionType)) { return true; } } } return false; } private boolean isPolicyValid(Long policyId, Long moduleId, String permissionType) { // Check policy conditions List<PolicyCondition> conditions = policyConditionRepository.findByPolicyId(policyId); for (PolicyCondition condition : conditions) { // Add logic to evaluate conditions based on conditionType and conditionValue // e.g., Check if context or attribute matches the condition } // Check contextual permissions List<ContextualPermission> contextualPermissions = contextualPermissionRepository.findByPolicyId(policyId); for (ContextualPermission contextualPermission : contextualPermissions) { // Add logic to evaluate contextual permissions // e.g., Check if current context matches the contextualPermission } // Check temporal constraints List<TemporalConstraint> temporalConstraints = temporalConstraintRepository.findByPolicyId(policyId); for (TemporalConstraint temporalConstraint : temporalConstraints) { LocalDateTime now = LocalDateTime.now(); if (now.isBefore(temporalConstraint.getStartTime()) || now.isAfter(temporalConstraint.getEndTime())) { return false; } } return true; } }
Kesimpulan
Dengan membezakan antara aplikasi perniagaan biasa dan aplikasi perniagaan perusahaan, anda boleh menyesuaikan sistem RBAC anda
Atas ialah kandungan terperinci Melaksanakan Sistem RBAC Dinamik untuk Aplikasi Perusahaan - Dipermudahkan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Penyelesaian masalah dan penyelesaian kepada perisian keselamatan syarikat yang menyebabkan beberapa aplikasi tidak berfungsi dengan baik. Banyak syarikat akan menggunakan perisian keselamatan untuk memastikan keselamatan rangkaian dalaman. …

Penyelesaian untuk menukar nama kepada nombor untuk melaksanakan penyortiran dalam banyak senario aplikasi, pengguna mungkin perlu menyusun kumpulan, terutama dalam satu ...

Pemprosesan pemetaan medan dalam dok sistem sering menemui masalah yang sukar ketika melaksanakan sistem dok: bagaimana untuk memetakan medan antara muka sistem dengan berkesan ...

Mula musim bunga menggunakan versi IntelliJideaultimate ...

Apabila menggunakan Mybatis-Plus atau Rangka Kerja ORM yang lain untuk operasi pangkalan data, sering diperlukan untuk membina syarat pertanyaan berdasarkan nama atribut kelas entiti. Sekiranya anda secara manual setiap kali ...

Penukaran objek dan tatasusunan Java: Perbincangan mendalam tentang risiko dan kaedah penukaran jenis cast yang betul Banyak pemula Java akan menemui penukaran objek ke dalam array ...

Penjelasan terperinci mengenai reka bentuk jadual SKU dan SPU di platform e-dagang Artikel ini akan membincangkan isu reka bentuk pangkalan data SKU dan SPU dalam platform e-dagang, terutamanya bagaimana menangani jualan yang ditentukan pengguna ...

Bagaimanakah penyelesaian caching Redis menyedari keperluan senarai kedudukan produk? Semasa proses pembangunan, kita sering perlu menangani keperluan kedudukan, seperti memaparkan ...
