Я провел весь день в Google Googling и рассматривал различные вопросы здесь, пытаясь найти лучшее решение для реализации аутентификации и авторизации. Сейчас я придумал часть решения, но надеюсь, что кто-то сможет заполнить пробелы. Я понимаю, что есть много текста ниже, но, пожалуйста, медведь со мной: O)JSF: аутентификация и авторизация, лучший путь вперед
фон
Я унаследовал часть завершена приложение CRM, которое в настоящее время использует JSF 2.0, JavaEE 6, JPA и PostgreSQL база данных. К сожалению, ребята, которые изначально приступили к созданию этого веб-приложения в своей бесконечной мудрости, решили, что лучше всего оставить аутентификацию/авторизацию до конца - я должен его вставить.
Приложение по существу разделено на три слоя - виды, управляемые бобы и DAO. Это означает, что управляемые компоненты особенно «жирны», поскольку они содержат всю логику бизнес-логики, валидации и навигации.
аутентификации/авторизации требования
- Формы проверки подлинности на основе проверки в отношении учетных данных, хранящихся в базе данных PostgreSQL.
- Единственная страница, которая будет общедоступной (анонимными пользователями), будет страницей входа в систему.
- Мне нужно предотвратить доступ к определенным областям приложения на основе роли пользователей. Например, только пользователи с ролью «Админ» должны иметь доступ к странице создания/редактирования пользователя.
- Мне также необходимо ограничить доступ к определенной области страницы. Например, пользователь с ролью «Торговый представитель» должен иметь возможность просматривать сведения о клиентах, но кнопка сохранения/редактирования должна отображаться только в том случае, если у пользователя есть роль «Служба обслуживания клиентов».
Где я в
Первое, что я планирую делать это следовать этому примеру User Authentication and Authorization using JAAS and Servlet 3.0 Login. Это, я считаю, выполнит мои первые 3 требования.
Чтобы показать/скрыть кнопки сохранения и т. Д. На страницах, я могу использовать технику, описанную в this SO answer. Это частично решит требование 4, однако я считаю, что мне все же необходимо обеспечить методы действий и/или управляемые компоненты. Например, я хотел бы иметь возможность добавить аннотацию или что-то к методу save() на компоненте клиента, чтобы гарантировать, что только пользователи с ролью «Служба обслуживания клиентов» могут вызвать это - вот где я начинаю сталкиваться с проблемами ,
Я предполагаю, что одним из вариантов было бы сделать что-то похожее на то, что я предлагаю сделать в представлении, и использовать facesContext, чтобы проверить, является ли текущий пользователь «в роли». Я не увлекаюсь этим, потому что он просто загромождает мой код и вместо этого будет использовать аннотации. Если бы я пошел по этому маршруту, как бы мне вернуть статус http 403?
Javax.annotation.security. * Аннотации, похоже, подходят для декларативно определенного доступа к областям приложения, однако, насколько я понимаю, их можно добавить только в EJB. Это означало бы, что мне нужно будет переместить всю мою бизнес-логику из управляемых компонентов, где она в настоящее время находится на новых EJB. Я думаю, что это будет иметь дополнительное преимущество: отделить бизнес-логику от своего собственного набора классов (делегатов, сервисов или всего, что вы решите называть их).Однако это был бы довольно большой рефактор, которому не удастся избежать отсутствия тестов на единицу или интеграции. Я не уверен, должна ли ответственность за контроль доступа быть на этом новом уровне обслуживания - я думаю, что это должно быть на управляемых компонентах.
Других альтернатив
В ходе моего исследования я нашел много людей, упоминая такие структуры, как Spring и пласты. У меня ограниченный опыт работы с Seam, я думаю, что это было бы хорошо подходит для этого проекта, и из того, что я помню, я считаю, что он решает вопросы авторизации, которые у меня есть, но я думаю, что это слишком поздно, чтобы представить его сейчас ,
Я также видел Сиро упоминается в разных местах. Посмотрев на 10 minute tutorial, это показалось хорошим подспорьем, особенно в сочетании с Deluan Quintao's taglib, но мне не удалось найти никаких учебных пособий или примеров того, как интегрировать его с веб-приложением JSF.
Другая альтернатива, с которой я столкнулся на удивление регулярно, - это обычное решение - это кажется сумасшедшим для меня!
Резюме
В общем то, я бы очень хотел некоторые рекомендации по ли я отправиться вниз правильный путь с точки зрения осуществления аутентификации и авторизации, и как я заполняю в этой отсутствующей части крепежного человека методы и/или управляемые компоненты (или, по меньшей мере, код, который они делегируют) и/или как я могу вручную возвращать HTTP Status 403.
> Я не смог найти никаких учебных пособий или примеров того, как их интегрировать с веб-приложением JSF. - Сейчас один, но он все еще не идеален: http://balusc.blogspot.com/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html –