springSecurity学习之springSecurity过滤web请求

过滤web请求

在spring中存在一个DelegatingFilterProxy,是一种特殊的Filter,主要任务就是将工作委托给Filter实现类

使用@EnableWebSecurity注解时引入FilterChainProxy

@Bean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)
public Filter springSecurityFilterChain() throws Exception {boolean hasConfigurers = webSecurityConfigurers != null&& !webSecurityConfigurers.isEmpty();if (!hasConfigurers) {WebSecurityConfigurerAdapter adapter = objectObjectPostProcessor.postProcess(new WebSecurityConfigurerAdapter() {});webSecurity.apply(adapter);}return webSecurity.build();
}

可以使用WebApplicationInitializer的方式来配置DelegatingFilterProxy,其会自动为每个url注册springSecurityFilterChain过滤器(也就是DelegatingFilterProxy),添加一个ContextLoaderListener来载入WebSecurityConfig

// AbstractSecurityWebApplicationInitializer类实现了WebApplicationInitializer接口,spring会发现,并在web容器中注册DelegatingFilterProxy
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {}

DelegatingFilterProxy会拦截发往应用中的请求,并将请求委托给springSecurityFilterChain,springSecurityFilterChain本身是另一种特殊的Filter,可以连接任意一个或多个其他的Filter

private void insertSpringSecurityFilterChain(ServletContext servletContext) {// DEFAULT_FILTER_NAME就是springSecurityFilterChainString filterName = DEFAULT_FILTER_NAME;DelegatingFilterProxy springSecurityFilterChain = new DelegatingFilterProxy(filterName);String contextAttribute = getWebApplicationContextAttribute();if (contextAttribute != null) {springSecurityFilterChain.setContextAttribute(contextAttribute);}registerFilter(servletContext, true, filterName, springSecurityFilterChain);
}

配置Spring Security

使用@EnableWebSecurity注解来启用web安全功能,需要配置在实现了WebSecurityConfigurer或者继承WebSecurityConfigurerAdapter类的bean上

@Configuration
@EnableWebSecurity // 引入了WebSecurityConfiguration和AuthenticationConfiguration配置
// 继承WebSecurityConfigurerAdapter来自定义配置,只会覆盖修改的配置,不会覆盖不相关的配置
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {// 通过重载,配置userDetail服务,认证相关的配置protected void configure(AuthenticationManagerBuilder auth) throws Exception {}// 通过重载,配置Filter链public void configure(WebSecurity web) throws Exception {}// 通过重载,配置如何通过拦截器保护请求protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();}
}
用户信息获取

首先来将第一个configure方法,来进行用户信息的获取

// 通过重载,配置userDetail服务protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService);}

使用自定义的用户服务

public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate AdminDao adminDao;@Transactional(readOnly = true)public UserDetails loadUserByUsername(String username)throws UsernameNotFoundException {// 查找用户Admin user = adminDao.findByName(username);if (user == null) {throw new UsernameNotFoundException("Username not found");}// 创建权限List<GrantedAuthority> authorities = new ArrayList<>();authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));return new org.springframework.security.core.userdetails.User(user.getUser_name(), user.getPassword(),authorities);}
}
详细样例
 // 通过重载,配置如何通过拦截器保护请求protected void configure(HttpSecurity http) throws Exception {// 对不同的请求进行不同程度的认证http.formLogin() // 配置登录页.loginPage("/login.html")  // 自定义编写登录页面.loginProcessingUrl("/user/login") // 登录访问路径.defaultSuccessUrl("/index") // 登陆成功之后跳转路径.and().logout().logoutUrl("/logout") // 退出登录的路径.logoutSuccessUrl("/index") // 退出登录成功的页面.and().authorizeRequests() // // 配置请求级别的认证.antMatchers("/","/test/").permitAll() // permitAll表示可以直接访问,不需要认证.antMatchers("/user").authenticated() //authenticated表示必须已经登录了系统 .antMatchers("/admin/").hasAuthority("admin") // hasAuthority用户具备该权限可以访问.antMatchers("/teacher/").hasAnyAuthority("admin","teacher")  // hasAnyAuthority用户具备其中一个权限就可以访问.antMatchers("/super/").hasRole("admin")  //hasRole用户具备该角色可以访问,会拼接一个ROLE_前缀,使用的是角色是 ROLE_admin.antMatchers("/student/").hasAnyRole("admin","teacher","student") // hasAnyRole如果用户具备其中一个角色就可以访问.antMatchers("/school/").access("hasRole('admin')") //access使用给定的spel表达式来计算结果 .antMatchers("/ss/").anonymous()  // anonymous允许匿名用户访问.antMatchers("/supper/").denyAll() // denyAll拒绝所有访问.antMatchers("/full/").fullyAuthenticated() //fullyAuthenticated 用户需要是完整认证(不是通过remeber-me功能认证的)允许访问.antMatchers("/ip/").hasIpAddress("127.0.0.1") // hasIpAddress 请求来自指定ip可以访问.antMatchers("/reme/").rememberMe() // 用户通过remember-me功能认证的允许访问.anyRequest().authenticated() // 其他需要认证.and().requiresChannel().anyRequest().requiresSecure() //requiresSecure配置需要https来进行访问  requiresInsecure配置需要http来进行访问.and().rememberMe().tokenValiditySeconds(3600).key("zhang") // rememberMe功能,保存时间3600s,rememberMe是将token存储在cookie中的,token包括用户名、密码、过期时间和私钥(key).and().csrf().disable() // 关闭csrf跨站请求伪造防护.exceptionHandling().accessDeniedPage("/unauth.html"); // 配置没有权限访问的自定义页面}

