首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSF @Named + isAnnotationPresent + @CustomSecurityAnnotation

JSF @Named + isAnnotationPresent + @CustomSecurityAnnotation
EN

Stack Overflow用户
提问于 2014-04-30 11:30:48
回答 1查看 208关注 0票数 1

我使用的是自定义注释安全as described in this link。我正在将jsf托管bean从@ManagedBean升级到@Named (CDI)。由于CDI不支持作用域@ViewScoped,所以我使用的是org.omnifaces.cdi.ViewScoped。但是,在本例中,此检查失败了if method.isAnnotationPresent(Permissao.class){}。我应该如何调整我的安全检查,以使用CDI + ViewScoped从Omnifaces?

编辑

使用@ManagedBean/ViewScoped(jsf)代替@Named/ViewScoped(cdi +总括)可以工作。这个问题发生在这一行if (metodo.isAnnotationPresent(Permissao.class)) {}中。

代码语言:javascript
复制
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;
            } 
        }
    }
}

我的注释类

代码语言:javascript
复制
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Permissao {
    String[] acoes();
}

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

代码语言:javascript
复制
@Permissao(acoes={"permission1", "permission2"})
public void myMethod(long id) {} 

编辑2- @meriton

代码语言:javascript
复制
Context ctx = bm.getContext(org.omnifaces.cdi.ViewScoped.class);
Bean bean = bm.resolve(bm.getBeans(nomeManagedBean));
Object jsfManagedBeanProxy = ctx.get(bean);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-30 18:27:17

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

有关如何展开代理,请参见https://issues.jboss.org/browse/CDI-10

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23386954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档