异常类型
对于SpringSecurity框架而言,在实现认证和授权业务时,可能出现如下两大类型异常:
1)AuthenticationException (用户还没有认证就去访问某个需要认证才可访问的方法时,可能出现的异常,这个异常通常对应的状态码401)
2)AccessDeniedException (用户认证以后,在访问一些没有权限的资源时,可能会出现的异常,这个异常通常对应的状态吗为403)
异常处理规范
SpringSecurity框架给了默认的异常处理方式,当默认的异常处理方式不满足我们实际业务需求时,此时我们就要自己定义异常处理逻辑,编写逻辑时需要遵循如下规范:
1)AuthenticationEntryPoint:统一处理 AuthenticationException 异常
2)AccessDeniedHandler:统一处理 AccessDeniedException 异常.
自定义异常处理对象
处理没有认证的访问异常
package com.cy.jt.config;
public class DefaultAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException e) throws IOException, ServletException {
//设置响应数据的编码
response.setCharacterEncoding("utf-8");
//告诉浏览器要响应的内容类型,以及编码
response.setContentType("application/json;charset=utf-8");
Map<String,Object> map=new HashMap<>();
map.put("state",401);
map.put("message","请先登录");
PrintWriter out=response.getWriter();
out.println(new ObjectMapper().writeValueAsString(map));
out.flush();
out.close();
}
}
处理没有权限时抛出的异常
package com.cy.jt.config;
public class DefaultAccessDeniedExceptionHandler implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request,
HttpServletResponse response,
AccessDeniedException e) throws IOException, ServletException {
//设置响应数据的编码
response.setCharacterEncoding("utf-8");
//告诉浏览器要响应的内容类型,以及编码
response.setContentType("application/json;charset=utf-8");
Map<String,Object> map=new HashMap<>();
map.put("state",403);
map.put("message","没有此资源的访问权限");
PrintWriter out=response.getWriter();
out.println(new ObjectMapper().writeValueAsString(map));
out.flush();
out.close();
}
}
配置异常处理对象
在配置类SecurityConfig中添加自定义异常处理对象,代码如下
http.exceptionHandling()
.authenticationEntryPoint(new DefaultAuthenticationEntryPoint())
.accessDeniedHandler(new DefaultAccessDeniedExceptionHandler());
配置完成后,重启服务进行访问测试分析.