Как мне сделать безопасность в JSF?

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

 Matt Handy17 апр. 2012 г., 08:32
Правильно ли я прочитал комментарии о том, что награда уже обещана?
 Anonymoose18 апр. 2012 г., 03:28
Пожалуйста, прочтите часовую дискуссию с Вайпером, где я объяснил несколько вещей.
 quantum18 апр. 2012 г., 22:33
Рассматривали ли вы внешний модуль / каркас (например, Spring Security) или это не вариант?
 LuckyLuke17 апр. 2012 г., 12:07
@MattHandy Я даю награду с лучшим ответом. Меня очень интересует, как сделать более детальную безопасность, особенно в JSF, например, как вы прячете вещи от людей, у которых нет определенной роли, идентичности и т. Д. Также, как вы делаете это бэк-эндом.

Ответы на вопрос(4)

Решение Вопроса

на которые вы надеетесь не толькоexistOracle даже имеетполезный пост в блоге, подробно освещающий тему, в комплекте с примером кода.

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

The 0th problem: rough-grained, declarative security

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

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

Fine-grained security using Managed Beans

Первым решением здесь является использование модели абстракции, которая позволяет вам независимо определять роли пользователей в контексте каждого вызова метода JSF, что позволяет вам менять их местами по мере необходимости. В качестве бонуса, это позволяет вам определитьfiner-grained разрешения, так как такая схема позволяет вам определить ваши разрешенияper method вместо каждого представления, конечной точки или компонента. А если роли поменяются? Вам нужно только обновить модель разрешений в одном месте, вместо того, чтобы переходить к каждому из этих компонентов и менять их пользовательские определения.

вышеупомянутая статья здесь я расскажу гораздо подробнее, чем я хочу рассказать здесь, поэтому я настоятельно рекомендую прочитать сообщение в блоге. Но вынос здесь, чтобы сделать этоproperly, вы должны предоставитьboth an authentication stack and an annotation layer detailing permission roles, и они встретятся только там, где вы явно и намеренно соединили их.

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

Improvements

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

В конечном счете, в идеальном мире именно так следует определять безопасность вашего приложения. Ваши потребности могут варьироваться, и что-то осталось в небольших масштабах,simple, declarative security may be fine to meet your needs, В конце концов, именно поэтому он продолжает существовать.

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

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

<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>
 LuckyLuke14 апр. 2012 г., 22:15
Есть ли альтернативы? Также при использовании безопасности, управляемой контейнером, я вхожу в систему с for и публикую сообщения в j_security. Где бы вы инициализировали & quot; UserBean & quot; которая содержит информацию о текущем вошедшем в систему пользователе?
 14 апр. 2012 г., 22:17
Просто введите UserPrincipal в ваш бин. Это волшебство! Все это дело аутентификации / авторизации обрабатывается для вас контейнером.
 LuckyLuke14 апр. 2012 г., 22:19
Как бы вы скрыли определенные ссылки и т. Д., Если пользователь не вошел в систему? Или иметь правильную роль?
 14 апр. 2012 г., 22:14
Это одна из причин, по которой Facelets мне не по вкусу. Сопоставление проблем представлений с проблемами контроллеров облегчает выполнение простых и промежуточных операций. Я бы, вероятно, в итоге склеил две страницы в одну лицевую сторону, каждая часть защищена визуализированным атрибутом. У кого-нибудь есть лучший подход?
 LuckyLuke14 апр. 2012 г., 22:09
Как насчет этого: у меня есть страница с именемprofile.xhtml и параметр запроса с именемusername, Если пользователь идет вprofile.xhtml?username=Amanda и не вошел в систему как Аманда, он / она получит ограниченное представление профиля. Теперь вы бы это сделали? Имея эти проверки в коде представления или вы можете дать этому пользователю другое представление? Как будто у вас есть две страницы profile.xhtml. Или ... вы создаете страницу profile.xhtml, а затем используете теги Facelets (состав) и включаете содержимое представления профиля в зависимости от того, как пользователь вошел в систему? Какие есть варианты решения таких случаев?

образом, вам не нужно думать о том, что пользователь вошел в систему.

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

Вы можете прочитать об обоих (аутентификация, авторизация)на странице JAAS, Это также лучшая структура на мой взгляд. Это займет некоторое время, чтобы освоить, но после этого, это довольно легко, и вы даже поймете, что это совсем не тяжело -you're not forced to use every single feature, (так же, как EJB)

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

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

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

Кстати, ребята: я не повторяю, только что нашел интересный вопрос, так что ... не стесняйтесь бороться за награду :)

Ваш ответ на вопрос