View Javadoc

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  		// TODO no se que tan bien este esto. se que al final es un BasePage
82  		// pero estoy casteando de vuelta aca...
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 }