java - Tomcat:实现 java.security.Principal

标签 java tomcat jakarta-ee authentication

我正在尝试在 Tomcat 中创建自定义领域。我的问题是有一个 SessionAttributeListener 作为框架的一部分,它检查添加到 session 中的任何对象是否是可序列化的,如果不是,它会导致问题......比如使 session 无效。

因为 org.apache.catalina.realm.GenericPrincipal 不可序列化,我尝试编写自己的类来实现 Principal 和 Serializable。这似乎没问题,除非尝试使用

request.isUserInRole("user")

为此,我得到了 false,以及用户应该拥有的任何其他角色。如果我在我的 Valve 类中将 GenericPrincipal 换成 CustomPrincipal,它会返回 true。所以我的问题是:

  1. 导致虚假返回的原因是什么?
  2. 如何使用我自己的类而不是 GenericPrincipal?
  3. 我能做到吗?

编辑: 明确一点,我实际上已经实现了这一点,CustomPrincipal 中的代码与 GenericPrincipal 完全相同,除了它还实现了 Serializable。 request.isUserInRole("user") 在我的 Valve 中返回 false 我有:

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

但不是当我这样做

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

当我使用该类时,对 request.getUserPrincipal() 的任何调用都将返回 CustomPrincipal。

最佳答案

您需要为我们提供更多背景信息。但是请注意,无论如何,Principal 都是抽象的;例如,KerberosPrincipal 同时实现了 Principal 和 Serializable,因此有一些方法可以做到这一点。

什么是 UserInRole 是将请求包装到实现类以查看用户 - 由 Pricipal 标识 - 是否真的在那个角色中。所以我认为第一件事可能是调用 getUserPrincipal 并查看 servlet 认为当前的 Principal 是什么。

关于java - Tomcat:实现 java.security.Principal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/836889/

相关文章:

java - JRadioButton 及其上的操作

java - 从 JSON 响应中获取一半数据

java - tomcat上的多个应用

spring - 我们什么时候需要在容器中运行 Java 应用程序?

java - 父线程在它们退出 servlet 容器之前是否等待子线程退出?

java - 正则表达式删除除括号内的所有注释

java - 如何定义必须在接口(interface)内重写的常量?

java - 有没有办法在java中确定应用程序服务器名称

tomcat - Tomcat6 在哪里处理这个 GET 请求?

jakarta-ee - 在 JAX-RS REST 服务应用程序中包含 JPA 项目