SpringBoot 安全管理(一)

一、springSecurity入门

  • 添加依赖

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId></dependency>
  • 不做配置时,每次访问都需要验证,用户名默认为user,密码为启动时控制台打印的密文(每次启动都会随机生成),访问/logout即可注销登录

    • 如 Using generated security password: 31612171-4f6a-4c43-92ae-6826bc1d5e49
    • 注意,登录如果404,是因为没有配置页面,登录成功后默认跳转到 “/ ” 下面,没有页面,便404了
  • 手动配置(数据是写死的)

    • 在spring5以后,security是不允许明文的,必须加密

    • 在application.properties中配置

      spring.security.user.name=user
      spring.security.user.password=123
      spring.security.user.roles=admin
    • 在类中配置(注意继承了WebSecurityConfigurerAdapter,加上Configuration注解)

      @Configuration
      public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean
      PasswordEncoder passwordEncoder(){
      //这个已过期,作用是无需加密,允许明文
      return NoOpPasswordEncoder.getInstance();
      } @Override
      protected void configure(AuthenticationManagerBuilder auth) throws Exception {
      auth.inMemoryAuthentication()
      .withUser("user").password("123").roles("admin")
      .and() //可重复添加
      .withUser("user1").password("123").roles("super");
      }
      }
  • HttpSecurity(登陆注销相关的配置,有点长,请耐心观看)

     @Override
    protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests() //开启登录配置
    .antMatchers("admin/**").hasRole("admin") // 访问/admin下需要admin角色
    .antMatchers("user/**").hasAnyRole("admin","user") //访问/user下需要admin或user其中一个角色
    .anyRequest().authenticated() //除以上2个url 访问其他只需要登录
    .and()
    .formLogin()
    .loginProcessingUrl("/login") //配置登录接口
    .usernameParameter("uname") //定义用户名的key
    .passwordParameter("passwd") //定义密码的key
    //.successForwardUrl("xxxxx") 定义登录成功后跳转的页面(前后端不分离) .successHandler(new AuthenticationSuccessHandler() {
    @Override //定义成功后返回json数据 ,前后端分离
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
    response.setContentType("application/json;charset=utf-8");
    PrintWriter writer = response.getWriter();
    Map<String,Object> map = new HashMap<>();
    map.put("status",200);
    map.put("msg","success");
    writer.write(new ObjectMapper().writeValueAsString(map)); //将map以json格式输出
    writer.flush();
    writer.close();
    }
    }) .failureHandler(new AuthenticationFailureHandler() {
    @Override //定义失败后的操作(前后端分离)
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException {
    response.setContentType("application/json;charset=utf-8");
    PrintWriter writer = response.getWriter();
    Map<String,Object> map = new HashMap<>();
    map.put("status",401);
    if (e instanceof LockedException){
    map.put("msg","账户被锁定,登陆失败");
    }//在lockerException的父类的父类中就有很多异常,如下图,灵活使用
    writer.write(new ObjectMapper().writeValueAsString(map)); //将map以json格式输出
    writer.flush();
    writer.close();
    }
    })
    .permitAll() //登录接口对所有人开放
    .and() .logout()
    .logoutUrl("/logout")
    .logoutSuccessHandler(new LogoutSuccessHandler() {
    @Override //注销登录
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
    response.setContentType("application/json;charset=utf-8");
    PrintWriter writer = response.getWriter();
    Map<String,Object> map = new HashMap<>();
    map.put("status",200);
    map.put("msg","注销成功");
    writer.write(new ObjectMapper().writeValueAsString(map)); //将map以json格式输出
    writer.flush();
    writer.close();
    }
    })
    .permitAll();
    }

  • 多个HttpSecurity配置(使代码看起来更简洁)

    @Configuration

    public class Config2 {

      @Bean
    PasswordEncoder passwordEncoder(){
    return NoOpPasswordEncoder.getInstance();
    } @Autowired
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
    .withUser("user").password("123").roles("admin")
    .and()
    .withUser("user1").password("123").roles("super");
    } @Configuration
    @Order(1) //优先级 ,数字越小,级别越高
    public static class AdminSecurityConfig extends WebSecurityConfigurerAdapter(){
    //参考SecurityConfig的配置
    } @Configuration
    public static class UserSecurityConfig extends WebSecurityConfigurerAdapter(){
    //参考SecurityConfig的配置
    }

    }


  • 密码加密

    • @Bean
      PasswordEncoder passwordEncoder(){
      return new BCryptPasswordEncoder();
      }
    • SpringSecurity使用的密码加密比MD5+盐更加严谨,即使相同的明文,加密的密文也一样,不易被暴力破解,而且不用解决存盐问题,当然,世界上没有绝对的安全加密,只能说更加安全。


    如果有对你帮助,求点个赞。

