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…
[code] 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�o tenha a annotation de seguran�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�todo protegido
String rolesString = annotationObj.toString();
rolesString = rolesString.substring(rolesString.indexOf(“value=”)+6, rolesString.length()-1);
//N�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�rio
boolean granted = false;
//Check user roles Vs. method roles
for(String role : roles) {
if(user.isUserInRole(role)) {
granted = true;
}
}
return granted;
}[/code]
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: