<div dir="auto"><div>Hello,</div><div dir="auto"><p style=""> </p><p style="">Since my previous message, I managed to get a working, but not entirely satisfying, solution.</p><p style="">The root of my issue is that I am trying import user-role associations from a MSSQL Database to Midpoint. I am using the scriptedSQLConnector 1.1.2.0.em3 since there was no sample configuration/script for the 2.x version of the connector (any samples/help to migrate my connector is welcome BTW).</p><p style=""> </p><p style="">In my MSSQL database, the association between user and roles is done via a link table where each user can be linked to n roles. In order to import this into Midpoint, I tweaked my SQL query in the SearchScript to compute a list of comma separated roles linked to the user into a single column “roles”.</p><p style=""> </p><p style="">In the user schema in Midpoint, I added a new multi-valued attribute “role” :</p><p style=""> </p><p style=""><xsd:element name="role" minOccurs="0" maxOccurs="unbounded" type="xsd:string"></p><p style=""><xsd:annotation></p><p style=""><xsd:appinfo></p><p style=""><a:indexed>true</a:indexed></p><p style=""><a:displayName>Role</a:displayName></p><p style=""></xsd:appinfo></p><p style=""></xsd:annotation></p><p style=""></xsd:element></p><p style=""> </p><p style=""> </p><p style="">In the resource inbound mapping, I managed to map the list of comma separated roles into the multi-valued attribute “role” :</p><p style=""> </p><p style=""><attribute></p><p style=""><ref>ri:roles</ref></p><p style=""><displayName>Roles</displayName></p><p style=""><inbound></p><p style=""><expression></p><p style=""><script></p><p style=""><code></p><p style="">if (!basic.isEmpty(input))</p><p style="">{</p><p style="">input.tokenize(",")</p><p style="">}</p><p style=""></code></p><p style=""></script></p><p style=""></expression></p><p style=""><target></p><p style=""><path>$focus/extension/role</path></p><p style=""></target></p><p style=""><strength>strong</strength></p><p style=""></inbound></p><p style=""></attribute></p><p style=""> </p><p style="">In the user template, I added a mapping to automatically assign the roles from the role “attribute” to the corresponding Midpoint roles :</p><p style=""> </p><p style=""><item></p><p style=""><ref>assignment</ref></p><p style=""><mapping></p><p style=""><name>auto-assign-role</name></p><p style=""><authoritative>true</authoritative></p><p style=""><strength>strong</strength></p><p style=""><source></p><p style=""><path>extension/role</path></p><p style=""></source></p><p style=""><expression></p><p style=""><assignmentTargetSearch></p><p style=""><targetType>RoleType</targetType></p><p style=""><filter></p><p style=""><q:equal></p><p style=""><q:path>identifier</q:path></p><p style=""><expression></p><p style=""><script></p><p style=""><code></p><p style="">return role</p><p style=""></code></p><p style=""></script></p><p style=""></expression></p><p style=""></q:equal></p><p style=""></filter></p><p style=""></assignmentTargetSearch></p><p style=""></expression></p><p style=""><target></p><p style=""><c:path>assignment</c:path></p><p style=""></target></p><p style=""></mapping></p><p style=""></item></p><p style=""> </p><p style=""> </p><p style="">This works well, but I get the feeling this is still a workaround since I do not leverage the Midpoint concept of “association” between accounts and entitlements.</p><p style=""> </p><p style="">I tried the following association :</p><p style=""> </p><p style=""><association></p><p style=""><ref>ri:users_member_of_roles</ref></p><p style=""><kind>entitlement</kind></p><p style=""><intent>role</intent></p><p style=""><direction>subjectToObject</direction></p><p style=""><associationAttribute>ri:roles</associationAttribute></p><p style=""><valueAttribute>icfs:uid</valueAttribute></p><p style=""><tolerant>true</tolerant></p><p style=""></association></p><p style=""> </p><p style="">But of course, this does not work since my resource attribute “ri:roles” contains a list of comma separated roles, instead of a single value.</p><p style=""> </p><p style="">Is this the right approach? How could I make the Midpoint association work?</p><p style=""> </p><p style="">-Frederic</p><br><div class="gmail_quote" dir="auto"><div dir="ltr" class="gmail_attr">On Fri, Jun 26, 2020, 20:00 Frédéric Lohier <<a href="mailto:frederic@lohier.org" target="_blank" rel="noreferrer">frederic@lohier.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><pre style="">Hello,

In order to assign several roles from a single attribute value in a resource inbound mapping, I wrote the following inbound mapping in my resource, taking some hints from <a href="https://wiki.evolveum.com/display/midPoint/Scripting+Hooks" style="" rel="noreferrer noreferrer" target="_blank">https://wiki.evolveum.com/display/midPoint/Scripting+Hooks</a>, but I get the error “com.evolveum.midpoint.util.exception.ExpressionEvaluationException: No such property: modelContext for class”
<br>Am I on the correct path? Or is there a better way to do what I want?<br><br><attribute>
<ref>ri:my_attribute</ref>
<displayName>My attribute</displayName>
<inbound>
<expression>
<script>
<code>
import com.evolveum.midpoint.prism.delta.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
UserType user = (UserType) focus;
roleName = "My_Role"
role = midpoint.searchObjectByName(RoleType.class, roleName)
if (!midpoint.isDirectlyAssigned(role)) {
// The role is not assigned. Let's assign it. We need to construct a delta to do this
assignment = new AssignmentType();
roleTarget = new ObjectReferenceType();
roleTarget.setOid("00000-0000-0000-000-0000");
roleTarget.setType(RoleType.COMPLEX_TYPE);
assignment.setTargetRef(roleTarget);
assignmentDelta = prismContext.deltaFactory().container().createModificationAdd(UserType.F_ASSIGNMENT, UserType.class, assignment);
modelContext.getFocusContext().swallowToPrimaryDelta(assignmentDelta);
log.debug('test assignment  ' + assignmentDelta + ' of user ' + user.getName());
return  my_attribute;
}
</code>
</script>
</expression>
<target>
<path>$focus/extension/my_attribute</path>
</target>
<strength>strong</strength>
</inbound>
</attribute></pre></div>
</blockquote></div></div></div>