2

我想创建一个自定义注释来装饰限制对方法调用的访问的方法。

我的注释定义如下:

@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Restrict {
   public enum RoleType {All, ROLE_A, ROLE_B, ROLE_C, ROLE_D}
   String roleLevel();
   RoleType roleType();
}

然后使用如下注释。注释接收两个参数,一个是所需的最低角色类型,另一个是所需的最低角色级别。

@Restrict(roleType = RoleType.ALL, roleLevel="user")
String deleteSomething() {
  // delete intended whatever
  return success;
}

我的意图是,当对使用此注释修饰的托管 Bean 方法的任何调用发生时,如上述方法“deleteSomething()”中所述,此调用将被拦截,并将方法上设置的参数与登录的参数进行比较用户适当的会话值。如果登录的用户会话角色值足够高,则允许调用 Managed Bean 的方法,否则将重定向用户或显示适当的消息。

我的问题是,有没有一种方法可以“挂钩”到被 bing 调用的方法,然后通过反射,查看方法上是否有 @Restrict 注释,然后处理所述注释。我已经尝试在 PhaseListener 类中执行此操作,但我不确定如何找出调用什么托管 Bean 来执行反射。我读过有关客户 ElResolver 的信息,但我不确定这是否对我有帮助。我还尝试找到一种方法来简单地创建一个侦听器,该侦听器以某种方式知道何时调用了带有 @Restrict 注释的方法。

Environment Specifics:

Tomcat 6.0.35 (considering upgrading to Tomcat 7.0.27)
JSF version 2.1.7
RichFaces 4.1.0

我只是在寻找一些指导和一些可供我使用的选项。感谢任何可以帮助我的人!

4

1 回答 1

2

您可以通过实现ActionListener一个<action-listener>faces-config.xml.

巧合的是,本周有人问并回答了同样的问题:Custom Annotation JSF。请注意,特定目的不需要 JAAS,只需通过通常的方式User从会话中获取。FacesContext

于 2012-05-23T16:48:57.683 回答