001package org.tynamo.security; 002 003import java.io.IOException; 004import java.util.List; 005 006import org.apache.tapestry5.services.ComponentClassResolver; 007import org.apache.tapestry5.services.ComponentEventRequestParameters; 008import org.apache.tapestry5.services.ComponentRequestFilter; 009import org.apache.tapestry5.services.ComponentRequestHandler; 010import org.apache.tapestry5.services.PageRenderRequestParameters; 011import org.tynamo.security.internal.services.LoginContextService; 012import org.tynamo.security.services.ClassInterceptorsCache; 013import org.tynamo.shiro.extension.authz.aop.SecurityInterceptor; 014 015public class SecurityComponentRequestFilter implements ComponentRequestFilter { 016 017 private final ComponentClassResolver resolver; 018 private final ClassInterceptorsCache classInterceptorsCache; 019 private final String loginClassName; 020 private final String unauthorizedClassName; 021 022 023 public SecurityComponentRequestFilter(LoginContextService loginContextService, 024 ComponentClassResolver resolver, 025 ClassInterceptorsCache classInterceptorsCache) { 026 027 this.resolver = resolver; 028 this.classInterceptorsCache = classInterceptorsCache; 029 030 loginClassName = resolver.resolvePageNameToClassName(loginContextService.getLoginPage()); 031 unauthorizedClassName = resolver.resolvePageNameToClassName(loginContextService.getUnauthorizedPage()); 032 033 } 034 035 @Override 036 public void handleComponentEvent( 037 ComponentEventRequestParameters parameters, 038 ComponentRequestHandler handler) throws IOException { 039 040 checkInternal(parameters.getActivePageName()); 041 handler.handleComponentEvent(parameters); 042 } 043 044 @Override 045 public void handlePageRender(PageRenderRequestParameters parameters, 046 ComponentRequestHandler handler) throws IOException { 047 048 checkInternal(parameters.getLogicalPageName()); 049 handler.handlePageRender(parameters); 050 } 051 052 private void checkInternal(String logicalPageName) { 053 054 String pageClassName = resolver.resolvePageNameToClassName(logicalPageName); 055 if ( 056 !(pageClassName.equals(loginClassName) || 057 pageClassName.equals(unauthorizedClassName)) 058 059 ) { 060 061 String className = resolver.resolvePageNameToClassName(logicalPageName); 062 063 List<SecurityInterceptor> interceptors = classInterceptorsCache.get(className); 064 065 if (interceptors != null) { 066 for (SecurityInterceptor interceptor : interceptors) { 067 interceptor.intercept(); 068 } 069 } 070 071 } 072 } 073}