Tomcat:实现java.security.Principal

时间:2009-05-07 20:36:28

标签: java tomcat java-ee authentication

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

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

request.isUserInRole("user")

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

  1. 造成错误回报的原因是什么?
  2. 如何使用自己的类而不是GenericPrincipal?
  3. 我甚至可以这样做吗?
  4. 修改 为了清楚起见,我实际上已经实现了这一点,CustomPrincipal中的代码与GenericPrincipal完全相同,除了它还实现了Serializable。 request.isUserInRole(“user”)在我的Valve中有的时候返回false:

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

    但不是我做的时候

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

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

1 个答案:

答案 0 :(得分:1)

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

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