SpringSecurity配置类--常用配置

2023-11-18

SpringSecurity配置类

在学习这门课的时候,实现各种功能时进行了各种配置。我想将各种配置综合讲述一下。

首先自定义配置类,需要继承WebSecurityConfigurerAdapter这个类。

在这个类里面做了一些默认配置

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter{
	....
}

自定义密码的加密方式:

更改PasswordEncoder的实现为BCryptPasswordEncoder

/**
 *  配置用户密码加密方式
 */
@Bean
public PasswordEncoder passwordEncoder(){
    return new BCryptPasswordEncoder(); // 这里使用 BCrypt (也可换别的)
}

注入Security工作图中的第二步–>用于验证JWT

​ 在接口中我们通过AuthenticationManager的authenticate方法来进行用户认证,所以需要在SecurityConfig中配置把AuthenticationManager注入容器。

注入AuthenticationManager,用它的方法进行认证

@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
}

使用时:

authenticationManager.authenticate()

安全过滤器链配置方法HttpSecurity http配置方法

默认配置

@Override
protected void configure(HttpSecurity http) throws Exception {
    super.configure(http);
}

super.configure(http);使用了父类中一些默认配置。查看源代码

protected void configure(HttpSecurity http) throws Exception {
    ((HttpSecurity)((HttpSecurity)((AuthorizedUrl)http.authorizeRequests().anyRequest()).authenticated()
                     .and())
     				.formLogin()
     				.and())
    				.httpBasic();
}

http.authorizeRequests().anyRequest().authenticated()表示对任何请求都要进行权限认证

http.formLogin(),加入了UsernamePasswordAuthenticationFilter过滤器。

默认配置:

  • 所有的请求访问都需要被授权。
  • 使用 form 表单进行登陆(默认路径为/login),也就是前几篇我们见到的登录页。
  • 防止 CSRF 攻击、XSS攻击。
  • 启用 HTTP Basic 认证

自定义配置

  • 关闭防止csrf攻击

    //前后端分离的项目需要关闭csrf
    http.csrf().disable()
    

    为什么要关闭防止csrf攻击?

    CSRF是指跨站请求伪造(Cross-site request forgery),是web常见的攻击之一。

    https://blog.csdn.net/freeking101/article/details/86537087

    SpringSecurity去防止CSRF攻击的方式就是通过csrf_token。后端会生成一个csrf_token,前端发起请求的时候需要携带这个csrf_token,后端会有过滤器进行校验,如果没有携带或者是伪造的就不允许访问。

    但是在前后端分离的项目中我们的认证信息其实是token,而token并不是存储中cookie中,并且需要前端代码去把token设置到请求头中才可以,所以CSRF攻击也就不用担心了。

    因此使用token是天然防止csrf攻击的。

  • 不通过Session获取SecurityContext

    //不通过Session获取SecurityContext
    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    

1. 权限配置

参考链接:

https://blog.csdn.net/qq_41865652/article/details/123685248

https://blog.csdn.net/Shair911/article/details/104181917/

http.authorizeRequests()主要是对url进行访问权限控制,通过这个方法来实现url授权操作。

http.authorizeRequests()也支持连缀写法,总体公式为:

​ url 匹配规则. 权限控制方法

1. anyRequest()
  • anyRequest(),表示匹配所有的url请求

    http.authorizeRequests()
            // 匹配所有的请求,并且所有请求都需要登录认证
            .anyRequest().authenticated();
    

