{"id":16456,"date":"2014-12-22T16:22:56","date_gmt":"2014-12-22T10:52:56","guid":{"rendered":"http:\/\/www.tothenew.com\/blog\/?p=16456"},"modified":"2014-12-22T16:22:56","modified_gmt":"2014-12-22T10:52:56","slug":"access-content-repository-via-getserviceresourceresolver-in-aem6sling7","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/access-content-repository-via-getserviceresourceresolver-in-aem6sling7\/","title":{"rendered":"Access Content Repository via getServiceResourceResolver() in AEM6\/Sling7"},"content":{"rendered":"<p>JCR Sessions and Sling Based Authentication are always the important in code where someone\u00a0need to get an access of the Content Repository. But this same way to get an access over content repository was remains controversial due to its administrative privileges . So with the new AEM6 version below methods have been deprecated to get an access of admin sessions which can cause the security vulnerabilities :<\/p>\n<p>1) ResourceResolverFactory.getAdministrativeResourceResolver<br \/>\n2) ResourceProviderFactory.getAdministrativeResourceProvider<br \/>\n3) SlingRepository.loginAdministrative<\/p>\n<p>Latest release of Sling provide an alternative to access the repository without using admin session via Service Based Authentication. In Service Based authentication each service will bind to specific set of users which will have different access privileges. These users also refer as the service users. Below is the implementation steps of service based authentication .<\/p>\n<p>Step 1 : Create two users with different access privileges, gives one to read and other to read\/write.<br \/>\nStep 2 : Create two services which try to write some property inside node :<\/p>\n<p>WriteOpService<\/p>\n<p>[java]<br \/>\n@Service<br \/>\n@Component(immediate = true)<br \/>\npublic class WriteOpServiceImpl implements WriteOpService{<br \/>\n    private final Logger logger = LoggerFactory.getLogger(WriteOpServiceImpl.class);<br \/>\n    @Reference<br \/>\n    private ResourceResolverFactory resolverFactory;<br \/>\n    @Override<br \/>\n    public void writePropToNode(String resourcePath) {<br \/>\n        Map&lt;String, Object&gt; serviceParams = new HashMap&lt;String, Object&gt;();<br \/>\n        serviceParams.put(ResourceResolverFactory.SUBSERVICE, &quot;writeService&quot;);<br \/>\n        ResourceResolver resolver = null;<br \/>\n        try {<br \/>\n            resolver = resolverFactory.getServiceResourceResolver(serviceParams);<br \/>\n            logger.info(resolver.getUserID());<br \/>\n            Resource res = resolver.getResource(resourcePath+&quot;\/jcr:content&quot;);<br \/>\n            logger.info(&quot;Path is ::: &quot;+res.getPath());<br \/>\n            ModifiableValueMap modMap = res.adaptTo(ModifiableValueMap.class);<br \/>\n            if(modMap != null){<br \/>\n                modMap.put(&quot;propname&quot;, &quot;propValue&quot;);<br \/>\n                resolver.commit();<br \/>\n                logger.info(&quot;Successfully saved&quot;);<br \/>\n            }<br \/>\n        } catch (Exception e) {<br \/>\n            logger.error(&quot;Exceptions is ::: &quot;,e);<br \/>\n        }finally{<br \/>\n            if(resolver != null){<br \/>\n                resolver.close();<br \/>\n            }<br \/>\n        }<br \/>\n    }[\/java]<\/p>\n<p>ReadOpService :<\/p>\n<p>[java]<br \/>\n@Service<br \/>\n@Component(immediate = true)<br \/>\npublic class ReadOpServiceImpl implements ReadOpService {<\/p>\n<p>    private final Logger logger = LoggerFactory.getLogger(ReadOpServiceImpl.class);<\/p>\n<p>    @Reference<br \/>\n    private ResourceResolverFactory resolverFactory;<\/p>\n<p>    @Override<br \/>\n    public void readPropFromNode(String resourcePatb) {<br \/>\n        Map&lt;String, Object&gt; serviceParams = new HashMap&lt;String, Object&gt;();<br \/>\n        serviceParams.put(ResourceResolverFactory.SUBSERVICE, &quot;readService&quot;);<br \/>\n        ResourceResolver resolver = null;<br \/>\n        try {<br \/>\n            resolver = resolverFactory.getServiceResourceResolver(serviceParams);<br \/>\n            logger.info(resolver.getUserID());<br \/>\n            Resource res = resolver.getResource(resourcePatb+&quot;\/jcr:content&quot;);<br \/>\n            logger.info(&quot;Path is ::: &quot;+res.getPath());<br \/>\n            ModifiableValueMap modMap = res.adaptTo(ModifiableValueMap.class);<br \/>\n            if(modMap != null){<br \/>\n                modMap.put(&quot;propname&quot;, &quot;propValue&quot;);<br \/>\n                resolver.commit();<br \/>\n                logger.info(&quot;Successfully saved&quot;);<br \/>\n            }<br \/>\n        } catch (Exception e) {<br \/>\n            logger.error(&quot;Exceptions is ::: &quot;,e);<br \/>\n        }finally{<br \/>\n            if(resolver != null){<br \/>\n                resolver.close();<br \/>\n            }<br \/>\n        }<br \/>\n    }<br \/>\n[\/java]<\/p>\n<p>Step 3 : Configure the Apache Sling Service User Mapper service via Felix Console as below:<\/p>\n<p><a href=\"\/blog\/wp-ttn-blog\/uploads\/2014\/12\/console.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-16459\" src=\"\/blog\/wp-ttn-blog\/uploads\/2014\/12\/console-300x74.png\" alt=\"console\" width=\"300\" height=\"74\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2014\/12\/console-300x74.png 300w, \/blog\/wp-ttn-blog\/uploads\/2014\/12\/console-1024x255.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2014\/12\/console.png 1148w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Syntax will be \u00a0: <strong>[bundle-symbolic-name]:[subServiceName]=[Service-User]\u00a0<\/strong><\/p>\n<p>Step 4 : Create some authering stuff, in such a way we will pass the page path then on submit, property propname with value propValue\u00a0will be set to the page.<br \/>\nStep 5 : Below is the sample associated component script :<\/p>\n<p>[java]&lt;%@include file=&quot;\/libs\/foundation\/global.jsp&quot;%&gt;<br \/>\n&lt;%@page session=&quot;false&quot; %&gt;<br \/>\n&lt;% String prop = properties.get(&quot;pagePath&quot;,&quot;&quot;);<br \/>\ncom.aem.services.WriteOpService writeOpService = sling.getService(com.aem.services.WriteOpService.class);<br \/>\ncom.aem.services.ReadOpService readOpService = sling.getService(com.aem.services.ReadOpService.class);<br \/>\n\/\/readOpService.readPropFromNode(prop);<br \/>\nwriteOpService.writePropToNode(prop); %&gt;<br \/>\n[\/java]<\/p>\n<p>If we look both the services they are performing the write operation but in the success will depends on via which user you logged in &amp; which operation you call, as different services are associated with different service users. Refer the below link for further information :<br \/>\n<a href=\"https:\/\/cwiki.apache.org\/confluence\/display\/SLING\/Service+Authentication\">https:\/\/cwiki.apache.org\/confluence\/display\/SLING\/Service+Authentication<\/a><\/p>\n<p>Vivek Dhiman<\/p>\n","protected":false},"excerpt":{"rendered":"<p>JCR Sessions and Sling Based Authentication are always the important in code where someone\u00a0need to get an access of the Content Repository. But this same way to get an access over content repository was remains controversial due to its administrative privileges . So with the new AEM6 version below methods have been deprecated to get [&hellip;]<\/p>\n","protected":false},"author":128,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":2},"categories":[1],"tags":[1581,1580,1360],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/16456"}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/128"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=16456"}],"version-history":[{"count":0,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/16456\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=16456"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=16456"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=16456"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}