SpringBoot 安全管理(一)的更多相关文章

  1. SpringBoot安全管理--(三)整合shiro

    简介: Apache Shiro 是一一个开源的轻量级的Java安全框架,它提供身份验证.授权.密码管理以及会话管理等功能. 相对于Spring Security, Shiro框架更加直观.易用,同时 ...

  2. SpringBoot安全管理--(二)基于数据库的认证

    简介: 上篇文章向读者介绍的认证数据都是定义在内存中的,在真实项目中,用户的基本信息以及角色等都存储在数据库中,因此需要从数据库中获取数据进行认证. 开始: 首先建表并且插入数据: pom.xml & ...

  3. SpringBoot安全管理--(一)SpringSecurity基本配置

    简介: Spring Boot针对Spring Security提供了自动化配置方案,因此可以使Spring Security非常容易地整合进Spring Boot项目中,这也是在Spring Boo ...

  4. 2流高手速成记(之五):Springboot整合Shiro实现安全管理

    废话不多说,咱们直接接上回 上一篇我们讲了如何使用Springboot框架整合Nosql,并于文章最后部分引入了服务端Session的概念 而早在上上一篇中,我们则已经讲到了如何使用Springboo ...

  5. Shiro 核心功能案例讲解 基于SpringBoot 有源码

    Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...

  6. 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础授权权限

    上一篇<[原]无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限>介绍了实现Shiro的基础认证.本篇谈谈实现 ...

  7. 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限

    开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他 ...

  8. springboot 注册dao层 service 层

    可以使用三种注解来引入DAO层的接口到spring容器中.1.@Mapper,写在每一个DAO层接口上,如下: 2.@MapperScan和@ComponentScan两者之一.前者的意义是将指定包中 ...

  9. 补习系列(6)- springboot 整合 shiro 一指禅

    目标 了解ApacheShiro是什么,能做什么: 通过QuickStart 代码领会 Shiro的关键概念: 能基于SpringBoot 整合Shiro 实现URL安全访问: 掌握基于注解的方法,以 ...

随机推荐

  1. python-圆周率的计算【random库的应用】

    圆周率的计算 ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪ ...

  2. FMT/FWT学习笔记

    目录 FMT/FWT学习笔记 FMT 快速莫比乌斯变换 OR卷积 AND卷积 快速沃尔什变换(FWT/XOR卷积) FMT/FWT学习笔记 FMT/FWT是算法竞赛中求or/and/xor卷积的算法, ...

  3. 软件——IDEA 超实用使用技巧分享

    前言 工欲善其事 ​必先利其器 最近受部门的邀请,给入职新人统一培训IDEA,发现有很多新人虽然日常开发使用的是IDEA,但是还是很多好用的技巧没有用到,只是用到一些基本的功能,蛮浪费IDEA这个优秀 ...

  4. train loss与test loss结果分析/loss不下降

    train loss与test loss结果分析 train loss 不断下降,test loss不断下降,说明网络仍在学习; train loss 不断下降,test loss趋于不变,说明网络过 ...

  5. 如何写好、管好单元测试?基于Roslyn+CI分析单元测试,严控产品提测质量

    上一篇文章中,我们谈到了通过Roslyn进行代码分析,通过自定义代码扫描规则,将有问题的代码.不符合编码规则的代码扫描出来,禁止签入,提升团队的代码质量. .NET Core技术研究-通过Roslyn ...

  6. 【Hadoop离线基础总结】伪分布模式环境搭建

    伪分布模式环境搭建 服务规划 适用于学习测试开发集群模式 步骤 第一步:停止单节点集群,删除/export/servers/hadoop-2.7.5/hadoopDatas,重新创建文件夹 停止单节点 ...

  7. Git管理修改、撤销修改、删除文件

    什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改. a.管理修改 对于提交修改, ...

  8. Git使用教程之SSH连接方式配置(二)

    什么是GitHub?这个网站就是提供Git仓库托管服务的. 什么是SSH Key?你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,大白话理解就是这两个仓库如果要进行远程同步,则我们需 ...

  9. Spring Cloud 系列之 Config 配置中心(三)

    本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Config 配置中心(一) Spring Cloud 系列之 Config 配置中心(二) 本篇文章讲解 Conf ...

  10. HDU 2017 (水)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2017 题目大意:给你段字符串,求出字符串中含有数字字符的个数 解题思路: 字符串输入输出的基本应用:h ...