Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handle 401 Error (Spring Security)

I can handle 404 error.

@ResponseStatus(value = HttpStatus.NOT_FOUND)
    @ExceptionHandler(NoHandlerFoundException.class)
    @ResponseBody
    public void noHandlerFoundException (HttpServletResponse response) throws IOException{
       //some code
    }

But how to handle 401 error?

Edit I am using Java and not web.xml

Edit What should I put in NoHandlerFoundException to handle the HttpStatus.UNAUTHORIZED

Edit

I have method unsuccessfulAuthentication, when authentication failed:

public class StatelessLoginFilter extends AbstractAuthenticationProcessingFilter { 

    protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response,
                                                      AuthenticationException failed) throws IOException, ServletException {
                SecurityContextHolder.clearContext();

                if (logger.isDebugEnabled()) {
                    logger.debug("Authentication request failed: " + failed.toString());
                    logger.debug("Updated SecurityContextHolder to contain null Authentication");
                    logger.debug("Delegating to authentication failure handler " + failureHandler);
                }

        //        response.setCharacterEncoding("UTF-8");
        //        response.getWriter().write(jsonService.toString(jsonService.getResponse(false, "Не удалось авторизоваться", "401")));

                rememberMeServices.loginFail(request, response);
                failureHandler.onAuthenticationFailure(request, response, failed);

            }
        }

This code sent 401 error html. I need to send json, you can see it in comments.

like image 934
annoirq Avatar asked Sep 15 '15 12:09

annoirq


People also ask

How do I limit the number of login attempts in Spring Security?

Solution. Review the existing Spring Security's authentication class, the “locked” feature is already implemented. To enable the limit login attempts, you need to set the UserDetails. isAccountNonLocked to false.

How does Spring Security handle 403 Forbidden error?

Using Java, we can customize the 403 error handling process by using the accessDeniedPage() or accessDeniedHandler() methods while configuring the HttpSecurity element.


1 Answers

Here is a complete handler for all a little collection of error pages :

@Controller
public class ErrorCodeController extends BaseController {

    @ExceptionHandler(ApplicationException.class)
    @RequestMapping(value="errorPage400", method=RequestMethod.GET)
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    public String handleBadRequest(ApplicationException ex,HttpServletResponse response, ModelMap map) { 
        map.addAttribute("http-error-code", HttpStatus.BAD_REQUEST);
        return processErrorCodes(ex,response,map);
    }


    @ExceptionHandler(ApplicationException.class)
    @RequestMapping(value="errorPage401", method=RequestMethod.GET)
    @ResponseStatus(value=HttpStatus.UNAUTHORIZED,reason="Unauthorized Request")
    public String handleUnauthorizedRequest(ApplicationException ex,HttpServletResponse response, ModelMap map) { 
        map.addAttribute("http-error-code", HttpStatus.UNAUTHORIZED);
        return processErrorCodes(ex,response,map);
    }


    @ExceptionHandler(ApplicationException.class)
    @RequestMapping(value="errorPage404", method=RequestMethod.GET)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public String handleNotFoundRequest(ApplicationException ex,HttpServletResponse response, ModelMap map) { 
        map.addAttribute("http-error-code", HttpStatus.NOT_FOUND);
        return processErrorCodes(ex,response,map);
    }


    @ExceptionHandler(ApplicationException.class)
    @RequestMapping(value="errorPage500", method=RequestMethod.GET)
    @ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR,reason="Internal Server Error")
    public String handleInternalServerError(ApplicationException ex,HttpServletResponse response, ModelMap map) { 
        map.addAttribute("http-error-code", HttpStatus.INTERNAL_SERVER_ERROR);
        return processErrorCodes(ex,response,map);
    }

    @ExceptionHandler(ApplicationException.class)
    public void handleApplicationExceptions(Throwable exception, HttpServletResponse response) {

    }

    private String processErrorCodes(ApplicationException ex,HttpServletResponse response, ModelMap map){
        map.addAttribute("class", ClassUtils.getShortName(ex.getClass()));
        map.addAttribute("message", ex.getMessage());
        map.addAttribute("errorMessage", ex.getErrorMessage());
        map.addAttribute("errorCode", ex.getErrorCode());
        map.addAttribute("timestamp", ex.getCurrentDate());
        return "errorPage";
    }


}

Base Controller :

@Controller
@RequestMapping("/")
public class BaseController {

    // Remember to add any exception that you suspect can be thrown in this web application.


@ExceptionHandler({ApplicationException.class,NullPointerException.class})
    public ModelAndView handleException(Throwable exception,HttpServletRequest req) {

        ModelMap model = new ModelMap();
        ApplicationException ex = new ApplicationException();
        String timeStamp = ex.getCurrentDate().toString();
        //String temp = ClassUtils.getShortName(ex.getClass());
        //model.addAttribute("class", ClassUtils.getShortName(ex.getClass()));
        model.addAttribute("timeStamp", timeStamp);
        return new ModelAndView("errorPage", model);
    } 

Web.xml :

<web-app id="WebApp_ID" version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>myApp</display-name>
    <error-page>
        <error-code>400</error-code>
        <location>/errorPage400.xhtml</location>
    </error-page>
    <error-page>
        <error-code>401</error-code>
        <location>/errorPage401.xhtml</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/errorPage404.xhtml</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/errorPage500.xhtml</location>
    </error-page>
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/errorPage.xhtml</location>
    </error-page>
like image 147
Chaibi Alaa Avatar answered Oct 19 '22 08:10

Chaibi Alaa