001    package org.tynamo.security.services.impl;
002    
003    import org.apache.tapestry5.ioc.annotations.EagerLoad;
004    import org.apache.tapestry5.ioc.annotations.Inject;
005    import org.apache.tapestry5.ioc.annotations.Symbol;
006    import org.apache.tapestry5.ioc.services.PipelineBuilder;
007    import org.slf4j.Logger;
008    import org.tynamo.security.SecuritySymbols;
009    import org.tynamo.security.services.SecurityFilterChainFactory;
010    import org.tynamo.security.shiro.AccessControlFilter;
011    import org.tynamo.security.shiro.authc.AnonymousFilter;
012    import org.tynamo.security.shiro.authc.BasicHttpAuthenticationFilter;
013    import org.tynamo.security.shiro.authc.FormAuthenticationFilter;
014    import org.tynamo.security.shiro.authc.UserFilter;
015    import org.tynamo.security.shiro.authz.PermissionsAuthorizationFilter;
016    import org.tynamo.security.shiro.authz.RolesAuthorizationFilter;
017    
018    // Eager load since this service is initializes the global filter defaults
019    @EagerLoad
020    public class SecurityFilterChainFactoryImpl implements SecurityFilterChainFactory {
021            private PipelineBuilder builder;
022    
023            private Logger logger;
024            
025            public SecurityFilterChainFactoryImpl(PipelineBuilder builder, Logger logger,
026          @Inject @Symbol(SecuritySymbols.SUCCESS_URL) String successUrl,
027          @Inject @Symbol(SecuritySymbols.LOGIN_URL) String loginUrl,
028          @Inject @Symbol(SecuritySymbols.UNAUTHORIZED_URL) String unauthorizedUrl
029            ) {
030                    this.builder = builder;
031                    this.logger = logger;
032                    AccessControlFilter.LOGIN_URL = loginUrl;
033                    AccessControlFilter.SUCCESS_URL = successUrl;
034                    AccessControlFilter.UNAUTHORIZED_URL = unauthorizedUrl;
035            }
036    
037            public SecurityFilterChain.Builder createChain(String path) {
038                    return new SecurityFilterChain.Builder(logger, builder, path);
039            }
040    
041            @SuppressWarnings("unchecked")
042            public String getLogicalUrl(Class pageClass) {
043                    // TODO should add package, or maybe use Tapestry util operation for it?
044                    return "/" + pageClass.getSimpleName().toLowerCase();
045            }
046            
047            public AnonymousFilter anon() {
048                    String name = "anon";
049                    AnonymousFilter filter = new AnonymousFilter();
050                    filter.setName(name);
051                    return filter;
052            }
053    
054            public UserFilter user() {
055                    String name = "user";
056                    UserFilter filter = new UserFilter();
057                    filter.setName(name);
058                    return filter;
059            }
060    
061            public FormAuthenticationFilter authc() {
062                    String name = "authc";
063                    FormAuthenticationFilter filter = new FormAuthenticationFilter();
064                    filter.setName(name);
065                    return filter;
066            }
067    
068            public BasicHttpAuthenticationFilter basic() {
069                    String name = "authcBasic";
070                    BasicHttpAuthenticationFilter filter = new BasicHttpAuthenticationFilter();
071                    filter.setName(name);
072                    return filter;
073            }
074    
075            public RolesAuthorizationFilter roles() {
076                    String name = "roles";
077                    RolesAuthorizationFilter filter = new RolesAuthorizationFilter();
078                    filter.setName(name);
079                    return filter;
080            }
081            
082            
083            public PermissionsAuthorizationFilter perms() {
084                    String name = "perms";
085                    PermissionsAuthorizationFilter filter = new PermissionsAuthorizationFilter();
086                    filter.setName(name);
087                    return filter;
088            }
089            
090            
091    
092    }