Rumah Java javaTutorial Melaksanakan Sistem RBAC Dinamik untuk Aplikasi Perusahaan - Dipermudahkan

Melaksanakan Sistem RBAC Dinamik untuk Aplikasi Perusahaan - Dipermudahkan

Aug 14, 2024 am 11:02 AM

Implementing a Dynamic RBAC System for Enterprise Applications - Simplified

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:

  1. 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
  2. Jadual Peranan

    • Tujuan: Mentakrifkan peranan dalam aplikasi, memperincikan nama dan huraian setiap peranan.
    • Lajur Utama: role_id, role_name, description
  3. Jadual Modul

    • Tujuan: Menyenaraikan modul aplikasi atau sumber, menerangkan tujuan dan fungsinya.
    • Lajur Utama: module_id, module_name, description
  4. 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
  5. 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
  6. 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:

  1. Jadual Polisi

    • Tujuan: Mentakrifkan peraturan dan syarat akses tambahan, memberikan kawalan yang lebih terperinci.
    • Lajur Utama: policy_id, policy_name, description
  2. 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
  3. Jadual Dasar_Pengguna

    • Tujuan: Menetapkan dasar terus kepada pengguna, menampung kebenaran individu.
    • Lajur Utama: user_policy_id, user_id, policy_id
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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;
    }
}
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

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

Artikel Panas

<🎜>: Bubble Gum Simulator Infinity - Cara Mendapatkan dan Menggunakan Kekunci Diraja
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Sistem Fusion, dijelaskan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1673
14
Tutorial PHP
1278
29
Tutorial C#
1257
24
Adakah perisian keselamatan syarikat menyebabkan aplikasi gagal dijalankan? Bagaimana cara menyelesaikan masalah dan menyelesaikannya? Adakah perisian keselamatan syarikat menyebabkan aplikasi gagal dijalankan? Bagaimana cara menyelesaikan masalah dan menyelesaikannya? Apr 19, 2025 pm 04:51 PM

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. …

Bagaimanakah saya menukar nama kepada nombor untuk melaksanakan penyortiran dan mengekalkan konsistensi dalam kumpulan? Bagaimanakah saya menukar nama kepada nombor untuk melaksanakan penyortiran dan mengekalkan konsistensi dalam kumpulan? Apr 19, 2025 pm 11:30 PM

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

Bagaimana untuk memudahkan isu pemetaan medan dalam dok sistem menggunakan mapstruct? Bagaimana untuk memudahkan isu pemetaan medan dalam dok sistem menggunakan mapstruct? Apr 19, 2025 pm 06:21 PM

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

Bagaimanakah Idea IntelliJ mengenal pasti nombor port projek boot musim bunga tanpa mengeluarkan log? Bagaimanakah Idea IntelliJ mengenal pasti nombor port projek boot musim bunga tanpa mengeluarkan log? Apr 19, 2025 pm 11:45 PM

Mula musim bunga menggunakan versi IntelliJideaultimate ...

Bagaimana dengan elegan mendapatkan nama pemboleh ubah kelas entiti untuk membina keadaan pertanyaan pangkalan data? Bagaimana dengan elegan mendapatkan nama pemboleh ubah kelas entiti untuk membina keadaan pertanyaan pangkalan data? Apr 19, 2025 pm 11:42 PM

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 ...

Bagaimana cara menukar objek Java dengan selamat ke array? Bagaimana cara menukar objek Java dengan selamat ke array? Apr 19, 2025 pm 11:33 PM

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 ...

Platform e-dagang SKU dan Reka Bentuk Pangkalan Data SPU: Bagaimana untuk mengambil kira kedua-dua atribut yang ditakrifkan oleh pengguna dan produk yang tidak berkesudahan? Platform e-dagang SKU dan Reka Bentuk Pangkalan Data SPU: Bagaimana untuk mengambil kira kedua-dua atribut yang ditakrifkan oleh pengguna dan produk yang tidak berkesudahan? Apr 19, 2025 pm 11:27 PM

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 ...

Bagaimana menggunakan penyelesaian cache Redis untuk merealisasikan keperluan senarai kedudukan produk dengan cekap? Bagaimana menggunakan penyelesaian cache Redis untuk merealisasikan keperluan senarai kedudukan produk dengan cekap? Apr 19, 2025 pm 11:36 PM

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

See all articles