spring security 入门与理解

2023-11-10

1.pom加载

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

加载进去后,自动拦截所有路径,需要先登录。默认账号为user,密码后台生成。
2.配置类

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //因为sping5以后不能明文密码所以得加密
    @Bean
    PasswordEncoder passwordEncoder(){
        return NoOpPasswordEncoder.getInstance();
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()//缓存中配置
                //账号配置,拥有admin权限
                .withUser("lee").password("123").roles("admin")
                .and()
                //账号配置,拥有user权限
                .withUser("wang").password("123").roles("user");

    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                //路径拦截,与访问权限
                .antMatchers("/admin/**").hasRole("admin")
              .antMatchers("/user/**").hasAnyRole("admin","user")
                .anyRequest().authenticated()//表示剩余的其他接口,登录之后就能访问
                .and()
                //路径登录路径
                .formLogin()
                .loginProcessingUrl("/doLogin")
                .permitAll()//和表单登录相关的接口统统都直接通过
                .and()
                .csrf().disable();//关闭csrf
    }
}

3.controller

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public  String hello(){
        return "say hello";
    }
    @GetMapping("/admin/hello")
    public  String admin(){
        return "say admin";
    }
    @GetMapping("/user/hello")
    public  String user(){
        return "say user";
    }
}

Lee 可以访问所有路径。王只可以访问user/hello,和hello。

