2016-05-04 15 views
4

ich die Standard-Zugriff verweigert Seite ersetzen möchten:Benutzerdefinierte HTTP-403-Seite funktioniert nicht in Spring Security

HTTP 403

Mit meiner benutzerdefinierten Seite und mein Ansatz war:

@Configuration 
@EnableWebSecurity 
public class SecurityContextConfigurer extends WebSecurityConfigurerAdapter { 

    @Autowired 
private UserDetailsService userDetailsService; 

@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring().antMatchers("/resources/**"); 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http.sessionManagement().maximumSessions(1) 
      .sessionRegistry(sessionRegistry()).expiredUrl("/"); 
    http.authorizeRequests().antMatchers("/").permitAll() 
      .antMatchers("/register").permitAll() 
      .antMatchers("/security/checkpoint/for/admin/**").hasRole("ADMIN") 
      .antMatchers("/rest/users/**").hasRole("ADMIN").anyRequest() 
      .authenticated().and().formLogin().loginPage("/") 
      .defaultSuccessUrl("/welcome").permitAll().and().logout() 
      .logoutUrl("/logout"); 
} 

@Bean 
public SessionRegistry sessionRegistry() { 
    return new SessionRegistryImpl(); 
} 

@Bean 
public AuthenticationProvider daoAuthenticationProvider() { 
    DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider(); 
    daoAuthenticationProvider.setUserDetailsService(userDetailsService); 

    return daoAuthenticationProvider; 

} 

@Bean 
public ProviderManager providerManager() { 

    List<AuthenticationProvider> arg0 = new CopyOnWriteArrayList<AuthenticationProvider>(); 
    arg0.add(daoAuthenticationProvider()); 

    return new ProviderManager(arg0); 

} 

@Bean(name = "myAuthenticationManagerBean") 
@Override 
public AuthenticationManager authenticationManagerBean() throws Exception { 
    return super.authenticationManagerBean(); 
} 

@Override 
protected AuthenticationManager authenticationManager() throws Exception { 
    return providerManager(); 
} 

    @Bean 
    public ExceptionTranslationFilter exceptionTranslationFilter() { 
     ExceptionTranslationFilter exceptionTranslationFilter = 
       new ExceptionTranslationFilter(new CustomAuthenticationEntryPoint()); 
     exceptionTranslationFilter.setAccessDeniedHandler(accessDeniedHandler()); 

     return exceptionTranslationFilter; 
    } 
    @Bean 
    public AccessDeniedHandlerImpl accessDeniedHandler() { 
     AccessDeniedHandlerImpl accessDeniedHandlerImpl = new 
       AccessDeniedHandlerImpl(); 
     accessDeniedHandlerImpl.setErrorPage("/page_403.jsp"); 
     System.out.println("ACCESS DENIED IS CALLED......"); 
     return accessDeniedHandlerImpl; 
    } 

    private class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint{ 

     @Override 
     public void commence(HttpServletRequest request, HttpServletResponse response, 
       AuthenticationException authenticationException) throws IOException, 
       ServletException { 

      response.sendError(HttpServletResponse.SC_FORBIDDEN, 
        "Access denied."); 
     } 

    } 

} 

Aber mit Diese Konfiguration oben bin immer noch nicht die Arbeit erledigt und das gleiche zu sehen

HTTP 403

Gibt es mehr Bohnen, die für diesen Zweck injiziert werden müssen?

+1

Was noch deutlicher zeigt, dass Sie nichts außer ein paar Bohnen konfiguriert haben. Einfaches Hinzufügen von Beans wird nicht helfen, auch Sie machen es zu komplex, es kann einfacher gemacht werden (siehe die Antworten und das Referenzhandbuch). –

Antwort

3

Haftungsausschluss: Dies ist nicht nur Lösung, sondern eine Arbeitsgruppe ein.

In diesem Fall mein Ansatz wäre so einfach wie möglich sein, die diese Methode ist

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http.sessionManagement().maximumSessions(1) 
      .sessionRegistry(sessionRegistry()).expiredUrl("/"); 
    http.authorizeRequests().antMatchers("/").permitAll() 
      .antMatchers("/register").permitAll() 
      .antMatchers("/security/checkpoint/for/admin/**").hasRole("ADMIN") 
      .antMatchers("/rest/users/**").hasRole("ADMIN").anyRequest() 
      .authenticated().and().formLogin().loginPage("/") 
      .defaultSuccessUrl("/welcome").permitAll().and().logout() 
      .logoutUrl("/logout").and() 
      .exceptionHandling().accessDeniedPage("/page_403");//this is what you have to do here to get job done. 
} 

Referenz in Ihrem Security hinzufügen: Custom 403 Page in Spring Security.

1

Wie @M. Deinum wies darauf hin, du solltest Spring Security sagen, wie man diese Bohnen einbaut. Auf jeden Fall gibt es eine viel einfachere Art und Weise für das, was Sie erreichen wollen:

@Configuration 
@EnableWebSecurity 
public class SecurityContextConfigurer extends WebSecurityConfigurerAdapter { 
    // Rest omitted 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       // The usual stuff 
       .exceptionHandling() 
        .accessDeniedPage("/page_403.jsp") 
        .authenticationEntryPoint((request, response, authException) -> { 
         response.sendError(HttpServletResponse.SC_FORBIDDEN); 
        }); 
    } 
} 
Verwandte Themen