AEM工作流:获取启动器的会话以检查权限

AEM工作流:获取启动器的会话以检查权限,aem,jcr,Aem,Jcr,要检查启动器的权限,可以调用session.checkPermission() 但是,com.day.cq.WorkflowSession.getSession()始终返回管理会话,因此我无法检查启动器在给定节点上的权限 如何获得发起人的会话 更新 Authorizable authorizable = userManager.getAuthorizable(initiator); Credentials credentials = ((User) authorizable).getCreden

要检查启动器的权限,可以调用
session.checkPermission()

但是,
com.day.cq.WorkflowSession.getSession()
始终返回管理会话,因此我无法检查启动器在给定节点上的权限

如何获得发起人的会话

更新

Authorizable authorizable = userManager.getAuthorizable(initiator);
Credentials credentials = ((User) authorizable).getCredentials(); 
Session userSession = adminSession.impersonate(credentials);`
抛出:

javax.jcr.LoginException: Login Failure: all modules ignored
at org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl.login(RepositoryImpl.java:271)
at com.adobe.granite.repository.impl.CRX3RepositoryImpl.login(CRX3RepositoryImpl.java:92)
at org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl.login(RepositoryImpl.java:202)
at org.apache.jackrabbit.oak.jcr.session.SessionImpl.impersonate(SessionImpl.java:284)
Caused by: javax.security.auth.login.LoginException: Login Failure: all modules ignored
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:906)
at javax.security.auth.login.LoginContext.access$000(LoginContext.java:195)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:682)
... 15 common frames omitted`

首先,正如@CptBartender在评论中提到的,管理员应该拥有对所有内容的权限,或者如果您利用了服务帐户,那么该服务帐户应该可以访问它需要更新的内容

在使用Sling服务帐户的较新AEM版本中,发起人始终是
admin
workflow service
。用户请求启动工作流,管理员或服务帐户运行该流程。如果要查找启动工作流的用户,可以使用
item.getWorkflowData().getMetaDataMap().get(“userId”,String.class)
查找元数据。请注意,数据与JCR中创建的资源相匹配,路径类似于
/etc/workflow/instances/server0/2016-06-13/update\u asset\u 2/data/metaData
。此外,您还可以通过获取
HistoryItem
userId
来获取各个工作流过程步骤的参与者

确定启动器后,您应该能够使用以下内容进行模拟:

@Component
@Service
@Properties({
    @Property(name = Constants.SERVICE_DESCRIPTION, value = "Workflow step description"),
    @Property(name = Constants.SERVICE_VENDOR, value = "Company Name"),
    @Property(name = "process.label", value = "Process Label will show in the workflow dropdown") })
public class MyCustomStep implements WorkflowProcess {