2. antMatcher()
  • antMatcher(String regx),传递一个ant表达式参数,表示匹配所有满足ant表达式的请求

    • ant表达式中特殊字符解释

      规则 解释说明
      匹配一个字符
      * 匹配0个或多个字符
      ** 匹配0个或多个目录

      配置类代码示例:

      http.authorizeRequests()
              // 允许登录页面匿名访问
              .antMatchers("/showLogin", "/errPage").anonymous()
              // 所有的静态资源允许匿名访问
              .antMatchers(
                      "/css/**",
                      "/js/**",
                      "/images/**",
                      "/fonts/**",
                      "/favicon.ico"
                      ).anonymous()
              // 其他所有的请求都需要登录认证
              .anyRequest().authenticated();
      
  • antMatcher(HttpMethod.*, String regx),传递一个请求方法类型参数加ant表达式参数,表示匹配所有满足ant表达式的指定请求方式的url

    请求方式的枚举类如下:

    配置类代码示例:

    http.authorizeRequests()
        // 允许GET请求登录页面匿名访问
        .antMatchers(HttpMethod.GET, "/showLogin", "/errPage").anonymous();
    

3. regexMatchers()
  • regexMatchers()使用正则表达式进行匹配。和 antMatchers()主要的区别就是参数,

    antMatchers()参数是 ant 表达式,regexMatchers()参数是正则表达式。

    演示所有以.js 结尾的文件都被放行。

    http.authorizeRequests()
        // 所有以.js 结尾的文件都被放行
    	.regexMatchers( ".+[.]js").permitAll()
    
  • 两个参数时使用方式

    无论是 antMatchers()还是 regexMatchers()都具有两个参数的方法,其中第一个参数都是 HttpMethod,表示请求方式,当设置了HttpMethod 后表示只有设定的特定的请求方式才执行对应的权限设置。

    • 枚举类型 HttpMethod 内置属性如下:
      -在这里插入图片描述

4. mvcMatchers()
  • mvcMatchers()适用于配置了 servletPath 的情况。

    ​ servletPath 就是所有的 URL 的统一前缀。在 SpringBoot 整合SpringMVC 的项目中可以在 application.properties 中添加下面内容设置 ServletPath

    spring.mvc.servlet.path=/bjsxt
    

    ​ 在 Spring Security 的配置类中配置.servletPath()是 mvcMatchers()返回值特有的方法,antMatchers()和 regexMatchers()没有这个方法。在 servletPath()中配置了 servletPath 后,mvcMatchers()直接写 SpringMVC 中@RequestMapping()中设置的路径即可。

    http.authorizeRequests()
    	.mvcMatchers("demo").servletPath("/bjsxt").permitAll()
    

    ​ 如果不习惯使用 mvcMatchers()也可以使用 antMatchers(),下面代码和上面代码是等效的

    http.authorizeRequests()
    	.antMatchers( "/bjsxt/demo").permitAll()
    

2. 访问控制方法

方法名称 方法作用
permitAll() 表示所匹配的URL任何人都允许访问
anonymous() 表示可以匿名访问匹配的URL。和permitAll()效果类似,只是设置为anonymous()的url会执行filterChain中的filter
denyAll() 表示所匹配的URL都不允许被访问。
authenticated() 表示所匹配的URL都需要被认证才能访问
rememberMe() 允许通过remember-me登录的用户访问
access() SpringEl表达式结果为true时可以访问
fullyAuthenticated() 用户完全认证可以访问(非remember-me下自动登录)
hasRole() 如果有参数,参数表示角色,则其角色可以访问
hasAnyRole() 如果有参数,参数表示角色,则其中任何一个角色可以访问
hasAuthority() 如果有参数,参数表示权限,则其权限可以访问
hasAnyAuthority() 如果有参数,参数表示权限,则其中任何一个权限可以访问
hasIpAddress() 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问

配置案例示例:

//任何用户都可以访问
http.authorizeRequests().antMatchers("/index").permitAll();
http.authorizeRequests().antMatchers("/index").access("permitAll");]

//任何用户都不能访问
http.authorizeRequests().antMatchers("/home").denyAll();
http.authorizeRequests().antMatchers("/home").access("denyAll");

//认证用户可以访问(除了匿名认证)
http.authorizeRequests().antMatchers("/admin").authenticated();
http.authorizeRequests().antMatchers("/admin").access("authenticated");

