Extendendo a Sergurança do JSF -Duvida

0 respostas
G

Bom galera, procurando por alternativas para serviços de autenticação/autorização de usuarios, acabei achando esste post, que leva a um link , q sugere extender a segurança do JSF através de Annotations, eu achei bastante interessante, e resolvi tentar fazer o meu, mas antes preciso entender melhor o funcionamento do exemplo.

O q eu não to conseguindo entende, é quando e como, as permissoes seriam "setadas" ao usuario, ja que na classe SecurityHelper...
public static boolean isMethodAnnotated(String expFullAction, java.lang.Class<? extends Annotation> annotation) {
    String beanName = expFullAction.substring(
        expFullAction.indexOf("{")+1,
        expFullAction.indexOf(".")
        );
    String methodName = expFullAction.substring(
        expFullAction.indexOf(".")+1,
        expFullAction.indexOf("}")
        );
    ValueBinding vb = FacesContext.getCurrentInstance().getApplication().createValueBinding( "#{" + beanName + "}");
    FacesContext ctx = FacesContext.getCurrentInstance();
    Object bean = vb.getValue(ctx);
    Method metodo;
    try {
      metodo = bean.getClass().getMethod(methodName);
    } catch (Exception ex) {
      ex.printStackTrace();
      return false;
    }
    return metodo.isAnnotationPresent(annotation);
  }
  
  public static boolean checkMethodPermission(String expFullAction, User user) {  
    String beanName = expFullAction.substring(
        expFullAction.indexOf("{")+1,
        expFullAction.indexOf(".")
        );
    String methodName = expFullAction.substring(
        expFullAction.indexOf(".")+1,
        expFullAction.indexOf("}")
        );
    FacesContext context = FacesContext.getCurrentInstance();
    ValueBinding vb = FacesContext.getCurrentInstance().getApplication().createValueBinding( "#{" + beanName + "}");
    Object bean = vb.getValue(context);
    Method metodo;
    try {
      metodo = bean.getClass().getMethod(methodName);   
    } catch (Exception ex) {
      ex.printStackTrace();
      return false;
    }
    //Caso n&#65533;o tenha a annotation de seguran&#65533;a, ok da o acesso.
    if(!metodo.isAnnotationPresent(SecurityRoles.class)) {
      return true;
    }
    Annotation annotationObj = metodo.getAnnotation(SecurityRoles.class);
    //Lendo as roles da annotation do m&#65533;todo protegido
    String rolesString = annotationObj.toString();
    rolesString = rolesString.substring(rolesString.indexOf("value=")+6, rolesString.length()-1);
    //N&#65533;o tenho certeza se na espec Java EE 5 permitem nome de roles com espaco.
    //TODO: confirmar.
    rolesString.replaceAll(" ", "");
    String roles[] = rolesString.split(",");
    //Obter usu&#65533;rio
    boolean granted = false;
    //Check user roles Vs. method roles
    for(String role : roles) {
      if(user.isUserInRole(role)) {
        granted = true;
      }
    }
    return granted;
  }
como vcs podem ver, existe um if que, testa se não existe uma annotation assinada ao metodo
if(!metodo.isAnnotationPresent(SecurityRoles.class)) {
      return true;
    }
ou fui eu que entendi errado ?

enfim, não consegui entender com clareza o exemplo, alguem poderia esclarece-lo ?

ps: erros de portugues :oops:

Criado 22 de maio de 2009
Respostas 0
Participantes 1