1

CQ5 のユーザー認証を行うためのリモート システムが必要です。パス上の AuthenticationHandler が進むべき方向だと思います。もしそうなら、AuthenticationHandler は一般的にどのように機能しますか。また、CQ5 では、カスタム AuthenticationHandler をどのように実装しますか? OSGi バンドル (またはフラグメント バンドル) にして CQ5 にインストールするにはどうすればよいですか?

可能であれば、OSGi マニフェストを含むコード サンプルを歓迎します。

4

2 に答える 2

2

Sling AuthenticationHandler がどのように機能するかについての説明は、こちら にあります。また、例としてSling FormAuthenticationHandlerソースを確認することもできます。OSGi 構成の詳細は、プロジェクトのPOM ファイルの maven-bundle-plugin の構成で確認できます。

パスワードの確認またはユーザー アカウントの同期のみが必要な場合は、カスタム CQ5 LoginModuleを使用できます。

于 2013-02-28T10:30:05.030 に答える
1

まず、jackrabbit AbstractLoginModule http://jackrabbit.apache.org/api/2.4/org/apache/jackrabbit/core/security/authentication/AbstractLoginModule.htmlを調べることから始めます。

作成されたカスタム ソリューション/フラグメント バンドルの例がありますが、多くの部分があります。Gigya (ソーシャル ネットワーク ログイン) のものを実装していました。

MyAbstractLoginModule を実装する他のいくつかのクラスがあります。必要に応じて、さらに掘り下げて、より多くの例を入手できます。うまくいけば、これで正しい道を歩み始めることができます。

public abstract class MyAbstractLoginModule extends AbstractLoginModule {
    static private final Logger logger = LoggerFactory.getLogger(MyAbstractLoginModule.class);
    protected Session session;
    protected UserManager userManager;
    protected ValueFactory valueFactory;
    protected long tokenExpiration = 7200000L;

    @Override
    public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {
        if (options.containsKey("tokenExpiration")) {
            try {
                this.tokenExpiration = Long.parseLong(options.get("tokenExpiration").toString());
                logger.debug("- Token expiration -> '" + this.tokenExpiration + "'");
            } catch (NumberFormatException e) {
                logger.warn("Unabled to parse token expiration: ", e);
            }
        }
        super.initialize(subject, callbackHandler, sharedState, options);
    }

    /**
    * Initiates the login module
    *
    * @param ch
    * @param ses
    * @param map
    * @throws LoginException
    */
    @Override
    protected void doInit(CallbackHandler ch, Session ses, Map map) throws LoginException {
        logger.trace("doInit");

        SessionImpl session = (SessionImpl) ses;

        try {
            this.session = session;
            this.userManager = session.getUserManager();
            this.valueFactory = session.getValueFactory();
        } catch (RepositoryException e) {
            throw new LoginException("Unable to retrieve principal editor: " + e.toString());
        }
    }

    /**
    * Impersonates users
    *
    * @param prncpl
    * @param c
    * @return
    * @throws RepositoryException
    * @throws LoginException
    */
    @Override
    protected boolean impersonate(Principal prncpl, Credentials c) throws RepositoryException, LoginException {
        Authorizable authrz = this.userManager.getAuthorizable(principal);
        if ((authrz == null) || (authrz.isGroup())) {
            return false;
        }
        Subject impersSubject = getImpersonatorSubject(credentials);
        User user = (User) authrz;
        if (user.getImpersonation().allows(impersSubject)) {
            return true;
        }
        throw new FailedLoginException("attempt to impersonate denied for " + principal.getName());
    }

    @Override
    protected boolean isPreAuthenticated(Credentials creds) {
        return false;
    }
}
于 2013-03-06T23:42:37.680 に答える