当前位置: 首页 > 知识库问答 >
问题:

JSF CDI@Named+isAnnotationPresent+@CustomSecurityAnnotation

邓阳嘉
2023-03-14

我正在使用一个自定义的注释安全性,如本链接所述。我正在将我的jsf托管bean从@ManagedBean升级为@Named(CDI)。由于CDI不支持作用域@ViewScoped,所以我使用org.omnifaces.CDI.ViewScoped。但是,在这种情况下,如果method.isAnnotationPresent(permissao.class){}检查失败。我应该如何调整我的安全检查来使用CDI+ViewScoped从OmniFaces?

使用@managedbean/viewscoped(jsf)而不是@named/viewscoped(cdi+omnifaces)起作用。此问题出现在该行if(Metodo.IsAnnotationPresent(PermissAo.Class)){}

public void verificaPermissaoAcesso(ActionEvent event) {

    final FacesContext facesContext = FacesContext.getCurrentInstance();

    UIComponent source = event.getComponent();
    ActionSource2 actionSource = (ActionSource2) source;
    MethodExpression methodExpression = actionSource.getActionExpression();
    String expressao = methodExpression.getExpressionString();  // #{nomeManagedBean.nomeMetodo(param)} 

    String nomeManagedBean = expressao.substring(0, expressao.indexOf('.')).substring(2);
    String nomeMetodoComParenteses = expressao.substring(expressao.indexOf('.') + 1);        
    String nomeMetodo = nomeMetodoComParenteses.substring(0, nomeMetodoComParenteses.indexOf("("));

    ELContext elContext = facesContext.getELContext();
    ExpressionFactory factory = facesContext.getApplication().getExpressionFactory();
    ValueExpression ve = factory.createValueExpression(elContext, "#{" + nomeManagedBean + '}', Object.class);
    //Object jsfManagedBean = ve.getValue(elContext);

    Context ctx = bm.getContext(org.omnifaces.cdi.ViewScoped.class);
    Bean bean = bm.resolve(bm.getBeans(nomeManagedBean));
    Object jsfManagedBeanProxy = ctx.get(bean);

    List<Method> listaMetodos = Arrays.asList(jsfManagedBeanProxy.getClass().getMethods());

    for (Method metodo : listaMetodos) {
        if (nomeMetodo.equals(metodo.getName())) {
            if (metodo.isAnnotationPresent(Permissao.class)) {
                Permissao anotacaoSeguranca = metodo.getAnnotation(Permissao.class);
                SegurancaUtil.verificar(anotacaoSeguranca.acoes());
                break;
            } 
        }
    }
}

我得批注类

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Permissao {
    String[] acoes();
}

我在jsf托管bean中的注释方法

@Permissao(acoes={"permission1", "permission2"})
public void myMethod(long id) {} 
Context ctx = bm.getContext(org.omnifaces.cdi.ViewScoped.class);
Bean bean = bm.resolve(bm.getBeans(nomeManagedBean));
Object jsfManagedBeanProxy = ctx.get(bean);

共有1个答案

武嘉祥
2023-03-14

CDI不注入一个裸的CDI bean作为依赖项,而是一个重定向到活动范围的上下文对象的代理。此代理类没有您的批注。

请参见https://issues.jboss.org/browse/CDI-10了解如何解包代理。

 类似资料:
  • Guice还提供了另一种映射绑定的方法,而无需创建自定义注释。 它允许使用@Named注释。 使用命名注释进行映射 bind(SpellChecker.class).annotatedWith(Names.named("OpenOffice")).to(OpenOfficeWordSpellCheckerImpl.class); 使用@Named注释进行注入 @Inject public Tex

  • 管道用于相关过程之间的通信。 我们可以使用管道进行无关的进程通信吗,比方说,我们想从一个终端执行客户端程序,从另一个终端执行服务器程序? 答案是否定。那么我们如何才能实现无关的流程沟通,简单的答案就是命名管道。 即使这适用于相关流程,但使用命名管道进行相关流程通信也没有任何意义。 我们使用一个管道进行单向通信,使用两个管道进行双向通信。 相同条件是否适用于命名管道。 答案是否定的,我们可以使用单个

  • 主要内容:使用@Named 注解映射,使用@Named 注解注入,Google Guice @Named 注解完整示例,输出Google Guice 还提供了另一种无需创建自定义注释即可映射绑定的方法。它允许使用@Named 注解。 使用@Named 注解映射 使用@Named 注解注入 Google Guice @Named 注解完整示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。

  • ember-named-yields A stop-gap for the named yields RFC and based off the experimentation here. Demo Install ember install ember-named-yields Usage Setup the named yields in your component template: {{

  • 描述 (Description) 如果此元素上存在指定类型的注释,则java.lang.reflect.AccessibleObject.isAnnotationPresent(Class《? extends Annotation》 annotationClass)方法返回true,否则返回false。 声明 (Declaration) 以下是java.lang.reflect.Accessibl

  • In the Navigate to a new screen and back recipe, we learned how to Navigate to a new screen by creating a new route and pushing it to the Navigator. However, if we need to navigate to the same screen