Spring Security: настроить страницу 403, доступ запрещен

Spring Security: настроить страницу 403, доступ запрещен

В Spring Security, если неавторизованный пользователь попытается получить доступ к защищенной странице, будет отображаться значение по умолчанию «http 403 access denied»:

spring-security-403-default

В этом уроке мы покажем вам, как настроить страницу запрещенного доступа 403 в Spring Security.

1. Конфигурация Spring Security

Просмотрите конфигурацию, если «alex» попытается получить доступ к странице/admin, отобразится страница с запрещенным доступом 403.

Spring-Security.xml

  
    
    
  

  
    
      
        
        
      
    
  

2. Решение - настроить страницу 403

2.1 Create a new 403 page.

403.jsp



    

HTTP Status 403 - Access is denied

${msg}

2.2. Чтобы отобразить страницу выше, добавьтеerror-page, как показано ниже:

Spring-Security.xml

    
        
        
    

2.3 In a controller class, add a mapping for “/403” url :

HelloController.java

package com.example.web.controller;

import java.security.Principal;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloController {

    // for 403 access denied page
    @RequestMapping(value = "/403", method = RequestMethod.GET)
    public ModelAndView accesssDenied(Principal user) {

        ModelAndView model = new ModelAndView();

        if (user != null) {
            model.addObject("msg", "Hi " + user.getName()
            + ", you do not have permission to access this page!");
        } else {
            model.addObject("msg",
            "You do not have permission to access this page!");
        }

        model.setViewName("403");
        return model;

    }

}

Готово.

Для пользователей аннотаций используйте.exceptionHandling().accessDeniedPage("/403").

SecurityConfig.java

package com.example.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

     http.authorizeRequests()
        .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
        .and().formLogin()
        .loginPage("/login").failureUrl("/login?error")
        .usernameParameter("username")
        .passwordParameter("password")
        .and().logout().logoutSuccessUrl("/login?logout")
        .and()
        .exceptionHandling().accessDeniedPage("/403")
    }
}

3. AccessDeniedHandler

Кроме того, вы можете создать собственныйAccessDeniedHandler для выполнения некоторой бизнес-логики перед передачей URL-адреса в сопоставление/403.

MyAccessDeniedHandler.java

package com.example.web.exception;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;

public class MyAccessDeniedHandler implements AccessDeniedHandler {

    private String errorPage;

    public MyAccessDeniedHandler() {
    }

    public MyAccessDeniedHandler(String errorPage) {
        this.errorPage = errorPage;
    }

    public String getErrorPage() {
        return errorPage;
    }

    public void setErrorPage(String errorPage) {
        this.errorPage = errorPage;
    }

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response,
        AccessDeniedException accessDeniedException)
                throws IOException, ServletException {

        //do some business logic, then redirect to errorPage url
        response.sendRedirect(errorPage);

    }

}

Добавьтеref в тег http.

Spring-Security.xml

    
        
        
    

    
        
    

Готово.

4. Demo

Когда «alex» пытается получить доступ к странице/admin, будет отображаться страница с отказом в доступе 403, указанная выше.

4.1 If using error-page, url will be displayed like this :

spring-security-403-example1

4.2 If using custom access denied handler ref, url will be displayed like this :

spring-security-403-example2

Скачать исходный код

Скачать -spring-security-403-access-denied.zip (26 КБ)