Получить список определенных ролей в java ee 5

Мне было интересно, можно ли получить полный список ролей безопасности, определенных в файле web.xml в java-коде? И если да, то как это сделать?

Мне известен метод isUserInRole, но я также хочу обрабатывать случаи, когда роль запрошена, но не определена (или написана иначе) в файле web.xml.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
1 076
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Насколько мне известно, в API сервлетов это невозможно сделать. Однако вы можете напрямую проанализировать web.xml и самостоятельно извлечь значения. Я использовал dom4j ниже, но вы можете использовать все, что вам нравится, для обработки XML:

protected List<String> getSecurityRoles() {
    List<String> roles = new ArrayList<String>();
    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();

        // Type safety warning:  dom4j doesn't use generics
        List<Element> roleElements = webApp.elements("security-role");
        for (Element roleEl : roleElements) {
            roles.add(roleEl.element("role-name").getText());
        }
    } catch (DocumentException e) {
        e.printStackTrace();
    }

    return roles;
}

Жаль, что контейнер не предлагает никакой возможности получить эту информацию, но это кажется прекрасным обходным решением. Спасибо!

Jasper 06.10.2008 01:58

Вот версия ответа Яна с использованием более нового DOM API:

private List<String> readRoles() {
    List<String> 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 <role-name> 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;
}

Другие вопросы по теме