How do I change user context in scripted field?

David Sumlin July 26, 2017

I have a scripted field which basically looks at a custom field on a different issue in a different project.  I want to have the scripted field run under a different user context since the logged in user won't have access to browse the source project.

Here's what I have so far:

 

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.web.bean.PagerFilter

def customFieldManager = ComponentAccessor.customFieldManager
def jqlQueryParser = ComponentAccessor.getComponent(JqlQueryParser)
def searchProvider = ComponentAccessor.getComponent(SearchProvider)

// get value from custom field on current issue
def myID = issue.getCustomFieldValue(customFieldManager.getCustomFieldObjectByName("Secret Project ID")).toString();

// this gets logged in user, but I need to change to a named user context
def user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()

// run jql to get the issue with same Secret Project ID
def query = jqlQueryParser.parseQuery("project= SECRET and 'Secret Project ID' ~ '${myID}'")
def issuesFound = searchProvider.search(query, user, PagerFilter.getUnlimitedFilter())

// there should only ever be one result, but just in case, only take first one
return issuesFound?.issues[0]?.summary


 

How can I have this run under a different named users context?

1 answer

1 accepted

0 votes
Answer accepted
Gaston Valente
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
July 26, 2017

Hi David,

Try if this works for you:


JiraAuthenticationContext authContext = ComponentAccessor.getJiraAuthenticationContext();
ApplicationUser origUser = authContext.getLoggedInUser();

try{

authContext.setLoggedInUser(ComponentAccessor.getUserManager().getUserByKey("admin"));

//do stuff

}catch(Exception e){
e.printStackTrace();
}finally {
authContext.setLoggedInUser(origUser);
}
David Sumlin July 26, 2017

That worked.  I'll be honest, I get confused a little between Java syntax and Groovy syntax.  Here's what I came up with:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.web.bean.PagerFilter

def customFieldManager = ComponentAccessor.customFieldManager
def jqlQueryParser = ComponentAccessor.getComponent(JqlQueryParser)
def searchProvider = ComponentAccessor.getComponent(SearchProvider)

// identify parameter for JQL and create JQL
def myID = issue.getCustomFieldValue(customFieldManager.getCustomFieldObjectByName("Secret Project ID")).toString();
def query = jqlQueryParser.parseQuery("project = SECRET and 'Secret Project ID' ~ '${myID}'")

// capture context of original user
def authContext = ComponentAccessor.getJiraAuthenticationContext()
def origUser = authContext.getLoggedInUser()

// switch context to named user
authContext.setLoggedInUser(ComponentAccessor.getUserManager().getUserByKey("different_user"))
def user = authContext.getLoggedInUser()

// search issues
def issuesFound = searchProvider.search(query, user, PagerFilter.getUnlimitedFilter())
def field = issuesFound?.issues[0]?.summary

// switch back to original user
authContext.setLoggedInUser(origUser);

return field

Suggest an answer

Log in or Sign up to answer
TAGS
AUG Leaders

Atlassian Community Events