https://zhhll.icu/2021/框架/springSecurity/2.过滤web请求/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Amazon Web Services Lambda把天气预报推送到微信

最近北京开始下雨&#xff0c;开始和同事打赌几点能够雨停&#xff0c;虽然Iphone已经提供了实时天气&#xff0c;但是还是想用国内的API试试看看是不是更加准确些。 以下是我使用的服务&#xff1a; 地图SDK/APP获取 经纬度彩云天气API 通过地理位置获取天气信息Lambda 作为…

关于Mysql的面试题(实时更新中~)

一、主键约束与“not null unique”区别 1、作为Primary Key的域/域组不能为null&#xff0c;而Unique Key可以。 2、在一个表中只能有一个Primary Key&#xff0c;而多个Unique Key可以同时存在。unique not null 可以 将表的一列或多列定义为唯一性属性&#xff0c;而prima…

buu做题(6)

目录 [GWCTF 2019]我有一个数据库 [WUSTCTF2020]朴实无华 [GWCTF 2019]我有一个数据库 什么都没有, 尝试用dirsearch扫一下目录 可以扫到一个 /phpmyadmin 可以直接进入到数据库里面 但里面没什么东西 可以看到它的版本不是最新的, 搜一下相关的漏洞 phpMyAdmin 4.8.1后台文…

go关于string与[]byte再学深一点

目标&#xff1a;充分理解string与[]bytes零拷贝转换的实现 先回顾下string与[]byte的基本知识 1. string与[]byte的数据结构 reflect包中关于字符串的数据结构 // StringHeader is the runtime representation of a string.type StringHeader struct {Data uintptrLen int} …

ClickHouse 入门(一)【基本特点、数据类型与表引擎】

前言 今天开始学习 ClickHouse &#xff0c;一种 OLAP 数据库&#xff0c;实时数仓中用到的比较多&#xff1b; 1、ClickHouse 入门 ClickHouse 是俄罗斯的 Yandex&#xff08;搜索引擎公司&#xff09;在 2016 年开源的列式存储数据库&#xff08;HBase 也是列式存储&#xf…

Linux C服务需要在A服务和B服务都启动成功后才能启动

需求 C服务需要在A服务和B服务都启动成功后才能启动 服务编号服务名服务Anginx.service服务Bmashang.service服务Credis.service 实验 如果您想要 redis.service 在 nginx.service 和 mashang.service 都成功启动后才能启动&#xff0c;那么需要在 redis.service 的服务单元…

67| 上海市互联网行业招聘数据集的构建与可视化分析

