Как я могу обеспечить безопасность в JSF?

Я использую Java EE 6 со всеми ссылочными реализациями. Сделав некоторые ограничения безопасности для некоторых страниц, таких как все под /secure/*. Это грубая защита. Что делать, если два пользователя имеют одни и те же роли, но некоторые данные одной и той же страницы должны быть видны только пользователю "Джон"? Или показать "Джон" совершенно другую страницу? У меня много вопросов, на которые я не ответил, поэтому было бы неплохо, если бы кто-нибудь мог предоставить некоторые ссылки/объяснения или книги, которые также охватывают это. Мне нужен более тонкий контроль безопасности.

Ответы

Ответ 1

Штукатурные функции безопасности, на которые вы надеетесь не только существовать, Oracle даже полезное сообщение в блоге, подробно посвященное теме, в комплекте с образцом кода.

И поскольку для меня было бы кратким и невежливым просто связать документы и запустить, что следует, это немного дискуссия о том, как это происходит вместе, насколько мне известно.

0-я проблема: грубая, декларативная безопасность

Самая большая проблема с декларативной безопасностью - заставляет вас итеративно определять все ваши роли пользователей во время разработки. Это крайне нежелательно по двум причинам: во-первых, это не позволяет правильно абстрагировать вашу модель безопасности от вашей реализации (неспособно адекватно будущий приложение и раскрытие уязвимых мест для раскрытия информации), а во-вторых, он привязывает ваши роли пользователей к непосредственному дизайну вашего приложения, обычно не предоставляет мелкомасштабных разрешений или ACL, когда они желательны или необходимы.

По сути, это проблема недостаточной абстракции. Вы используете систему, которая немедленно отвечает вашим текущим потребностям, но не такая, которую вы можете ожидать, чтобы быть работоспособной или поддерживаемой в течение жизненного цикла вашего приложения, поскольку роли становятся более сложными и сложность вашей базы кода неуклонно возрастает.

Мелкозернистая безопасность с помощью управляемого Beans

Решение первого порядка здесь заключается в использовании модели абстракции, которая позволяет вам определять роли пользователей независимо друг от друга в контексте каждого вызова метода JSF, позволяя вам поменять местами или выходить по мере необходимости. В качестве бонуса это позволяет вам определять более мелкие разрешения, так как такая схема позволяет вам определять ваши разрешения для каждого метода вместо каждого представления, для каждой конечной точки или для bean. А если роли меняются? Вам нужно обновить свою модель разрешений только в одном месте, вместо того, чтобы переходить к каждой из этих beans и заменять свои пользовательские определения.

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

Определение тонких вызовов метода и политики безопасности, которая имеет смысл, остается как упражнение для читателя, но если у вас есть вопросы в этой области, не стесняйтесь спрашивать их в комментариях или в наборе последующих действий поскольку эти вопросы по своей сути полезны широкой аудитории.

Улучшения

Можно предположить, что это решение недостаточно устойчиво для ваших нужд. Например, если вы хотите аутентифицировать пользователей, используя LDAP или Kerberos, чтобы обеспечить унифицированное представление ваших пользователей и ролей, это дает лишь частичное решение для удовлетворения ваших потребностей. Несколько отличный ресурсы существуют в этом домене, но это иначе оставлено в качестве упражнения для читателя.

Конечная вынос здесь, в идеальном мире, именно так должна определяться ваша безопасность приложений. Ваши потребности могут различаться, а для чего-то оставленного в небольшом масштабе простая декларативная безопасность может быть в порядке, чтобы удовлетворить ваши потребности. В конце концов, почему он продолжает существовать.

Но для больших приложений, которые должны безопасно и правильно удовлетворять потребности большого числа пользователей, это правильный путь. Для этого требуется немного больше знаний и накладных расходов, но это сэкономит вам массу времени, усилий и разочарования, если вы начнете делать это правильно.

Как всегда, удачи с вашим приложением.

Ответ 2

Самый простой подход -

<h:panelGroup rendered="#{request.userPrincipal.name == 'user1'}">
    <p>Content for user 1</p>
</h:panelGroup>
<h:panelGroup rendered="#{request.userPrincipal.name == 'user2'}">
    <p>Content for user 2</p>
</h:panelGroup>

Ответ 3

Показывать несколько версий одной и той же страницы не о безопасности (разная версия!= ссылки скрываются), ограничивая доступ и требуя дополнительной авторизации, я отвечу на это, если вы не возражаете.

Вы можете прочитать обо всех (аутентификация, авторизация) на странице JAAS. По моему мнению, это лучшая структура. Требуется некоторое время, чтобы освоить, но после этого это довольно легко, и вы даже поймете, что это не тяжелый вес - вы не должны использовать каждую отдельную функцию. (как EJB)

JAAS может регистрировать вас даже с помощью учетной записи ldap или windows, даже поддерживая несколько шагов аутентификации - вы можете реализовать pass + sms login. Вы можете это сделать даже с acegi, конечно (это просто не так просто)

Поскольку вы уже упоминали JSF, JAAS подходит еще лучше, чем acegi, вы можете аннотировать любую поддержку bean с помощью @RolesAllowed, и если пользовательский сеанс не соответствует требованиям, будет выведено SecurityException. Это работает для сервлетов и beans (ejb, backing), а не для jsps (однако это все равно не имеет смысла)

Вы можете прочитать @RolesAllowed здесь, но если вы уже это рассматриваете, не пропустите JBoss Seam Security - он построен поверх аннотаций безопасности и JAAS, а также довольно привыкает к использованию. Стоит читать.

Жесткие ребята: я не ребята, просто нашел интересный вопрос, поэтому... не стесняйтесь сражаться за щедрость:)

Ответ 4

Обычно этот вид контента будет храниться в переменных сеанса. Поэтому вам не нужно думать о том, что пользователь зарегистрировал.