Tomcat: реализация java.security.Principal - PullRequest
3 голосов
/ 08 мая 2009

Я пытаюсь создать собственное царство в Tomcat. Моя проблема заключается в том, что в рамках платформы есть SessionAttributeListener, который проверяет, является ли какой-либо объект, добавленный в сеанс, сериализуемым, а если нет, вызывает проблемы ... например, делает сеанс недействительным.

Поскольку org.apache.catalina.realm.GenericPrincipal не сериализуем, я попытался написать свой собственный класс, который реализует Principal и Serializable. Это, кажется, хорошо, за исключением, если затем попытаться использовать

request.isUserInRole("user")

Я получаю false за это и за любую другую роль, которую должен иметь пользователь. Если я заменю GenericPrincipal на CustomPrincipal в своем классе Valve, он возвращает true. Итак, мой вопрос:

  1. Что является причиной ложного возврата?
  2. Как использовать собственный класс вместо GenericPrincipal?
  3. Могу ли я это сделать?

Edit: Просто чтобы прояснить, я фактически уже реализовал это. Код в CustomPrincipal точно такой же, как GenericPrincipal, за исключением того, что он также реализует Serializable. request.isUserInRole ("user") возвращает false, когда в моем Valve у меня есть:

request.setUserPrincipal(new CustomPrincipal(args...));

но не когда я

request.setUserPrincipal(new GenericPrincipal(args...));

Любой вызов request.getUserPrincipal () вернет CustomPrincipal, когда я использую этот класс.

1 Ответ

1 голос
/ 08 мая 2009

Вы должны дать нам больше контекста. Но обратите внимание, что Принципал должен быть абстрактным в любом случае; KerberosPrincipal, например, реализует как Principal, так и Serializable, поэтому есть некоторый способ сделать это.

Что isUserInRole делает - это оборачивает запрос к реализующему классу, чтобы посмотреть, действительно ли пользователь - идентифицированный Pricipal - в этой роли. Поэтому я думаю, что первым делом можно вызвать getUserPrincipal и посмотреть, что сервлет считает текущим принципалом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...