4.配置类2.0
页面登录成功与登录失败的操作。并注销

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/admin/**").hasRole("admin")
                .antMatchers("/user/**").access("hasAnyRole('user','admin')")
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginProcessingUrl("/doLogin")
                .loginPage("/login")
                .usernameParameter("uname")
                .passwordParameter("passwd")
                .successHandler(new AuthenticationSuccessHandler() {
                    @Override
                    public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException {
                        resp.setContentType("application/json;charset=utf-8");
                        PrintWriter out = resp.getWriter();
                        Map<String, Object> map = new HashMap<>();
                        map.put("status", 200);
                        map.put("msg", authentication.getPrincipal());
                        out.write(new ObjectMapper().writeValueAsString(map));
                        out.flush();
                        out.close();
                    }
                })
                .failureHandler(new AuthenticationFailureHandler() {
                    @Override
                    public void onAuthenticationFailure(HttpServletRequest req, HttpServletResponse resp, AuthenticationException e) throws IOException, ServletException {
                        resp.setContentType("application/json;charset=utf-8");
                        PrintWriter out = resp.getWriter();
                        Map<String, Object> map = new HashMap<>();
                        map.put("status", 401);
                        if (e instanceof LockedException) {
                            map.put("msg", "账户被锁定,登录失败!");
                        } else if (e instanceof BadCredentialsException) {
                            map.put("msg", "用户名或密码输入错误,登录失败!");
                        } else if (e instanceof DisabledException) {
                            map.put("msg", "账户被禁用,登录失败!");
                        } else if (e instanceof AccountExpiredException) {
                            map.put("msg", "账户过期,登录失败!");
                        } else if (e instanceof CredentialsExpiredException) {
                            map.put("msg", "密码过期,登录失败!");
                        } else {
                            map.put("msg", "登录失败!");
                        }
                        out.write(new ObjectMapper().writeValueAsString(map));
                        out.flush();
                        out.close();
                    }
                })
                .permitAll()
                .and()
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessHandler(new LogoutSuccessHandler() {
                    @Override
                    public void onLogoutSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException {
                        resp.setContentType("application/json;charset=utf-8");
                        PrintWriter out = resp.getWriter();
                        Map<String, Object> map = new HashMap<>();
                        map.put("status", 200);
                        map.put("msg", "注销登录成功!");
                        out.write(new ObjectMapper().writeValueAsString(map));
                        out.flush();
                        out.close();
                    }
                })
                .and()
                .csrf().disable();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring security 入门与理解 的相关文章

随机推荐

  • 时序数据库timescaleDB安装

    参考链接 时序数据库timescaleDB安装 http www lwops cn thread 300 1 1 html 本环境在Centos7 5采用编译安装的方式 主要介绍PostgreSQL 11 7 TimescaleDB 1 6
  • 机器学习理论笔记(一):初识机器学习

    文章目录 1 前言 蓝色是天的机器学习笔记专栏 1 1 专栏初衷与定位 1 2 本文主要内容 2 机器学习的定义 2 1 机器学习的本质 2 2 机器学习的分类 3 机器学习的基本术语 4 探索 没有免费的午餐 定理 NFL 5 结语 1
  • tkinter控件样式

    文章目录 以按钮为例 共有参数 动态属性 tkinter系列 GUI初步 布局 绑定变量 绑定事件 消息框 文件对话框 控件样式 扫雷小游戏 强行表白神器 以按钮为例 tkinter对控件的诸多属性提供了可定制的功能 下面以最常用的按钮作为
  • 学习 Spring Boot:(二十九)Spring Boot Junit 单元测试

    前言 JUnit 是一个回归测试框架 被开发者用于实施对应用程序的单元测试 加快程序编制速度 同时提高编码的质量 JUnit 测试框架具有以下重要特性 测试工具 测试套件 测试运行器 测试分类 了解 Junit 基础方法 加入依赖 在 po
  • Eclipse中的checkstyle插件

    一 Checkstyle工具 Checkstyle是一款检查Java程序源代码样式的工具 它可以有效的帮助我们检视代码以便更好的遵循代码编写标准 官方地址 http checkstyle sourceforge net 二 在Eclipse
  • PPT模板

    http www officeplus cn List shtml cat PPT tag 1
  • CH3-Android常见界面控件

    目标 掌握简单控件的使用 能够独立搭建一个注册界面 掌握ListView控件与RecyclerView控件的使用 能独立搭建列表界面 掌握自定义控件的定义方式 能够自定义一个简单的控件 几乎每一个Android应用都是通过界面控件与用户交互
  • Linux--多线程(1)

    目录 一 概念 二 理解 三 创建 退出 合并进程 man pthread create Compile and link with pthread 1 为什么没有fun函数 2 加上sleep来改进 3 线程结束会不会影响主线程运行 4
  • Java应用调试利器——BTrace教程

    http www jianshu com p 26f19095d396 背景 生产环境中可能出现各种问题 但是这些问题又不是程序error导致的 可能是逻辑性错误 这时候需要获取程序运行时的数据信息 如方法参数 返回值来定位问题 通过传统的
  • ZRANGEBYSCORE

    ZRANGEBYSCORE key min max WITHSCORES LIMIT offset count 返回有序集 key 中 所有 score 值介于 min 和 max 之间 包括等于 min 或 max 的成员 有序集成员按
  • Python Tkinter详解 (四)文本输入框的使用

    同样的 我们先创建出一个最最最最最简单的输入框 我们在进行信息交互的时候 会经常使用输入框为我们的系统键入信息 那么他又有哪些属性呢 import tkinter as tk window tk Tk tk Entry window wid
  • STM32 基础系列教程 20 - RTC

    前言 学习stm32 RTC 实时时钟 的使用 学会用RTC实现钟表功能 示例详解 基于硬件平台 STM32F10C8T6最小系统板 MCU 的型号是 STM32F103c8t6 使用stm32cubemx 工具自动产生的配置工程 使用KE
  • 二叉树的相关列题!!

    对于二叉树 很难 很难 笔者也是感觉很难 虽然能听懂课程 但是 对于大部分的练习题并不能做出来 所以感觉很尴尬 因此 笔者经过先前的那篇博客 已经开启了大脑奇迹 现在还热乎着 刚刚的更文 二叉树讲解https blog csdn net w
  • OC学习篇之---类的延展

    前一篇文章我们介绍了类的类目概念和使用 http blog csdn net jiangwei0910410003 article details 41775329 那么这篇文章我们继续来介绍一下OC中的一个特性 延展 其实说白了 延展就是
  • 有关EMQX桥接的配置工作

    前言 桥接是一种连接多个 EMQ X 或者其他 MQTT 消息中间件的方式 不同于集群 工作在桥接模式下的节点之间不会复制主题树和路由表 桥接模式所做的是 按照规则把消息转发至桥接节点 从桥接节点订阅主题 并在收到消息后在本节点 集群中转发
  • Unity - 微信小游戏

    总参考 Unity WebGL 微信小游戏适配方案 公测 安装与使用 下载 Unity插件 并导入至游戏项目中 版本更新请查看更新日志 请查阅推荐引擎版本 安装时选择WebGL组件 最终选择Unity2021 2 5f1c1InstantG
  • 实战项目:图书管理系统介绍

    本文详细的介绍了实战项目之一的图书管理系统 下载后可以直接使用 也可以直接用于毕业设计 本系统前端使用的框架是vue2 elementUI 后端使用的框架为springboot mybatis maven 数据库使用的是myql数据库 安全
  • 【我不知道的css】巧用flex:0实现上方图片下方文字效果

    我不知道的css 巧用flex 0实现上方图片下方文字效果 要求 代码 原理 要求 要求使用flex布局实现下图所示的效果 容器内部左边为图片和文字 图片在上 文字在下 图片大小不一 文字长度不一 但要求文字根据图片的宽度自动换行 代码 d
  • java mysql教程基于_SpringBoot入门教程(五)Java基于MySQL实现附近的人

    附近的人 这个功能估计都不陌生 与之类似的功能最开始是在各大地图应用上接触过 比如搜附近的电影院 附近的超市等等 然而真正让附近的人火遍大江南北的应该是微信 附近的人 这个功能 记得微信刚出的时候 坊间还有一句 寂寞女聊玩微信 寂寞男人搜附
  • spring security 入门与理解

    1 pom加载