java - 在 JSF 2.0 中使用自定义 java 注释进行托管 Bean 方法授权

标签 java security jakarta-ee jsf-2 annotations

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

我的注释定义如下:

@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/

相关文章:

mysql - 未设置将 MySQL 数据库连接到 Glassfish 类路径或类名错误

java - 使用 BoneCP : Handling connections from the pool

java - 通过从存储库函数 jpa ,java 中排除多列(AND)中的特定值来进行过滤

正则表达式

jakarta-ee - 如何找出 websphere 使用的 Java EE 规范版本?

windows - 从软件中调用防病毒程序来扫描内存中的图像

security - 如何限制对 OpenGrok 结果的访问?

java - 有人可以对 Dagger 2 提供一个很好的解释吗?

java - 在没有Servlet容器的情况下使用CDI

asp.net - Entity Framework 4.0 扩展和安全性