2016-06-27 3 views
0

Для проверки прав доступа инициатора можно назвать session.checkPermission()AEM Workflow: Получить сеанс инициатора для проверки разрешений

Однако com.day.cq.workflow.WorkflowSession.getSession() возвращается всегда админы сессии, так что я не в состоянии проверить права доступа initator на данный узел.

Как я могу получить сеанс инициатора?

Update

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` 
+0

должен спросить - вы абсолютно уверены, что это не администратор, который инициировал рабочий процесс? Бэкэнд-сервисы могут, например, извлекать сеанс администратора и использовать его, помимо прочего, запускать рабочие процессы ... Не потому, что это правильно, а потому, что это «проще». – CptBartender

+0

@CptBartender Да так 'workItem.getWorkflow(). GetInitiator()' дает другой пользователь, чем 'session.getUserID()' – Quantum

+0

В этом случае, вы пытались с помощью 'session.impersonate (кредитки)' на вернулся сеанс администратора и посмотрел, можете ли вы получить сеанс пользователя? Согласно документации, это может быть возможно только с именем пользователя, хотя мне нужно было это сделать ... – CptBartender

ответ

3

Сначала, как @CptBartender упоминалось в комментариях, администратор должен иметь права на весь контент, или если вы, воспользовавшись Учетные записи службы, эта учетная запись службы должна иметь доступ к содержимому, которое необходимо обновить.

Инициатор всегда admin или workflow-service в новых версиях AEM, которые используют учетные записи службы Sling. Пользователь запрашивает начало рабочего процесса, а учетная запись администратора или службы запускает процесс. Если вы хотите найти пользователя, который начал работу, вы можете посмотреть в метаданных с помощью item.getWorkflowData().getMetaDataMap().get("userId", String.class). Обратите внимание, что данные соответствуют ресурсам, созданным в JCR по пути, аналогичному /etc/workflow/instances/server0/2016-06-13/update_asset_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(); 
     } 
    } 
} 
Смежные вопросы