当前位置:网站首页>13-security其他.md
13-security其他.md
2022-08-03 00:34:00 【张 邵】
跨域处理
//允许跨域
http.cors();
放行swagger相关页面
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring()
.antMatchers(AUTH_WHITELIST); // 忽略swagger ui静态资源
}
// -- swagger ui忽略
private static final String[] AUTH_WHITELIST = {
// -- swagger ui
"/swagger-resources/**",
"/swagger-ui.html",
"/v2/api-docs",
"/webjars/**",
// swagger-boostrap-ui
"/doc.html"
};
异常处理
我们还希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json,这样可以让前端能对响应进行统一的处理。要实现这个功能我们需要知道SpringSecurity的异常处理机制。
在SpringSecurity中,如果我们在认证或者授权的过程中出现了异常会被ExceptionTranslationFilter捕获到。在ExceptionTranslationFilter中会去判断是认证失败还是授权失败出现的异常。
如果是认证过程中出现的异常会被封装成AuthenticationException然后调用AuthenticationEntryPoint对象的方法去进行异常处理。
如果是授权过程中出现的异常会被封装成AccessDeniedException然后调用AccessDeniedHandler对象的方法去进行异常处理。
所以如果我们需要自定义异常处理,我们只需要自定义AuthenticationEntryPoint和AccessDeniedHandler然后配置给SpringSecurity即可。
先注入对应的处理器
@Autowired
private AuthenticationEntryPoint authenticationEntryPoint;
@Autowired
private AccessDeniedHandler accessDeniedHandler;
然后我们可以使用HttpSecurity对象的方法去配置。
http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint).
accessDeniedHandler(accessDeniedHandler);
实现类
package com.zs.admin.security.exception;
import com.alibaba.fastjson.JSON;
import com.zs.model.common.dtos.ResponseResult;
import com.zs.utils.web.WebUtils;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class AccessDeniedHandlerImpl implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
ResponseResult result = new ResponseResult(HttpStatus.FORBIDDEN.value(), "权限不足");
String json = JSON.toJSONString(result);
WebUtils.renderString(response,json);
}
}
/** * 用户权限处理 * @author 11921 */
@Component
public class AccessDeniedHandlerImpl implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException, ServletException {
httpServletResponse.setContentType("application/json;charset=utf-8");
httpServletResponse.getWriter().write(JSON.toJSONString(new Result(false, StatusConst.AUTHORIZED,"没有操作权限")));
}
}
package com.zs.admin.security.exception;
import com.alibaba.fastjson.JSON;
import com.zs.model.common.dtos.ResponseResult;
import com.zs.utils.web.WebUtils;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
ResponseResult result = new ResponseResult(HttpStatus.UNAUTHORIZED.value(), "认证失败请重新登录");
String json = JSON.toJSONString(result);
WebUtils.renderString(response,json);
}
}
/** * 用户未登录处理 * * @author 11921 */
@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException {
httpServletResponse.setContentType("application/json;charset=utf-8");
httpServletResponse.getWriter().write(JSON.toJSONString(new Result(false, StatusConst.NOT_LOGIN, "请登录")));
}
}
边栏推荐
猜你喜欢
随机推荐
FreeRTOS任务管理
几种常见的跨域解决方法
升级版的冒泡排序:鸡尾酒排序(快乐小时排序)
文树勋率长沙市人大常委会主任会议成员莅临麒麟信安调研数字经济发展情况
flutter空安全问题,平时用到的数据一定要注意
vue3的keepAlive缓存组件
C语言:链表
flutter 每个要注意的点
Linear DP
2149. 按符号重排数组
微信小程序--》条件与列表渲染以及WXSS模板样式
开源聚力,共创未来 | 麒麟信安祝贺openKylin首个体验版正式发布!
全栈----跨域
全栈---CORS
SAP ABAP OData 服务如何支持修改(Update)操作试读版
聊聊 Nacos
图文详细解决IDEA使用Debug模式启动项目一直转圈圈跑起不来(亲测可以)
在表格数据上,为什么基于树的模型仍然优于深度学习?
49. 字母异位词分组-排序法
2022/8/2 考试总结