//认证用户可以访问(除了匿名认证,记住我)
http.authorizeRequests().antMatchers("/admin").fullyAuthenticated();
http.authorizeRequests().antMatchers("/admin").access("fullyAuthenticated");
		
//记住我的认证可以访问
http.authorizeRequests().antMatchers("/admin").rememberMe();
http.authorizeRequests().antMatchers("/admin").access("rememberMe");

//匿名用户可以访问
http.authorizeRequests().antMatchers("/admin").anonymous();
http.authorizeRequests().antMatchers("/admin").access("anonymous");

//是否有权限
http.authorizeRequests().antMatchers("/index").hasAuthority("user");
http.authorizeRequests().antMatchers("/index").access("hasAuthority('user')");

//是否有任意一个权限
http.authorizeRequests().antMatchers("/home").hasAnyAuthority("update", "delete", "insert");
http.authorizeRequests().antMatchers("/home").access("hasAnyAuthority('update','delete','insert')");

//spring security中的role并非是一个或多个权限的集合,而是权限的一种,通常以ROLE_开头
//role就是ROLE_开头的权限
//注意:hasRole、hasAnyRole里面的role不需要以ROLE_开头,否则会报异常
//注意:如果在access里面使用hasRole、hasAnyRole则ROLE_前缀可加,可不加
http.authorizeRequests().antMatchers("/index").hasRole("GUEST");
http.authorizeRequests().antMatchers("/index").access("hasRole('GUEST')");
http.authorizeRequests().antMatchers("/admin").hasAuthority("ROLE_GUEST");
http.authorizeRequests().antMatchers("/home").hasAnyRole("GUEST", "USER", "ADMIN");
http.authorizeRequests().antMatchers("/home").access("hasAnyRole('ROLE_GUEST','ROLE_USER','ROLE_ADMIN')");

添加过滤器到过滤器链

  • 先将获取过滤器

    @Autowired
    private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; // 注入Jwt认证过滤器
    
  • 然后配置到过滤器链中

    http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
    //将jwtAuthenticationTokenFilter 过滤器放到UsernamePasswordAuthenticationFilter过滤器前。
    
    • addFilterBefore():将过滤器放到 **过滤器之前。

    • addFilter():将过滤器放到过滤器链最后。

    • addFilterAfter():将过滤器放到 **过滤器之后。

      http.addFilterAfter(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
      //将jwtAuthenticationTokenFilter 过滤器放到UsernamePasswordAuthenticationFilter过滤器后。
      
    • addFilterAt:将过滤器放在**过滤的位置。并不是取代。

配置异常处理器

  • 先获取异常处理器

    @Autowired
    AuthenticationEntryPoint authenticationEntryPoint;  // 注入(自定义的 认证过程中 出现异常的处理方法)
    
    @Autowired
    AccessDeniedHandler accessDeniedHandler;  // 注入(自定义 授权过程中 出现异常的处理方法)
    
  • 然后进行配置。

    /**
     * 配置异常处理器
     */
    http.exceptionHandling()
            .authenticationEntryPoint(authenticationEntryPoint)  // 配置认证失败处理器
            .accessDeniedHandler(accessDeniedHandler);           // 配置授权失败处理器
    

表单登录配置

取消默认的自带的表单登录配置

http.formLogin().disable();

配置演示

@SpringBootConfiguration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	protected void configure(HttpSecurity http) throws Exception  {
		http
			.formLogin()//开启formLogin默认配置			        
				.loginPage("/login/auth").permitAll()//请求时未登录跳转接口
		                .failureUrl("/login/fail")//用户密码错误跳转接口
				.defaultSuccessUrl("/login/success",true)//登录成功跳转接口
				.loginProcessingUrl("/login")//post登录接口,登录验证由系统实现
				.usernameParameter("username")	//要认证的用户参数名,默认username
				.passwordParameter("password")	//要认证的密码参数名,默认password
				.and()
			.logout()//配置注销
				.logoutUrl("/logout")//注销接口
				.logoutSuccessUrl("/login/logout").permitAll()//注销成功跳转接口
				.deleteCookies("myCookie") //删除自定义的cookie
				.and()
			.csrf().disable();           //禁用csrf
	}
}