一、数据集介绍 数据集概述 数据集文件可见 上海市互联网行业招聘数据集(

赞扬的10条原则

来自刘澜《领导力就是说对十句话》 1&#xff09; 赞扬的第一个原则&#xff0c;是赞扬要具体。不要只是说“你做得真好”&#xff0c;而 是要具体说你到底做了什么&#xff0c;怎么做得好。 2&#xff09;赞扬的第二个原则&#xff0c;是赞扬行为&#xff0c;而非品质。你赞扬…

某宝同款度盘不限速后台系统源码

简介&#xff1a; 某宝同款度盘不限速后台系统源码&#xff0c;验证已被我去除&#xff0c;两个后端系统&#xff0c;账号和卡密系统 第一步安装宝塔&#xff0c;部署卡密系统&#xff0c;需要环境php7.4 把源码丢进去&#xff0c;设置php7.4&#xff0c;和伪静态为thinkphp…

山东济南十大杰出人物起名大师颜廷利:影响世界的思想家哲学家教育家

在宇宙的广袤舞台上&#xff0c;各类智者以他们独特的方式揭示着世界的奥秘。数学家们在无尽的符号与公式中穿梭&#xff0c;像探索者般解锁着自然界的深层逻辑。考古学家们则跋涉于古老的土地&#xff0c;用他们的双手拂去岁月的尘埃&#xff0c;让沉睡的历史重见天日。 二十一…

spss是什么软件?spss有什么用

spss是什么软件&#xff1f; SPSS是一款数据统计、分析软件&#xff0c;它由IBM公司出品&#xff0c;这款软件平台提供了文本分析、大量的机器学习算法、数据分析模型、高级统计分析功能等&#xff0c;软件易学且功能非常强大&#xff0c;可以使用SPSS制作图表&#xff0c;例如…

LeetCode 第407场周赛个人题解

目录 100372. 使两个整数相等的位更改次数 原题链接 思路分析 AC代码 100335. 字符串元音游戏 原题链接 思路分析 AC代码 100360. 将 1 移动到末尾的最大操作次数 原题链接 思路分析 AC代码 100329. 使数组等于目标数组所需的最少操作次数 原题链接 思路分析 A…

汽车免拆诊断案例 | 2017 款林肯大陆车发动机偶尔无法起动

故障现象 一辆2017款林肯大陆车&#xff0c;搭载2.0T发动机&#xff0c;累计行驶里程约为7.5万km。车主进厂反映&#xff0c;有时按下起动按钮&#xff0c;起动机不工作&#xff0c;发动机无法起动&#xff0c;组合仪表点亮正常&#xff1b;多次按下起动按钮&#xff0c;发动机…

ubuntu 挂载硬盘,raspberry pi 树莓派,jetson

在Ubuntu中挂载硬盘&#xff0c;首先需要确认硬盘是否被系统识别&#xff0c;可以通过lsblk或fdisk -l命令查看。假设新硬盘被系统识别为/dev/sdb&#xff0c;你可以按照以下步骤进行挂载&#xff1a; 创建一个挂载点&#xff08;例如在/mnt下&#xff09;&#xff1a; sudo …

deque学习笔记

构造函数 //双端数组 #include<iostream> #include<deque> using namespace std; //deque内部有一个中控器 void printDeque(deque<int>& d) {for (deque<int> ::iterator it d.begin(); it ! d.end(); it) {cout << *it << " …

(21)起落架/可伸缩相机支架

文章目录 前言 1 连接到自动驾驶仪 2 通过任务规划器设置 3 其他参数 4 参数说明 前言 Copter 和 Plane 支持可伸缩的起落架/相机支架&#xff0c;由伺服机制激活&#xff08;如 Hobby King 出售的用于copters 的这些&#xff09;。齿轮/支架可以手动缩回或用一个辅助开关…

Go语言 字典(map)

本文主要为Go语言数据类型-字典&#xff08;map&#xff09;定义、特性及其示例整理的学习笔记。 目录 字典&#xff08;map&#xff09; 定义字典 分配空间 未分配空间直接赋值 分配空间及赋值 分配空间但不指定长度 定义时分配空间 遍历 判断key是否存在 访问不存在…

【 DHT11 温湿度传感器】使用STC89C51读取发送到串口、通过时序图编写C语言

文章目录 DHT11 温湿度传感器概述接线数据传送通讯过程时序图检测模块是否存在 代码实现总结对tmp tmp << 1;的理解对sendByte(datas[0]/10 0x30);的理解 DHT11 温湿度传感器 使用80C51单片机通过读取HDT11温湿度传感的数据&#xff0c;发送到串口。 通过时序图编写相应…

微信小程序数组绑定使用案例(一)

微信小程序数组绑定案例&#xff0c;修改数组中的值 1.Wxml 代码 <view class"list"><view class"item {{item.ischeck?active:}}" wx:for"{{list}}"><view class"title">{{item.name}} <text>({{item.id}…

Redis7(二)Redis持久化双雄

持久化之RDB RDB的持久化方式是在指定时间间隔&#xff0c;执行数据集的时间点快照。也就是在指定的时间间隔将内存中的数据集快照写入磁盘&#xff0c;也就是Snapshot内存快照&#xff0c;它恢复时再将硬盘快照文件直接读回到内存里面。 RDB保存的是dump.rdb文件。 自动触发…