我想创建一个自定义注释来装饰方法,这将限制对方法调用的访问。
我的注释定义如下:
@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()”)时,此调用将被拦截,并且该方法上设置的参数将与登录用户适当的 session 值。如果登录的用户 session 角色值足够高,则将允许调用托管 Bean 的方法,否则用户将被重定向或显示相应的消息。
我的问题是,有没有一种方法可以“ Hook ”到 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
我只是在寻找一些指导和一些可用的选项。感谢任何可以帮助我的人!
最佳答案
您可以通过实现自定义 ActionListener
来实现此目的已注册为全局<action-listener>
在 faces-config.xml
.
巧合的是,本周还有人提出并回答了同样的问题:Custom Annotation JSF 。请注意,特定目的不需要 JAAS,只需获取 User
来自 FacesContext
的 session 通常的方式。
关于java - 在 JSF 2.0 中使用自定义 java 注释进行托管 Bean 方法授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10722016/