当前位置: 首页 > news >正文

全新2.0版本极其抽象的门(Spring Security)

旧日版回顾:1.0版本

门的本质就是阻挡前往目的地的问题,再简单点门 === 问题

也就是说,只要这个东西拦住你前往目的,那他就可以赋予一个名——门!!!

    第一道验证:立门 -》authorizeHttpRequests第二道验证:非法越门警告 -》exceptionHandling第三道验证:数据库用户信息 -》userDetailsService第四道验证:登录验证 -》formLogin第五道验证:退出验证 -》logout第六道验证:记住登录 -》rememberMe第七道验证:异地防御,远程登录 -》cors(跨源资源共享)第八道验证:金库保险门 -》CSRF(在未上线时,为了方便自己建议关闭,上线了记得开启!!!)构建特殊的门!!!

这是目前所用到的八道门!,配置采用lambda表达式

  @Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception{return http.authorizeHttpRequests(cof ->{cof.requestMatchers("/api/auth/**").permitAll();//大门可放行区cof.anyRequest().authenticated();//任何请求都要通过大门}).exceptionHandling(cof ->{cof.authenticationEntryPoint(this::onAuthenticationFailure);//暴力非法闯入警告}).userDetailsService(userService).formLogin(cof ->{cof.loginProcessingUrl("/api/auth/login");//登录验证门的位置cof.successHandler(this::onAuthenticationSuccess);//成功登录提示cof.failureHandler(this::onAuthenticationFailure);//登录失败提示}).logout(cof ->{cof.logoutUrl("/api/auth/logout");//退出登录门的位置cof.logoutSuccessHandler(this::onAuthenticationSuccess);//成功退出提示}).rememberMe(cof->{cof.rememberMeParameter("remember");//记住登录关键词cof.tokenRepository(tokenRepository());//凭证存储器cof.tokenValiditySeconds(3600 * 24 *7);//过期时间}).cors(cof ->{cof.configurationSource(configurationSource());//自定义cors}).csrf(AbstractHttpConfigurer::disable)//关闭金库大门.build();}@Beanpublic BCryptPasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();//加密}//储存登录token于数据库@Beanpublic PersistentTokenRepository tokenRepository(){JdbcTokenRepositoryImpl repository = new JdbcTokenRepositoryImpl();repository.setDataSource(dataSource);//数据源repository.setCreateTableOnStartup(false);//每次启动时自动创建数据库表单储存token(),在第一次启动时,使用true创建表单,后续使用falsereturn repository;}//自定义cors配置private CorsConfigurationSource configurationSource(){CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.addAllowedOriginPattern("*");corsConfiguration.setAllowCredentials(true);corsConfiguration.addAllowedHeader("*");corsConfiguration.addAllowedMethod("*");corsConfiguration.addExposedHeader("*");UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();urlBasedCorsConfigurationSource.registerCorsConfiguration("/**",corsConfiguration);return urlBasedCorsConfigurationSource;}//成功响应头public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {response.setHeader("Content-Type", "text/plain; charset=UTF-8");//中文响应response.setCharacterEncoding("UTF-8");//请求路径如果是login,响应登陆成功if (request.getRequestURI().endsWith("/login")){response.getWriter().write(JSONObject.toJSONString(Result.success("登录成功")));//转换成json}//请求路径如果是logout,响应登录失败if (request.getRequestURI().endsWith("/logout")){response.getWriter().write(JSONObject.toJSONString(Result.success("退出登录成功")));//转换成json}}//失败响应头public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {response.setHeader("Content-Type", "text/plain; charset=UTF-8");//中文响应response.setCharacterEncoding("UTF-8");response.getWriter().write(JSONObject.toJSONString(Result.error(exception.getMessage())));//转换成json}

响应内容模板:

@Data
//json格式实体类
public class Result<T> {private Integer code;private boolean success;private T message;public Result(Integer code, boolean success, T message) {this.code = code;this.success = success;this.message = message;}public static <T> Result<T> success(){return new Result<>(0,true,null);}public static <T> Result<T> success(T data){return new Result<>(0,true,data);}public static <T> Result<T> error(T message){return new Result<>(1,false,message);}
}

相关文章:

  • Unity RectTransform·屏幕坐标转换
  • 【研发日记】Matlab/Simulink技能解锁(三)——在Stateflow编辑窗口Debug
  • 2024目前三种有效加速国内Github
  • 算法修炼-动态规划之路径问题(1)
  • 代码随想录算法训练营第四十六天 139.单词拆分、多重背包(了解)、 背包总结
  • 类与对象的实践----日期相关函数的实现
  • 【硬件相关】IB网/以太网基础介绍及部署实践
  • cartographer ceres后端优化
  • 13. Springboot集成Protobuf
  • 【Spring连载】使用Spring Data访问 MongoDB----对象映射之对象引用
  • 文心一言 Python编程之
  • 【深度学习笔记】计算机视觉——图像增广
  • 蓝桥杯备战刷题two(自用)
  • Dsco Dropship EDI需求分析
  • 探索Redis 6.0的新特性
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • JavaScript设计模式与开发实践系列之策略模式
  • MobX
  • Python - 闭包Closure
  • react-native 安卓真机环境搭建
  • Spring Cloud中负载均衡器概览
  • 基于web的全景—— Pannellum小试
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 马上搞懂 GeoJSON
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 无服务器化是企业 IT 架构的未来吗?
  • 携程小程序初体验
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 进程与线程(三)——进程/线程间通信
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #includecmath
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #QT(串口助手-界面)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (ZT)一个美国文科博士的YardLife
  • (八)Flask之app.route装饰器函数的参数
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)基于IDEA的JAVA基础10
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net反编译的九款神器
  • .NET轻量级ORM组件Dapper葵花宝典
  • .so文件(linux系统)
  • /bin/rm: 参数列表过长"的解决办法
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略