Coverage Report - nu.localhost.tapestry.acegi.services.SecurityModule
 
Classes in this File Line Coverage Branch Coverage Complexity
SecurityModule
0%
0/268
0%
0/4
0
 
 1  
 /*
 2  
  * Copyright 2007 Ivan Dubrov
 3  
  * Copyright 2007, 2008 Robin Helgelin
 4  
  *
 5  
  * Licensed under the Apache License, Version 2.0 (the "License");
 6  
  * you may not use this file except in compliance with the License.
 7  
  * You may obtain a copy of the License at
 8  
  *
 9  
  *     http://www.apache.org/licenses/LICENSE-2.0
 10  
  *
 11  
  * Unless required by applicable law or agreed to in writing, software
 12  
  * distributed under the License is distributed on an "AS IS" BASIS,
 13  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 14  
  * See the License for the specific language governing permissions and
 15  
  * limitations under the License.
 16  
  */
 17  
 
 18  
 package nu.localhost.tapestry.acegi.services;
 19  
 
 20  
 import java.util.List;
 21  
 
 22  
 import nu.localhost.tapestry.acegi.services.internal.AcegiExceptionTranslationFilter;
 23  
 import nu.localhost.tapestry.acegi.services.internal.AcegiWorker;
 24  
 import nu.localhost.tapestry.acegi.services.internal.HttpServletRequestFilterWrapper;
 25  
 import nu.localhost.tapestry.acegi.services.internal.LogoutServiceImpl;
 26  
 import nu.localhost.tapestry.acegi.services.internal.RequestFilterWrapper;
 27  
 import nu.localhost.tapestry.acegi.services.internal.SaltSourceImpl;
 28  
 import nu.localhost.tapestry.acegi.services.internal.SecurityChecker;
 29  
 import nu.localhost.tapestry.acegi.services.internal.StaticSecurityChecker;
 30  
 
 31  
 import org.acegisecurity.AccessDecisionManager;
 32  
 import org.acegisecurity.AuthenticationManager;
 33  
 import org.acegisecurity.AuthenticationTrustResolver;
 34  
 import org.acegisecurity.AuthenticationTrustResolverImpl;
 35  
 import org.acegisecurity.context.HttpSessionContextIntegrationFilter;
 36  
 import org.acegisecurity.context.SecurityContextImpl;
 37  
 import org.acegisecurity.providers.AuthenticationProvider;
 38  
 import org.acegisecurity.providers.ProviderManager;
 39  
 import org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider;
 40  
 import org.acegisecurity.providers.anonymous.AnonymousProcessingFilter;
 41  
 import org.acegisecurity.providers.dao.DaoAuthenticationProvider;
 42  
 import org.acegisecurity.providers.encoding.PasswordEncoder;
 43  
 import org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider;
 44  
 import org.acegisecurity.ui.AccessDeniedHandlerImpl;
 45  
 import org.acegisecurity.ui.AuthenticationEntryPoint;
 46  
 import org.acegisecurity.ui.ExceptionTranslationFilter;
 47  
 import org.acegisecurity.ui.logout.LogoutHandler;
 48  
 import org.acegisecurity.ui.logout.SecurityContextLogoutHandler;
 49  
 import org.acegisecurity.ui.rememberme.RememberMeProcessingFilter;
 50  
 import org.acegisecurity.ui.rememberme.RememberMeServices;
 51  
 import org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices;
 52  
 import org.acegisecurity.ui.webapp.AuthenticationProcessingFilter;
 53  
 import org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint;
 54  
 import org.acegisecurity.userdetails.UserDetailsService;
 55  
 import org.acegisecurity.userdetails.memory.UserAttribute;
 56  
 import org.acegisecurity.userdetails.memory.UserAttributeEditor;
 57  
 import org.acegisecurity.vote.AccessDecisionVoter;
 58  
 import org.acegisecurity.vote.AffirmativeBased;
 59  
 import org.acegisecurity.vote.RoleVoter;
 60  
 import org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter;
 61  
 import org.apache.tapestry.ioc.Configuration;
 62  
 import org.apache.tapestry.ioc.MappedConfiguration;
 63  
 import org.apache.tapestry.ioc.OrderedConfiguration;
 64  
 import org.apache.tapestry.ioc.ServiceBinder;
 65  
 import org.apache.tapestry.ioc.annotations.Inject;
 66  
 import org.apache.tapestry.ioc.annotations.InjectService;
 67  
 import org.apache.tapestry.ioc.annotations.Marker;
 68  
 import org.apache.tapestry.ioc.annotations.Value;
 69  
 import org.apache.tapestry.services.AliasContribution;
 70  
 import org.apache.tapestry.services.ComponentClassTransformWorker;
 71  
 import org.apache.tapestry.services.HttpServletRequestFilter;
 72  
 import org.apache.tapestry.services.LibraryMapping;
 73  
 import org.apache.tapestry.services.RequestFilter;
 74  
 import org.apache.tapestry.services.RequestGlobals;
 75  
 
 76  
 
 77  
 /**
 78  
  * This module is automatically included as part of the Tapestry IoC Registry,
 79  0
  * 
 80  0
  * @author Ivan Dubrov
 81  0
  * @author Robin Helgelin
 82  0
  */
 83  0
 public class SecurityModule {
 84  0
     @SuppressWarnings("unchecked")
 85  0
     public static void bind(final ServiceBinder binder) {
 86  0
         binder.bind(LogoutService.class, LogoutServiceImpl.class).withMarker(AcegiServices.class);
 87  0
         binder.bind(AuthenticationTrustResolver.class, AuthenticationTrustResolverImpl.class)
 88  0
             .withMarker(AcegiServices.class);
 89  0
     }
 90  0
     
 91  0
     public static void contributeAlias(@AcegiServices SaltSourceService saltSource,
 92  0
             @AcegiServices AuthenticationProcessingFilter authenticationProcessingFilter,
 93  0
             Configuration<AliasContribution> configuration) {
 94  0
         configuration.add(AliasContribution.create(SaltSourceService.class, saltSource));
 95  0
         configuration.add(AliasContribution.create(AuthenticationProcessingFilter.class, authenticationProcessingFilter));
 96  0
     }
 97  0
     
 98  0
     @Marker(AcegiServices.class)
 99  0
     public static PasswordEncoder buildPasswordEncoder(
 100  0
             @Inject @Value("${acegi.password.encoder}") final String passwordEncoder) {
 101  0
         try {
 102  0
             return (PasswordEncoder) Class.forName(passwordEncoder).newInstance();
 103  0
         } catch (ClassNotFoundException ex) {
 104  0
             throw new IllegalArgumentException(ex);
 105  0
         } catch (IllegalAccessException ex) {
 106  0
             throw new IllegalArgumentException(ex);
 107  0
         } catch (InstantiationException ex) {
 108  0
             throw new IllegalArgumentException(ex);
 109  0
         }
 110  0
     }
 111  0
     
 112  0
     @Marker(AcegiServices.class)
 113  0
     public static SaltSourceService buildSaltSource(@Inject @Value("${acegi.password.salt}") final String salt)
 114  0
         throws Exception {
 115  0
         SaltSourceImpl saltSource = new SaltSourceImpl();
 116  0
         saltSource.setSystemWideSalt(salt);
 117  0
         saltSource.afterPropertiesSet();
 118  0
         return saltSource;
 119  0
     }
 120  0
     
 121  0
     public static void contributeFactoryDefaults(final MappedConfiguration<String, String> configuration) {
 122  0
         configuration.add("acegi.check.url", "/j_acegi_security_check");
 123  0
         configuration.add("acegi.failure.url", "/loginfailed");
 124  0
         configuration.add("acegi.target.url", "/");
 125  0
         configuration.add("acegi.afterlogout.url", "/");
 126  0
         configuration.add("acegi.accessDenied.url", "");
 127  0
         configuration.add("acegi.rememberme.key", "REMEMBERMEKEY");
 128  0
         configuration.add("acegi.loginform.url", "/loginpage");
 129  0
         configuration.add("acegi.anonymous.key", "acegi_anonymous");
 130  0
         configuration.add("acegi.anonymous.attribute", "anonymous,ROLE_ANONYMOUS");
 131  0
         configuration.add("acegi.password.encoder", "org.acegisecurity.providers.encoding.PlaintextPasswordEncoder");
 132  0
         configuration.add("acegi.password.salt", "DEADBEEF");
 133  0
     }
 134  0
     
 135  0
     public static void contributeComponentClassTransformWorker(
 136  0
             OrderedConfiguration<ComponentClassTransformWorker> configuration, SecurityChecker securityChecker) {
 137  0
         configuration.add("Acegi", new AcegiWorker(securityChecker));
 138  0
     }
 139  0
     
 140  0
     public static void contributeHttpServletRequestHandler(
 141  0
           OrderedConfiguration<HttpServletRequestFilter> configuration,
 142  0
           @InjectService("HttpSessionContextIntegrationFilter") HttpServletRequestFilter httpSessionContextIntegrationFilter,
 143  0
           @InjectService("AuthenticationProcessingFilter") HttpServletRequestFilter authenticationProcessingFilter,
 144  0
           @InjectService("RememberMeProcessingFilter") HttpServletRequestFilter rememberMeProcessingFilter,
 145  0
           @InjectService("SecurityContextHolderAwareRequestFilter") HttpServletRequestFilter
 146  0
           securityContextHolderAwareRequestFilter,
 147  0
           @InjectService("AnonymousProcessingFilter") HttpServletRequestFilter anonymousProcessingFilter) {
 148  0
 
 149  0
         configuration.add("acegiHttpSessionContextIntegrationFilter", httpSessionContextIntegrationFilter, "before:acegi*");
 150  0
         configuration.add("acegiAuthenticationProcessingFilter", authenticationProcessingFilter);
 151  0
         configuration.add("acegiRememberMeProcessingFilter", rememberMeProcessingFilter);
 152  0
         configuration.add("acegiSecurityContextHolderAwareRequestFilter", securityContextHolderAwareRequestFilter,
 153  0
                 "after:acegiRememberMeProcessingFilter");
 154  0
         configuration.add("acegiAnonymousProcessingFilter", anonymousProcessingFilter,
 155  0
                 "after:acegiRememberMeProcessingFilter",
 156  0
                 "after:acegiAuthenticationProcessingFilter");
 157  0
     }
 158  0
 
 159  0
     @Marker(AcegiServices.class)
 160  0
     public static HttpServletRequestFilter buildHttpSessionContextIntegrationFilter()
 161  0
     throws Exception {
 162  0
         HttpSessionContextIntegrationFilter filter = new HttpSessionContextIntegrationFilter();
 163  0
         filter.setContext(SecurityContextImpl.class);
 164  0
         filter.setAllowSessionCreation(true);
 165  0
         filter.setForceEagerSessionCreation(false);
 166  0
         filter.afterPropertiesSet();
 167  0
         return new HttpServletRequestFilterWrapper(filter);
 168  0
     }
 169  0
     
 170  0
     @Marker(AcegiServices.class)
 171  0
     public static AuthenticationProcessingFilter buildRealAuthenticationProcessingFilter(
 172  0
         @AcegiServices final AuthenticationManager manager,
 173  0
         @AcegiServices final RememberMeServices rememberMeServices,
 174  0
         @Inject @Value("${acegi.check.url}") final String authUrl,
 175  0
         @Inject @Value("${acegi.target.url}") final String targetUrl,
 176  0
         @Inject @Value("${acegi.failure.url}") final String failureUrl)
 177  0
     throws Exception {
 178  0
         AuthenticationProcessingFilter filter = new AuthenticationProcessingFilter();
 179  0
         filter.setAuthenticationManager(manager);
 180  0
         filter.setAuthenticationFailureUrl(failureUrl);
 181  0
         filter.setDefaultTargetUrl(targetUrl);
 182  0
         filter.setFilterProcessesUrl(authUrl);
 183  0
         filter.setRememberMeServices(rememberMeServices);
 184  0
         filter.afterPropertiesSet();
 185  0
         return filter;
 186  0
     }    
 187  0
 
 188  0
     @Marker(AcegiServices.class)
 189  0
     public static HttpServletRequestFilter buildAuthenticationProcessingFilter(final AuthenticationProcessingFilter filter)
 190  0
     throws Exception {
 191  0
         return new HttpServletRequestFilterWrapper(filter);
 192  0
     }
 193  0
 
 194  0
     @Marker(AcegiServices.class)
 195  
     public static HttpServletRequestFilter buildRememberMeProcessingFilter(
 196  
             @AcegiServices final RememberMeServices rememberMe,
 197  
             @AcegiServices final AuthenticationManager authManager) throws Exception {
 198  0
         RememberMeProcessingFilter filter = new RememberMeProcessingFilter();
 199  0
         filter.setRememberMeServices(rememberMe);
 200  0
         filter.setAuthenticationManager(authManager);
 201  0
         filter.afterPropertiesSet();
 202  0
         return new HttpServletRequestFilterWrapper(filter);
 203  0
     }
 204  0
     
 205  0
     @Marker(AcegiServices.class)
 206  0
     public static HttpServletRequestFilter buildSecurityContextHolderAwareRequestFilter() {
 207  0
         return new HttpServletRequestFilterWrapper(new SecurityContextHolderAwareRequestFilter());
 208  0
     }
 209  0
 
 210  0
     @Marker(AcegiServices.class)
 211  0
     public static HttpServletRequestFilter buildAnonymousProcessingFilter(
 212  0
             @Inject @Value("${acegi.anonymous.attribute}") final String anonymousAttr,
 213  0
             @Inject @Value("${acegi.anonymous.key}") final String anonymousKey) throws Exception {
 214  0
         AnonymousProcessingFilter filter = new AnonymousProcessingFilter();
 215  0
         filter.setKey(anonymousKey);
 216  0
         UserAttributeEditor attrEditor = new UserAttributeEditor();
 217  0
         attrEditor.setAsText(anonymousAttr);
 218  0
         UserAttribute attr = (UserAttribute) attrEditor.getValue();
 219  0
         filter.setUserAttribute(attr);
 220  0
         filter.afterPropertiesSet();
 221  0
         return new HttpServletRequestFilterWrapper(filter);
 222  0
     }
 223  0
 
 224  0
     @Marker(AcegiServices.class)
 225  0
     public static RememberMeServices build(final UserDetailsService userDetailsService,
 226  0
             @Inject @Value("${acegi.rememberme.key}") final String rememberMeKey) {
 227  0
         TokenBasedRememberMeServices rememberMe = new TokenBasedRememberMeServices();
 228  0
         rememberMe.setUserDetailsService(userDetailsService);
 229  0
         rememberMe.setKey(rememberMeKey);
 230  0
         return rememberMe;
 231  0
     }
 232  0
 
 233  0
     @Marker(AcegiServices.class)
 234  
     public static LogoutHandler buildRememberMeLogoutHandler(final UserDetailsService userDetailsService,
 235  
             @Inject @Value("${acegi.rememberme.key}") final String rememberMeKey) throws Exception {
 236  0
         TokenBasedRememberMeServices rememberMe = new TokenBasedRememberMeServices();
 237  0
         rememberMe.setUserDetailsService(userDetailsService);
 238  0
         rememberMe.setKey(rememberMeKey);
 239  0
         rememberMe.afterPropertiesSet();
 240  0
         return rememberMe;
 241  0
     }
 242  0
 
 243  0
     public static void contributeLogoutService(final OrderedConfiguration< LogoutHandler > cfg,
 244  0
             @InjectService("RememberMeLogoutHandler") final LogoutHandler rememberMeLogoutHandler) {
 245  0
         cfg.add("securityContextLogoutHandler", new SecurityContextLogoutHandler());
 246  0
         cfg.add("rememberMeLogoutHandler", rememberMeLogoutHandler);
 247  0
     }
 248  0
 
 249  0
     @Marker(AcegiServices.class)
 250  0
     public static AuthenticationManager buildProviderManager(final List< AuthenticationProvider > providers)
 251  0
     throws Exception {
 252  0
         ProviderManager manager = new ProviderManager();
 253  0
         manager.setProviders(providers);
 254  0
         manager.afterPropertiesSet();
 255  0
         return manager;
 256  0
     }
 257  0
 
 258  0
     @Marker(AcegiServices.class)
 259  0
     public final AuthenticationProvider buildAnonymousAuthenticationProvider(
 260  0
             @Inject @Value("${acegi.anonymous.key}") final String anonymousKey)
 261  0
     throws Exception {
 262  0
         AnonymousAuthenticationProvider provider = new AnonymousAuthenticationProvider();
 263  0
         provider.setKey(anonymousKey);
 264  0
         provider.afterPropertiesSet();
 265  0
         return provider;
 266  0
     }
 267  0
 
 268  0
     @Marker(AcegiServices.class)
 269  0
     public final AuthenticationProvider buildRememberMeAuthenticationProvider(
 270  0
             @Inject @Value("${acegi.rememberme.key}") final String rememberMeKey)
 271  0
     throws Exception {
 272  0
         RememberMeAuthenticationProvider provider = new RememberMeAuthenticationProvider();
 273  0
         provider.setKey(rememberMeKey);
 274  0
         provider.afterPropertiesSet();
 275  0
         return provider;
 276  0
     }
 277  0
 
 278  0
     @Marker(AcegiServices.class)
 279  0
     public final AuthenticationProvider buildDaoAuthenticationProvider(final UserDetailsService userDetailsService,
 280  
             @AcegiServices final PasswordEncoder passwordEncoder,
 281  0
             final SaltSourceService saltSource) throws Exception {
 282  0
         DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
 283  0
         provider.setUserDetailsService(userDetailsService);
 284  0
         provider.setPasswordEncoder(passwordEncoder);
 285  0
         provider.setSaltSource(saltSource);
 286  0
         provider.afterPropertiesSet();
 287  0
         return provider;
 288  0
     }
 289  0
 
 290  0
     public final void contributeProviderManager(
 291  0
             final OrderedConfiguration< AuthenticationProvider > configuration,
 292  0
             @InjectService("AnonymousAuthenticationProvider")
 293  0
             final AuthenticationProvider anonymousAuthenticationProvider,
 294  0
             @InjectService("RememberMeAuthenticationProvider") 
 295  0
             final AuthenticationProvider rememberMeAuthenticationProvider) {
 296  0
         configuration.add("anonymousAuthenticationProvider", anonymousAuthenticationProvider);
 297  0
         configuration.add("rememberMeAuthenticationProvider", rememberMeAuthenticationProvider);
 298  0
     }
 299  0
 
 300  0
     @Marker(AcegiServices.class)
 301  0
     public final AccessDecisionManager buildAccessDecisionManager(final List<AccessDecisionVoter> voters)
 302  0
     throws Exception {
 303  0
         AffirmativeBased manager = new AffirmativeBased();
 304  0
         manager.setDecisionVoters(voters);
 305  0
         manager.afterPropertiesSet();
 306  0
         return manager;
 307  0
     }
 308  0
 
 309  
     public final void contributeAccessDecisionManager(final OrderedConfiguration< AccessDecisionVoter > configuration) {
 310  0
         configuration.add("RoleVoter", new RoleVoter());
 311  0
     }
 312  0
 
 313  0
     @Marker(AcegiServices.class)
 314  0
     public static SecurityChecker buildSecurityChecker(
 315  0
             @AcegiServices final AccessDecisionManager accessDecisionManager,
 316  0
             @AcegiServices final AuthenticationManager authenticationManager)
 317  0
     throws Exception {
 318  0
         StaticSecurityChecker checker = new StaticSecurityChecker();
 319  0
         checker.setAccessDecisionManager(accessDecisionManager);
 320  0
         checker.setAuthenticationManager(authenticationManager);
 321  0
         checker.afterPropertiesSet();
 322  0
         return checker;
 323  0
     }
 324  0
 
 325  0
     @Marker(AcegiServices.class)
 326  0
     public static AuthenticationEntryPoint buildAuthenticationEntryPoint(
 327  0
             @Inject @Value("${acegi.loginform.url}") final String loginFormUrl)
 328  0
     throws Exception {
 329  0
         AuthenticationProcessingFilterEntryPoint entryPoint = new AuthenticationProcessingFilterEntryPoint();
 330  0
         entryPoint.setLoginFormUrl(loginFormUrl);
 331  0
         entryPoint.afterPropertiesSet();
 332  0
         return entryPoint;
 333  0
     }
 334  0
 
 335  0
     @Marker(AcegiServices.class)
 336  0
     public static RequestFilter buildAcegiExceptionFilter(final RequestGlobals globals, final AuthenticationEntryPoint aep,
 337  0
             @Inject @Value("${acegi.accessDenied.url}") final String accessDeniedUrl)
 338  0
     throws Exception {
 339  0
         ExceptionTranslationFilter filter = new AcegiExceptionTranslationFilter();
 340  0
         filter.setAuthenticationEntryPoint(aep);
 341  0
         if (!accessDeniedUrl.equals("")) {
 342  0
             AccessDeniedHandlerImpl accessDeniedHandler = new AccessDeniedHandlerImpl();
 343  0
             accessDeniedHandler.setErrorPage(accessDeniedUrl);
 344  0
             filter.setAccessDeniedHandler(accessDeniedHandler);
 345  0
         }
 346  0
         filter.afterPropertiesSet();
 347  0
         return new RequestFilterWrapper(globals, filter);
 348  
     }
 349  
 
 350  0
     public static void contributeRequestHandler(final OrderedConfiguration< RequestFilter > configuration,
 351  0
             @InjectService("AcegiExceptionFilter") final RequestFilter acegiExceptionFilter) {
 352  0
         configuration.add("AcegiExceptionFilter", acegiExceptionFilter, "after:ErrorFilter");
 353  0
     }
 354  
 
 355  
     // Contribute three aspects of module: presentation, entities and
 356  
     // configuration
 357  
     public static void contributeComponentClassResolver(
 358  
             final Configuration< LibraryMapping > configuration) {
 359  0
         configuration.add(new LibraryMapping("security", "nu.localhost.tapestry.acegi"));
 360  0
     }
 361  
 }