我有一个基于Spring Boot的微服务(PolicyService),它使用Spring Security OAuth2作为资源组件进行保护。
因此,如果用户通过身份验证,则检查是通过使用授权服务器组件验证请求中收到的令牌来完成的。
此外,在服务内部,我检查当前用户的角色和ACE请求的对象(用于更新,删除和读取操作)到 确定当前用户是否具有执行目标操作所需的权限。我使用Spring Security方法级别注释进行角色检查,并使用自定义ACL服务进行域对象级别权限。
一旦我确定用户已经过身份验证,并且还具有所请求的操作和/或对象所需的授权, 在数据库中创建了一个策略。
此外,我从Policy Service调用ACL Service中的另一个操作,为创建的对象和User添加ACE(访问控制条目)。
如果在任何时候出现故障,我会抛出一个例外,因为“访问被拒绝。”
我现在想要使用基于Apache Camel的Composite服务来编排这项服务。
我想知道是否最好将使用ACL Service检查授权的步骤分开 并且在创建策略后添加ACL Entry,作为Apache camel中的单独步骤。
截至目前,他们都被政策服务部门消费。
此外,我现在要求对正在创建的策略进行验证,这当前很耗时,所以我想通过向队列发送事件来使用消息传递,该队列将由一个验证和更新的服务进行监视。数据库并根据验证结果相应地发送邮件。
我想知道是否最好将这些不同的功能作为Camel Route中的各个步骤提取出来,或者在Policy Service中使用它们。
如果我将Role Check提取到Composite Service,那意味着我需要将Spring Security添加到基于Spring Boot的Apache Camel Composite Service以保护服务。
我目前使用Spring Security方法级别注释和自定义ACL服务进行ACL权限检查(不适用于Create,但适用于其他操作)。我相信我现在可能不得不在Camel服务中以不同的方式重做逻辑。
此外,这是使用异步,消息传递或使用事件源提升自定义事件来调用策略验证服务的更好方法。
此外,Apache Camel是否支持使用事件源和异步服务调用来提升自定义事件
我目前在Camel中设计了如下设计的路线。
<route id="createPolicy">
<from uri="direct:createPolicy"/>
<!-- Check if User has the Role(s) required for this operation , handled internally by Policy Service using Spring Security-->
<bean ref="aclClientBean" method="checkRoleForCreatePolicy(${body})"/>
<!-- Create a Policy using Policy Service -->
<bean ref="policyClientBean" method="createPolicy(${body})"/>
<!-- Add ACE for Policy Instance and Current User using ACL Service , handled internally by Policy Service using ACL Service-->
<bean ref="aclClientBean" method="addACLForPolicy(${body})"/>
<!--Validating the Policy Details-->
<!-- Option 1:Send a message to a configured Policy Validation Queue which is monitored by Policy Validation Service -->
<!-- Option 2:Send a event that Policy is created, whoever interested on Policy Creation Event will subscribe to the event
and act accordingly when notified -->
<!-- Option 3:Asynchronously invoke the Policy Validation Service and validate the passed details -->
<bean ref="policyValidationClientBean" method="validatePolicyDetails(${body})"/>
<onException>
<exception>com.company.application.exception.AuthException</exception>
<handled>
<constant>true</constant>
</handled>
<to uri="direct:authException"/>
</onException>
<onException>
<exception>com.company.application.exception.APPException</exception>
<handled>
<constant>true</constant>
</handled>
<to uri="direct:appException"/>
</onException>
</route>
<route id="authException">
<from uri="direct:authException"/>
<log message="Access Denied."/>
<bean ref="policyOrchestratorClientBean" method="handleFailure('Access Denied.')"/>
</route>
<route id="appException">
<from uri="direct:appException"/>
<log message="Exception invoking Service"/>
<bean ref="policyOrchestratorClientBean" method="handleFailure('Exception invoking Service')"/>
</route>