AEM:如何获取管理资源解析器,因为 getAdministrativeResourceResolver(Map<String,Object> authenticationInfo) 已被弃用?

AEM: How to get administrative resource resolver, since getAdministrativeResourceResolver(Map<String,Object> authenticationInfo) is deprecated?

我必须获得行政胜利org.apache.sling.api.resource.ResourceResolver

但是 API、ResourceResolverFactory.getAdministrativeResourceResolver(Map<String,Object> authenticationInfo) 被贬低了。

在 AEM 中创建一个具有正确权限的用户。
使用以下代码,用户的 usernamepassword 被外部化。 password 受 AEM 的默认加密支持保护。

@Component(immediate = true, metatype = true, label = "Configuration Details")
@Service(value = { MyResourceResolver.class })
@Properties({
    @Property(label = "Username", name = "username", description = "Username"),
    @Property(label = "Password", name = "password", description = "Password for the above user (Use crypto support)"),
})
public class MyResourceResolver {       
    @Reference
    private ResourceResolverFactory resourceFact;

    @Reference
    private CryptoSupport cryptoSupport;

    private String username;
    private String password;

    public ResourceResolver getUserResourceResolver() throws LoginException{
        Map<String,Object> authenticationInfo = new HashMap<>(2);
        authenticationInfo.put(ResourceResolverFactory.USER, username);
        String unprotectedPass;
        try {
            unprotectedPass = cryptoSupport.unprotect(password);
        } catch (CryptoException e) {
            unprotectedPass = password;
            log.error(e.getMessage());
        }
        authenticationInfo.put(ResourceResolverFactory.PASSWORD, unprotectedPass.toCharArray());
        return resourceFact.getResourceResolver(authenticationInfo);
    }

    @Activate
    protected void activate(Map<String, Object> mapCreated) {
        log.info("Configuration Map");
        username = mapCreated.get("username").toString();
        password = mapCreated.get("password").toString();
    }

    @Modified
    protected void modified(Map<String, Object> mapModified) {
        log.info("Configuration Modified");
        username = mapModified.get("username").toString();
        password = mapModified.get("password").toString();
    }
}

@Dileepa 的解决方案可行,但绝对不是硬编码密码的好做法,而且,防止过度使用管理 resourceresolvers/sessions。

查看 sling 文档中提到的 here 实现。

我们添加了以下配置:

\apps\qwerty\configs\config\org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.xml


<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
    jcr:primaryType="sling:OsgiConfig"
    user.default="admin"
    user.mapping="[com.adobe.granite.oauth.server=oauthservice,com.adobe.granite.oauth.server:authentication-handler=admin,com.day.cq.cq-search-suggest=suggestionservice,com.adobe.cq.social.cq-social-scoring:utility-reader=admin,com.adobe.cq.social.cq-social-commons-oauth:user-reader=admin,com.adobe.cq.social.cq-social-calendar:ugc-writer=admin,com.adobe.cq.social.cq-social-forum:ugc-reader=admin,com.adobe.cq.social.cq-social-group:user-admin=admin,org.apache.sling.scripting.core:workflow-launcher=admin,com.adobe.cq.social.cq-social-storage:ugc-writer=admin,com.adobe.cq.social.cq-social-messaging:utility-reader=admin,com.adobe.cq.social.cq-social-commons-oauth:ugc-writer=admin,com.adobe.cq.social.cq-social-messaging:ugc-writer=admin,com.adobe.cq.social.cq-social-journal:ugc-writer=admin,com.adobe.cq.social.cq-social-forum:workflow-launcher=admin,com.adobe.cq.social.cq-social-commons:utility-reader=admin,com.adobe.cq.social.cq-social-commons:user-reader=admin,com.adobe.cq.social.cq-social-console:communities-user-admin=admin,com.adobe.cq.social.cq-social-ugcbase:utility-reader=admin,com.adobe.cq.social.cq-social-as-provider:ugc-writer=admin,com.adobe.cq.social.cq-social-blog:ugc-writer=admin,com.adobe.cq.social.cq-social-forum:ugc-writer=admin,com.adobe.cq.social.cq-social-ugcbase:ugc-writer=admin,com.adobe.cq.social.cq-social-commons:ugc-writer=admin,com.adobe.cq.social.cq-social-commons:workflow-launcher=admin,com.adobe.cq.social.cq-social-commons-oauth:user-admin=admin,com.adobe.cq.social.cq-social-messaging:user-reader=admin,com.adobe.cq.social.cq-social-handlebars:utility-reader=admin,com.adobe.cq.social.cq-social-tally:ugc-writer=admin]"/>

或者您可以使用 /sysem/console/configMgrApache Sling Service User Mapper Service 配置它:

现在要获得 ResourceResolver 服务,我们需要 运行 以下方法:

resolverFactory.getServiceResourceResolver(null);