Rumah  >  Artikel  >  Java  >  Melaksanakan Sistem RBAC Dinamik untuk Aplikasi Perusahaan - Dipermudahkan

Melaksanakan Sistem RBAC Dinamik untuk Aplikasi Perusahaan - Dipermudahkan

王林
王林asal
2024-08-14 11:02:371113semak imbas

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;
    }
}

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:
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
Artikel sebelumnya:Java Pilih Saya Hari IniArtikel seterusnya:Java Pilih Saya Hari Ini