使用formLogin()就会添加如下过滤器

  • UsernamePasswordAuthenticationFilter
  • DefaultLoginPageGeneratingFilter
  • DefaultLogoutPageGeneratingFilter

添加认证成功处理器和认证失败处理器

先获取认证成功处理器和认证失败处理器。

@Autowired
private AuthenticationSuccessHandler successHandler;

@Autowired
private AuthenticationFailureHandler failureHandler;

然后再进行配置

 http.formLogin()
    	//配置认证成功处理器
      .successHandler(successHandler)
		//配置认证失败处理器
      .failureHandler(failureHandler);

总的配置代码


@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true) // 开启SecurityConfig 权限控制功能
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; 

    @Autowired
    AuthenticationEntryPoint authenticationEntryPoint; 

    @Autowired
    AccessDeniedHandler accessDeniedHandler;


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                //前后端分离的项目需要关闭csrf
                .csrf().disable()
                //不通过Session获取SecurityContext
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                // 对于登录接口 允许匿名访问
                .antMatchers("/user/login").anonymous()
                // 除上面外的所有请求全部都需要认证即可访问
                .anyRequest().authenticated();

        
        http.exceptionHandling()
                .authenticationEntryPoint(authenticationEntryPoint)  // 配置认证失败处理器
                .accessDeniedHandler(accessDeniedHandler);           // 配置授权失败处理器

        //关闭默认的注销功能
        http.logout().disable();

        //把token校验过滤器添加到过滤器链中
        http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);

        // 允许跨域
        http.cors();


    }


    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }


    /**
     *  配置用户密码加密方式
     */
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder(); // 这里使用 BCrypt (也可换别的)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringSecurity配置类--常用配置 的相关文章

