2 Stimmen

Abrufen der Liste der definierten Rollen in Java EE 5

Ich frage mich, ob es möglich wäre, die vollständige Liste der Sicherheitsrollen, die in einer web.xml-Datei definiert sind, im Java-Code abzurufen? Und wenn ja, wie mache ich das?

Ich kenne die Methode 'isUserInRole', aber ich möchte auch Fälle behandeln, in denen eine Rolle angefordert wird, die in der web.xml-Datei nicht definiert ist (oder falsch geschrieben wurde).

2voto

Ian McLaird Punkte 5389

Soweit ich weiß, gibt es keine Möglichkeit, dies innerhalb der Servlet-API zu tun. Sie können jedoch web.xml direkt analysieren und die Werte selbst extrahieren. Ich habe unten dom4j verwendet, aber Sie können verwenden, was auch immer XML-Verarbeitungsmethoden Sie bevorzugen:

protected List getSecurityRoles() {
    List roles = new ArrayList();
    ServletContext sc = this.getServletContext();
    InputStream is = sc.getResourceAsStream("/WEB-INF/web.xml");

    try {
        SAXReader reader = new SAXReader();
        Document doc = reader.read(is);

        Element webApp = doc.getRootElement();

        // Typsicherheitswarnung: dom4j verwendet keine Generika
        List roleElements = webApp.elements("security-role");
        for (Element roleEl : roleElements) {
            roles.add(roleEl.element("role-name").getText());
        }
    } catch (DocumentException e) {
        e.printStackTrace();
    }

    return roles;
}

0 Stimmen

Leider bietet der Container keine Möglichkeit, diese Informationen zu erhalten, aber das scheint wie eine gute Lösung zu sein. Danke!

0voto

Foyta Punkte 500

Hier ist die Version von Ians Antwort mit der Verwendung der neueren DOM-API:

private List readRoles() {
    List roles = new ArrayList<>();
    InputStream is = getServletContext().getResourceAsStream("/WEB-INF/web.xml");

    try {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(new InputSource(is));

        NodeList securityRoles = doc.getDocumentElement().getElementsByTagName("security-role");
        for (int i = 0; i < securityRoles.getLength(); i++) {
            Node n = securityRoles.item(i);
            if (n.getNodeType() == Node.ELEMENT_NODE) {
                NodeList roleNames = ((Element) n).getElementsByTagName("role-name");
                roles.add(roleNames.item(0).getTextContent().trim()); // lets's assume that  is always present
            }
        }
    } catch (ParserConfigurationException | SAXException | IOException e) {
        throw new IllegalStateException("Exception while reading security roles from web.xml", e);
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                logger.warn("Exception while closing stream", e);
            }
        }
    }

    return roles;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X