1 /**
2 *
3 */
4 package sf.net.kayestry.pages.access;
5
6 import java.util.List;
7 import java.util.Set;
8
9 import org.apache.tapestry.IBeanProvider;
10 import org.apache.tapestry.IPage;
11 import org.apache.tapestry.html.BasePage;
12
13 import sf.net.kayestry.Visit;
14
15 import ar.com.jiji.kaya.KayaRuntimeException;
16 import ar.com.jiji.kaya.model.Role;
17 import ar.com.jiji.kaya.model.User;
18
19 /**
20 * Chequea que se tengan los permisos necesarios para acceder a cierta pagina.
21 * Una pagina se considera que necesita ciertos permisos para acceder a ella
22 * implementando alguna interfaz que herede de SecurePage. Ver la documentacion
23 * de cada interfaz para ver como configurar el acceso.
24 *
25 * @author lparra
26 * @see sf.net.kayestry.pages.access.SecurePage
27 * @version $Revision$ $Date$
28 */
29 public class PageAccess {
30
31 /**
32 * Determina si se puede acceder a determinada pagina. Si la pagina no
33 * implementa alguna interfaz que herede de SecurePage se considera que es
34 * una pagina de acceso publico y se autoriza.<br/>En el otro caso, se
35 * chequea que haya un usuario logueado y despues, segun la interfaz
36 * implementada, se chequea si el usuario tiene acceso o no.
37 *
38 * @param visit
39 * @param page
40 * @see SecurePage
41 * @return
42 */
43 public static boolean isAccessAllowed(Visit visit, BasePage page) {
44 boolean auth = false;
45
46 if (needsPermission(page) && isUserLoggedIn(visit)) {
47 User usr = visit.getLoggedUser();
48 if (page instanceof SimpleSecurePage)
49 auth = checkAccessFor(usr, (SimpleSecurePage) page);
50 else if (page instanceof BeanSecurePage)
51 auth = checkAccessFor(usr, (BeanSecurePage) page);
52 } else
53 auth = true;
54 return auth;
55 }
56
57 /**
58 * Verifica que la pagina necesita hacer un chequeo de permisos para poder
59 * acceder a ella.
60 *
61 * @param page
62 * @return
63 */
64 public static boolean needsPermission(IPage page) {
65 return (page instanceof SecurePage);
66 }
67
68 private static boolean checkAccessFor(User user, SimpleSecurePage page) {
69 Set<Role> usrRoles = user.getRoles();
70 Set<Role> allowedRoles = page.getAllowedRoles();
71 for (Role r : usrRoles) {
72 if (allowedRoles.contains(r))
73 return true;
74 }
75 return false;
76 }
77
78 @SuppressWarnings("unchecked")
79 private static boolean checkAccessFor(User user, BeanSecurePage page) {
80 Set<Role> usrRoles = user.getRoles();
81
82
83 BasePage basePage = (BasePage) page;
84 IBeanProvider beanProv = basePage.getBeans();
85 if (beanProv.canProvideBean(BeanSecurePage.BEAN_NAME)) {
86 AccessBean accessBean = (AccessBean) beanProv
87 .getBean(BeanSecurePage.BEAN_NAME);
88 for (String allowed : (List<String>) accessBean.getRoles())
89 for (Role r : usrRoles) {
90 if (allowed.equals(r.getName()))
91 return true;
92 }
93 return false;
94 }
95 throw new KayaRuntimeException("La pagina " + basePage.getPageName()
96 + " no tienen ningun bean para control de acceso");
97 }
98
99 /**
100 * Devuelve si hay usuario logueado. Se chequea que visit sea diferente de
101 * null y que haya un usuario logueado.
102 *
103 * @param visit
104 * @return
105 */
106 private static boolean isUserLoggedIn(Visit visit) {
107 return (visit != null && visit.getLoggedUser() != null);
108 }
109
110 }