我正在尝试在 Tomcat 中创建自定义领域。我的问题是有一个 SessionAttributeListener 作为框架的一部分,它检查添加到 session 中的任何对象是否是可序列化的,如果不是,它会导致问题......比如使 session 无效。
因为 org.apache.catalina.realm.GenericPrincipal 不可序列化,我尝试编写自己的类来实现 Principal 和 Serializable。这似乎没问题,除非尝试使用
request.isUserInRole("user")
为此,我得到了 false,以及用户应该拥有的任何其他角色。如果我在我的 Valve 类中将 GenericPrincipal 换成 CustomPrincipal,它会返回 true。所以我的问题是:
- 导致虚假返回的原因是什么?
- 如何使用我自己的类而不是 GenericPrincipal?
- 我能做到吗?
编辑: 明确一点,我实际上已经实现了这一点,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/