随机推荐

  • 个人银行管理系统6(C改Java)

    C语言版本 date h ifndef DATE H define DATE H class Date 日期类 private int year 年 int month 月 int day 日 int totalDays 该日期是从公元元年
  • vue项目中跳转到外部链接方法

    div 点我 div goPage url window location href url 直接跳转去外部的a链接
  • 关于Keil中Memory中观察不到数据变化的问题以及启动文件栈的初始化

    关于Keil中Memory中观察不到数据变化的问题 在KEIL中观察Memory数据变化 一定要记得只能在RAM地址或ROM之内观察 如下图所示 RAM的地址设置在地址为0x20000000开始的地方 大小为0x20000 因此只有在这个范
  • gorm+docker+mysql

    简介 ORM Object Relational Mapping 框架采用元数据来描述对象与关系映射的细节 元数据一般采用XML格式 并且存放在专门的对象一映射文件中 简单理解为一种框架的格式 gorm是Golang中一个非常出色的 旨在对
  • 38个MySQL数据库的小技巧

    1 如何快速掌握MySQL 培养兴趣 兴趣是最好的老师 不论学习什么知识 兴趣都可以极大地提高学习效率 当然学习MySQL 5 6也不例外 夯实基础 计算机领域的技术非常强调基础 刚开始学习可能还认识不到这一点 随着技术应用的深 入 只有有
  • java之MySQL数据库

    MySQL数据库 1 什么是数据库 答 数据库是以一定方式存储在一起 能予多个用户共享 具有尽可能小的冗余度 与应用程序彼此独立的数据集合 2 数据库的分类 具体含义 常见的数据库 答 关系型数据库和非关系型数据库 关系数据库 是建立在关系
  • springCloud - 第10篇 - 服务间调用追踪 (zipkin 的使用)

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到教程 一 在微服务系统中 不同应用服务可能会有各种不同的相互调用 springcloud 集成了 zipkin 来实现对于不同服务调用的追踪和统计
  • LIBSVM 使用

    预备 NTU TW Chih Chung Chang and Chih Jen Lin LIBSVM LIBSVM Data Classification Regression and Multi label 正文 a 编译libsvm u
  • 【机器学习】决策树 No.3

    1 决策树之信息论基础 决策树思想来源非常朴素 程序设计中的条件分支结构 if else 最早的决策树就是利用这类结构分割数据的一种分类学习方法 例 银行贷款例子 使用决策树划分是否贷款 此处特征为两个 房子 工作 香农 信息论创始人 19
  • 一文带你了解ES6迭代器(iterator)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 迭代器 iterator 是什么 二 工作原理 总结 一 迭代器 iterator 是什么 迭代器 iterator 是一种接口 为各种不同的数据结构提供统一的
  • SkipList(跳表)

    跳表简介 跳表是基于有序链表实现的搜索结构 是一种动态的搜索结构 即支持动态插入和删除操作 且跳表查找和删除的平均时间复杂度是Olog n 因此跳表是一种时间复杂度相对较小的搜索结构 我们知道对一个数据集合的查找 最差的时间复杂度是O n
  • Switch / Xbox / PS / PSV / PSP 游戏指南

    1 Switch Xbox PS PSV PSP 对比分析 table 1 PSV2000 1000 比较分析 PSV2000 相对 PSV1000 具体变更点 薄了20 轻了15 屏幕改为液晶屏 PS键 开始键和选择键变成球形更方便按 内
  • 2,一个人体姿态识别的项目实现

    学习opencv的例子 1 认识 2 start 直接干货 例子1 例子2 例子3 例子4 例子5 固定阈值 自适应阈值 文档说明 参考链接 http codec wang opencv start 02 basic element ima
  • git仓库创建及上传

    如何创建一个git仓库并上传代码 1 在此之前我们需要安装git和注册gitee账号 1 打开git官网下载安装程序 然后按照指令进行安装即可 2 搜索gitee进行注册和绑定邮箱即可 上传代码时需要登录gitee账号 安装成功之后告诉本地
  • Android apk 反编译解析

    学习android开发 有必要对android的反编译有所了解 当然学习android反编译并不是为了破解别人的软件 完全是一种学习的方法 了解别人写程序的思想是一件很有趣的事情 工具下载地址 http code google com p
  • androidstudio开发!花三分钟看完这篇文章你就懂了!技术详细介绍

    阿里面试 自我介绍 首先要介绍自己的项目经验和个人的擅长点 因为面试官主要考察你的表达能力和语言精简能力 简历的编写其实这里可能需要注意几点 1 标题的直接按照姓名 几年工作经验 应聘岗位格式来填写 例如 黄铭 四年工作经验 Android
  • STP与RSTP区别

    STP 不能快速迁移 即使是在点对点链路或边缘端口 边缘端口指的是该端口直接与用户终端相连 而没有连接到其它设备或共享网段上 也必须等待2 倍的ForwardDelay 的时间延迟 端口才能迁移到转发状态 RSTP Rapid Spanni
  • Python 异步: 异步上下文管理器(17)

    动动发财的小手 点个赞吧 上下文管理器是一种 Python 构造 它提供了一个类似 try finally 的环境 具有一致的接口和方便的语法 例如通过 with 表达 它通常与资源一起使用 确保在我们完成资源后始终关闭或释放资源 无论资源
  • VC++ OpenCV+ZBar二维码识别

    利用OpenCV处理图像的优势 结合ZBar提高二维码识别结果 接口定义 include
  • SpringSecurity配置类--常用配置

    SpringSecurity配置类 在学习这门课的时候 实现各种功能时进行了各种配置 我想将各种配置综合讲述一下 首先自定义配置类 需要继承WebSecurityConfigurerAdapter这个类 在这个类里面做了一些默认配置 Con