Когда вы используете Модуль входа в систему JAAS вне области действия контейнера (или, по крайней мере, в манере, неузнаваемой для контейнера), контейнер не будет знать о том факте, что Субъект и набор Принципалов (связанных сsubject) должны храниться и управляться контейнером.
Когда вы используете одну из схем аутентификации, управляемой контейнером, контейнер фактически сохраняет субъект в классе реализации Session (по крайней мере, в Tomcat 6 этоправда), способом, который полностью непрозрачен для разработчика;использование getAttribute()
в объекте сеанса никогда не вернет субъекта, и ни один из них не может использовать setAttribute()
для переопределения субъекта.При необходимости субъект извлекается из этого поля сеанса и используется контейнером для различных целей;например, когда вы вызываете getUserPrincipal()
или getRemoteUser()
для объекта HttpServletRequest
, субъект, связанный с субъектом, фактически используется для возврата результата.
Если вам нужно, чтобы контейнер выполнял всеэто тяжело для вас, тогда вам нужно использовать модуль входа в систему JAAS вместе со схемой управляемой контейнером аутентификации.Если вы не хотите идти по этому пути, тогда вам нужно «запомнить» тему и принципы на время сеанса;не забывайте, все это должно быть сделано безопасным способом.