今日のデジタル環境では、リソースとデータを保護するために効果的なアクセス管理が重要です。ロールベースのアクセス制御 (RBAC) システムは、ユーザーの権限とロールを管理するための構造化されたアプローチを提供します。このブログでは、さまざまなアプリケーションのニーズに合わせた RBAC システムの 2 つのバリエーション (共通ビジネス アプリケーションとエンタープライズ ビジネス アプリケーション) について概説します。
概念を説明するために、アクセス制御を管理するサービスのデモ コード スニペットと、RBAC システムで使用される各テーブルの詳細な説明を提供します。
ほとんどの一般的なビジネス アプリケーションでは、RBAC システムを合理化し、複雑さを増すことなくロールと権限を効果的に管理できます。主要なコンポーネントは次のとおりです:
ユーザーテーブル
役割テーブル
モジュールテーブル
Module_Permission テーブル
Role_Permission テーブル
User_Role テーブル
エンタープライズ ビジネス アプリケーションでは、より複雑なアクセス制御のニーズを処理するために追加のコンポーネントが必要になる場合があります。これらには以下が含まれます:
ポリシーテーブル
Role_Policy テーブル
User_Policy テーブル
Policy_Condition テーブル
Contextual_Permission テーブル
Temporal_Constraint テーブル
委任テーブル
Audit_Log テーブル
これは、Java での AccessControlService のサンプル実装であり、動的 RBAC システムでアクセス制御を管理する方法を示しています。この例では、重要なコンポーネントを取り上げ、アクセス許可とポリシーを処理する方法を示します。
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; } }
一般的なビジネス アプリケーションとエンタープライズ ビジネス アプリケーションを区別することで、RBAC システムをカスタマイズできます
以上がエンタープライズ アプリケーション向けの動的 RBAC システムの実装 - 簡略化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。