    public void execute(WorkItem item, WorkflowSession wfsession, MetaDataMap args) throws WorkflowException {

        /* Always admin or service-workflow */
        final String initiator = item.getWorkflow().getInitiator();

        /* Get actual user who initiated workflow */
        final String initiator = item.getWorkflowData().getMetaDataMap().get("userId", String.class);

        /* Get workflow history */
        final List<HistoryItem> histories = wfsession.getHistory(item.getWorkflow());

        /* Get first item in workflow history */
        final HistoryItem firstItem = histories.get(0);

        /* Get the user that participated in the last item */
        final String firstUser = firstItem.getUserId();

        /* Get impersonated session */
        try {
            Session userSession = wfsession.getSession().impersonate(new SimpleCredentials(initiator,new char[0]));
        } catch (javax.jcr.LoginException e) {
            e.printStackTrace();
        } catch (RepositoryException e) {
            e.printStackTrace();
        }
    }
}
@组件
@服务
@性质({
@属性(name=Constants.SERVICE_DESCRIPTION,value=“工作流步骤描述”),
@属性(name=Constants.SERVICE\u供应商,value=“公司名称”),
@属性(name=“process.label”,value=“流程标签将显示在工作流下拉列表中”)})
公共类MyCustomStep实现WorkflowProcess{
public void execute(WorkItem项、WorkflowSession wfsession、MetaDataMap参数)引发WorkflowException{
/*始终管理或服务工作流*/
最终字符串启动器=item.getWorkflow().getInitiator();
/*获取启动工作流的实际用户*/
最终字符串启动器=item.getWorkflowData().getMetaDataMap().get(“userId”,String.class);
/*获取工作流历史记录*/
最终列表历史记录=wfsession.getHistory(item.getWorkflow());
/*获取工作流历史记录中的第一项*/
最终HistoryItem firstItem=历史记录。获取(0);
/*获取参与最后一项的用户*/
最后一个字符串firstUser=firstItem.getUserId();
/*获取模拟会话*/
试一试{
Session userSession=wfsession.getSession().impersonate(新的SimpleCredentials(启动器,新字符[0]);
}catch(javax.jcr.LoginException e){
e、 printStackTrace();
}捕获(存储异常e){
e、 printStackTrace();
}
}
}

首先,正如@CptBartender在评论中提到的,管理员应该拥有所有内容的权限,或者如果您利用了服务帐户,则该服务帐户应该可以访问需要更新的内容

在使用Sling服务帐户的较新AEM版本中,发起人始终是
admin
workflow service
。用户请求启动工作流,管理员或服务帐户运行该流程。如果要查找启动工作流的用户,可以使用
item.getWorkflowData().getMetaDataMap().get(“userId”,String.class)
查找元数据。请注意,数据与JCR中创建的资源相匹配,路径类似于
/etc/workflow/instances/server0/2016-06-13/update\u asset\u 2/data/metaData
。此外,您还可以通过获取
HistoryItem
userId
来获取各个工作流过程步骤的参与者

确定启动器后,您应该能够使用以下内容进行模拟:

@Component
@Service
@Properties({
    @Property(name = Constants.SERVICE_DESCRIPTION, value = "Workflow step description"),
    @Property(name = Constants.SERVICE_VENDOR, value = "Company Name"),
    @Property(name = "process.label", value = "Process Label will show in the workflow dropdown") })
public class MyCustomStep implements WorkflowProcess {

    public void execute(WorkItem item, WorkflowSession wfsession, MetaDataMap args) throws WorkflowException {

        /* Always admin or service-workflow */
        final String initiator = item.getWorkflow().getInitiator();

        /* Get actual user who initiated workflow */
        final String initiator = item.getWorkflowData().getMetaDataMap().get("userId", String.class);

        /* Get workflow history */
        final List<HistoryItem> histories = wfsession.getHistory(item.getWorkflow());

        /* Get first item in workflow history */
        final HistoryItem firstItem = histories.get(0);

        /* Get the user that participated in the last item */
        final String firstUser = firstItem.getUserId();

        /* Get impersonated session */
        try {
            Session userSession = wfsession.getSession().impersonate(new SimpleCredentials(initiator,new char[0]));
        } catch (javax.jcr.LoginException e) {
            e.printStackTrace();
        } catch (RepositoryException e) {
            e.printStackTrace();
        }
    }
}
@组件
@服务
@性质({
@属性(name=Constants.SERVICE_DESCRIPTION,value=“工作流步骤描述”),
@属性(name=Constants.SERVICE\u供应商,value=“公司名称”),
@属性(name=“process.label”,value=“流程标签将显示在工作流下拉列表中”)})
公共类MyCustomStep实现WorkflowProcess{
public void execute(WorkItem项、WorkflowSession wfsession、MetaDataMap参数)引发WorkflowException{
/*始终管理或服务工作流*/
最终字符串启动器=item.getWorkflow().getInitiator();
/*获取启动工作流的实际用户*/
最终字符串启动器=item.getWorkflowData().getMetaDataMap().get(“userId”,String.class);
/*获取工作流历史记录*/
最终列表历史记录=wfsession.getHistory(item.getWorkflow());
/*获取工作流历史记录中的第一项*/
最终HistoryItem firstItem=历史记录。获取(0);
/*获取参与最后一项的用户*/
最后一个字符串firstUser=firstItem.getUserId();
/*获取模拟会话*/
试一试{
Session userSession=wfsession.getSession().impersonate(新的SimpleCredentials(启动器,新字符[0]);
}catch(javax.jcr.LoginException e){
e、 printStackTrace();
}捕获(存储异常e){
e、 printStackTrace();
}
}
}

必须询问-您是否绝对确定启动工作流的不是管理员?例如,后端服务可以检索管理会话,并使用它来启动工作流。。。不是因为这样做是正确的,而是因为这样做“更简单”。@CptBartender是,因为
workItem.getWorkflow().getInitiator()
提供的用户与
session.getUserID()
不同。在这种情况下,您是否尝试过使用
session.impersonate(creds)
查看返回的管理会话,并查看是否可以获取用户会话?根据文件,这是可能的