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.
Untuk kebanyakan aplikasi perniagaan biasa, sistem RBAC boleh diperkemas untuk mengurus peranan dan kebenaran dengan berkesan tanpa kerumitan tambahan. Komponen utama ialah:
Jadual Pengguna
Jadual Peranan
Jadual Modul
Jadual Kebenaran_Modul
Jadual Kebenaran_Peranan
Jadual Peranan_Pengguna
Aplikasi perniagaan perusahaan mungkin memerlukan komponen tambahan untuk mengendalikan keperluan kawalan akses yang lebih kompleks. Ini termasuk:
Jadual Polisi
Jadual Dasar_Peranan
Jadual Dasar_Pengguna
Jadual_Syarat Polisi
Jadual Kebenaran_Kontekstual
Jadual Kekangan_Temporal
Meja Perwakilan
Jadual_Log Audit
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; } }
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!