Почему я должен использовать JAAS для защиты от рук?

У меня была рукописная безопасность, простой сервлет-фильтр, который перенаправляет неавторизованный пользователь на свои страницы входа. Контроллер входа перенаправляет их на запрошенный URL после успешной аутентификации или на своей главной странице. Этот подход работает отлично, единственный недостаток, что я должен передать объект User, который хранится в HttpSession через stacktrace для EJB beans.

Теперь я переписал некоторый код и использовал Spring -security как аутентификацию на основе http. Он автоматически интегрируется с Glassfish JAAS.

Мне больше не нужно пропускать пользователя через stacktrace, достаточно вызова sessionContext.getCallerPrincipal(). Но главный объект возвращает мне только userName, а не userId, поэтому мне нужно выполнить добавление, если мне нужно userId, например.

1) Есть ли способ расширить объект Principal, чтобы он мог хранить больше свойств?

2) Почему я должен использовать JAAS или Spring Безопасность или другую инфраструктуру безопасности, почему бы не просто обработать сервлет-фильтр вручную?

Ответы

Ответ 1

2) Использование стандартного механизма безопасности, такого как JAAS, имеет много преимуществ:

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

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

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

  • Это сэкономит вам время и силы. JAAS обеспечивает аутентификацию и авторизацию, аккуратно упакованную и настраиваемую в течение нескольких минут.

  • Я рекомендую читать дальше безопасность J2EE или вы можете найти больше ресурсов в OWASP.

Ответ 2

1) Я не знаю, можно ли расширить класс Principal. Но обратите внимание, что в LoginModule перед завершением аутентификации вызывается commit() (возможно, в login()), можно добавить учетные данные в Subject. Для этого просто добавьте объект в один из списков: Subject. getPrivateCredentials() или Subject. getPublicCredentials() (без аргументов). Вы можете добавить много объектов, таких как ваш собственный класс, String или что угодно.

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

import javax.security.jacc.PolicyContext;

Subject subject = (Subject) PolicyContext.getContext("javax.security.auth.Subject.container");