0

JSF webapp で「自家製」のレルムを使用しています。

<Context docBase="senateurs" jndiExceptionOnFailedWrite="false" path="/senateurs" reloadable="true">
    <Resource auth="Container" description="Extraction des roles" maxActive="3" maxIdle="1" maxWait="60" name="jdbc/authSen" type="javax.sql.DataSource" validationQuery="select * from senateurs.qua"/>
    <Realm className="org.apache.catalina.realm.SenatLdapDataSourceRealm" dataSourceName="jdbc/authSen" instanceName="realm-senateurs" localDataSource="true" roleNameCol="rolcod" userNameCol="perlogldap" userRoleTable="senateurs.perrol"/>
</Context>

次の質問では、それは任意の領域である可能性があります。

このレルムにアクセスして、JSF Web アプリケーションでその構成プロパティを公開したいと考えています。

DataSource にアクセスするには、次の関数を使用できます。

public static BasicDataSource getDataSource(String dataSourceName) throws NamingException {
    InitialContext ic = new InitialContext();
    ic.createSubcontext("java:");
    ic.createSubcontext("java:comp");
    ic.createSubcontext("java:comp/env");
    String subContext = "java:comp/env";
    String[] split = dataSourceName.split("/");
    for(int i = 0 ; i < split.length -1 ; i++) {
        subContext += "/" + split[i];
        ic.createSubcontext(subContext);
    }
    return (BasicDataSource) ic.lookup("java:comp/env/" + dataSourceName);
}

ホスト構成で宣言されたレルムにアクセスするには、次を使用できます。

public static Realm getTomcatRealm() {
    try {
        MBeanServer mBeanServer = MBeanServerFactory.findMBeanServer(null).get(0);
        ObjectName name = new ObjectName("Catalina", "type", "Server");
        Server server = (Server) mBeanServer.getAttribute(name, "managedResource");
        Service service = server.findService("Catalina");
        Engine engine = (Engine) service.getContainer();
        Host host = (Host) engine.findChild(engine.getDefaultHost());
        return host.getRealm();
    } catch (MBeanException ex) {
        log.error("Erreur lors de l'accès a serveur Tomcat",ex);
    } catch (AttributeNotFoundException ex) {
        log.error("Erreur lors de l'accès a serveur Tomcat",ex);
    } catch (InstanceNotFoundException ex) {
        log.error("Erreur lors de l'accès a serveur Tomcat",ex);
    } catch (ReflectionException ex) {
        log.error("Erreur lors de l'accès a serveur Tomcat",ex);
    } catch (MalformedObjectNameException ex) {
        log.error("Erreur lors de l'accès a serveur Tomcat",ex);
    } finally {
        return null;
    }
}

webapp コンテキストで宣言されたレルムにアクセスするには、何を使用すればよいですか?

前もって感謝します。

4

2 に答える 2

1

まだインスタンスは見つかりませんでしたが、その属性にアクセスできます

public static Object getTomcatContextRealmAttribute(String attr) {
    try {
        MBeanServer mBeanServer = MBeanServerFactory.findMBeanServer(null).get(0);
        Set<ObjectInstance> realms = mBeanServer.queryMBeans(new ObjectName("Catalina:context=*,host=*,realmPath=*,type=*"), null);
        if(realms.size() != 1) {
            // unhandled case...
            return null;
        }
        return mBeanServer.getAttribute(realms.iterator().next().getObjectName(),attr);
    } catch (MalformedObjectNameException ex) {
        Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        return null;
    }
}

これは私のニーズに合っています。

于 2013-10-11T08:57:54.663 に答える
1

既に持っているコードに小さな拡張を加えたインスタンスを取得できます。

Context context = (Context) host.findChild("/senateurs");
return context.getRealm();
于 2013-10-11T17:19:30.540 に答える