Spring security 个人理解

news2024/11/17 9:35:03

改文章写的很好:https://zhuanlan.zhihu.com/p/342755411

Spring security 分为两个部分

  1. 登陆认证
  2. 权限认证

登陆认证
其实就是就是登陆注册,然后获取登陆凭证的问题
操作如下

  1. 登陆账号密码,通过账号查询出用户数据,然后密码进行比对
  2. 比对成功,将用户信息插入 SecurityContextHolder 中
    ,这就是过了登陆认证。也就是说 UsernamePasswordAuthenticationFilter 拦截器将不在拦截
    在这里插入图片描述
@AutoConfiguration
// 需要配置权限认证的其实就只有这一段,添加这个注解就OK了
// 就是这个 prePostEnabled=true,有了它,就可以在方法上写注解来做权限验证
// 例如:@PreAuthorize("@实例类.方法('参数')")
// example:@PreAuthorize("@ss.hasPermission('true')")
// 具体看下面的权限验证部分
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class YudaoWebSecurityConfigurerAdapter {
... 省略其他代码

	/**
     * 配置 URL 的安全配置
     * 
     * 注意:
     * 其实这里主要是设置是否需要登录的
     * 权限验证其实不在这个地方
     *
     * anyRequest          |   匹配所有请求路径
     * access              |   SpringEl表达式结果为true时可以访问
     * anonymous           |   匿名可以访问
     * denyAll             |   用户不能访问
     * fullyAuthenticated  |   用户完全认证可以访问(非remember-me下自动登录)
     * hasAnyAuthority     |   如果有参数,参数表示权限,则其中任何一个权限可以访问
     * hasAnyRole          |   如果有参数,参数表示角色,则其中任何一个角色可以访问
     * hasAuthority        |   如果有参数,参数表示权限,则其权限可以访问
     * hasIpAddress        |   如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问
     * hasRole             |   如果有参数,参数表示角色,则其角色可以访问
     * permitAll           |   用户可以任意访问
     * rememberMe          |   允许通过remember-me登录的用户访问
     * authenticated       |   用户登录后可访问
     */
    @Bean
    protected SecurityFilterChain configure(HttpSecurity httpSecurity) throws Exception {
		// 设置每个请求的权限
        httpSecurity
                // ①:全局共享规则
                .authorizeRequests()
                // permitAll 关键点 这里就是意思要不要登陆
                .antMatchers(securityProperties.getPermitAllUrls().toArray(new String[0])).permitAll()
                // ③:兜底规则,必须认证
                .anyRequest().authenticated()
        ;

        // 添加 JWT Filter
        httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
        return httpSecurity.build();
    }
... 省略其他代码

权限验证

@AutoConfiguration
@EnableConfigurationProperties(SecurityProperties.class)
public class YudaoSecurityAutoConfiguration {
    @Resource
    private SecurityProperties securityProperties;

    /**
     * Spring Security 加密器
     * 考虑到安全性,这里采用 BCryptPasswordEncoder 加密器
     *
     * @see <a href="http://stackabuse.com/password-encoding-with-spring-security/">Password Encoding with Spring Security</a>
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     * 认证失败处理类 Bean
     */
    @Bean
    public AuthenticationEntryPoint authenticationEntryPoint() {
        return new AuthenticationEntryPointImpl();
    }

    /**
     * 权限不够处理器 Bean
     */
    @Bean
    public AccessDeniedHandler accessDeniedHandler() {
        return new AccessDeniedHandlerImpl();
    }

    /**
     * Token 认证过滤器 Bean
     */
    @Bean
    public TokenAuthenticationFilter authenticationTokenFilter(GlobalExceptionHandler globalExceptionHandler) {
        return new TokenAuthenticationFilter(securityProperties, globalExceptionHandler);
    }

    @Bean("ss") // 使用 Spring Security 的缩写,方便使用
    public SecurityFrameworkService securityFrameworkService() {
        return new SecurityFrameworkServiceImpl();
    }

}

权限验证

上面配置已经开启了注解 @PreAuthorize 来做权限验证
看懂这里就简单了。举例如下
例如:@PreAuthorize(“@实例类.方法(‘参数’)”)
example:@PreAuthorize(“@ss.hasPermission(‘true’)”)
这里实现就是:

  1. 开启注解@PreAuthorize做权限校验
  2. 注入名称为 ss 的bean
  3. 写入方法 hasPermission,方法返回true=权限校验通过,false=权限校验不通过

注入名称为 ss 的bean 如下:

// 创建一个权限校验类
@AllArgsConstructor
public class SecurityFrameworkServiceImpl {

    @Override
    public boolean hasPermission(String permission) {
        return permission.equals("true");
    }

    @Override
    public boolean hasAnyPermissions(String... permissions) {
        return false;
    }

    @Override
    public boolean hasRole(String role) {
        return false;
    }

    @Override
    public boolean hasAnyRoles(String... roles) {
        return false;
    }

    @Override
    public boolean hasScope(String scope) {
        return false;
    }

    @Override
    public boolean hasAnyScopes(String... scope) {
        return false;
    }
}
 // 实例化 权限校验类,并注入spring容器中
@Bean("ss")
public SecurityFrameworkService securityFrameworkService() {
    return new SecurityFrameworkServiceImpl();
}

到这里就结束了!
@PreAuthorize(“@ss.hasPermission(‘true’)”)
@PreAuthorize 开启校验
调用ss实例类中的hasPermission方法
返回结果为true=权限通过,false=权限不通过

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

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

相关文章

如何使用DeadFinder寻找失效链接

关于DeadFinder DeadFinder是一款功能强大的链接分析工具&#xff0c;该工具可以帮助广大研究人员快速地寻找目标页面中的无效链接&#xff08;死链&#xff09;。所谓死链&#xff0c;即一个页面中存在的无法被连接的一条链接。这些链接如果一直保留在页面中的话&#xff0c;…

Hive中的高阶函数(二)

1、UDTF之explode函数 explode(array)将array列表里的每个元素生成一行&#xff1b; explode(map)将map里的每一对元素作为一行&#xff0c;其中key为一列&#xff0c;value为一列&#xff1b; 一般情况下&#xff0c;explode函数可以直接使用即可&#xff0c;也可以根据需要结…

[python入门(53)] - python中的OS模块(包) - 2

目录 ❤ OS模块和path模块(函数) ❤ os模块中操作目录以及文件的函数 ❤ os模块中遍历目录数 ❤ 一些表现形式参数 ❤ 获取在进程的控制终端上登录的用户的名称&#xff1a; os.getlogin() &#xff08;即此时pc登录的用户名&#xff09; ❤ 总结 ❤ os.listdir()…

3月4日线下讲座《项目经理五项管理锦囊》

在项目管理过程中&#xff0c;你是否有过因为人际关系紧张&#xff0c;而导致团队协作不顺畅&#xff1f; 项目团队内耗严重&#xff0c;成员之间缺乏信任冲突较多&#xff0c;影响士气项目质量及项目周期等问题&#xff1f; 为什么会导致这样的结果&#xff1f;如何避免踩坑&a…

TAS5411QPWPRQ1引脚图LP873220RHDRQ1汽车应用开关稳压器

8W单声道汽车类D类音频放大器&#xff1a;TAS5411QPWPRQ1引脚图 【概述】TAS5411-Q1是一款单声道D类音频放大器&#xff0c;非常适用于汽车类紧急呼叫(eCall)、远程信息处理、仪表板应用。该器件采用14.4VDC汽车电池供电&#xff0c;可在负载为4Ω且THDN不超过10%的情况下提供高…

MQTT的学习之Mosquitto集群搭建

文章钢要&#xff1a; 1、进行双服务器搭建 2、进行多服务器搭建 一、Mosquitto的分布式集群部署 如果需要做并发量很大的时候就需要考虑做集群处理&#xff0c;但是我在查找资料的时候发现并不多&#xff0c;所以整理了一下&#xff0c;搭建简单的Mosquitto集群模式。 首…

Win11搜索栏无法使用怎么办?

随着Windows 11的正式发布&#xff0c;许多用户已经升级了他们的操作系统。但是安装Win11系统之后&#xff0c;人们发现它有一些问题。例如&#xff0c;Win11搜索栏无法使用&#xff0c;这极大地影响了用户体验。那我们该如何解决Windows搜索栏用不了这一问题&#xff1f;方法1…

Matplotlib精品学习笔记002-Pyplot详解,快速绘图

Matplotlib精品学习笔记002-Pyplot详解&#xff0c; matplotlib.pyplot集合了一系列功能&#xff0c;运行起来和MATLAB相似。 每个pyplot功能都会对画布&#xff08;figure&#xff09;进行修改&#xff1a;包括创建画布&#xff0c;在画布上创建一个画图区&#xff0c;向画图…

【JVM】垃圾回收器

垃圾回收器 Serial收集器 单线程&#xff0c;进行垃圾收集工作时必须暂停其他所有的工作线程。STW造成了不好的用户体验。 新生代采用复制算法&#xff0c;老年代采用标记整理算法。 Serial Old Serial 收集器的老年代版本&#xff0c;它同样是一个单线程收集器。它主要有两…

FairGuard-Windows加固工具版本更新日志

FairGuard-Windows加固工具1.2.2版本更新日志&#xff1a; ■ 增加Unity Resources资源加密的支持; ■ 增加单独Assetbundle资源加密&#xff0c;并同时支持压缩包和文件夹作为输入的方式; ■ 增加对游戏原文件夹加固的支持; Windows加固方案介绍 FairGuard专为游戏量身定…

IntelliJ IDEA 安装JRebel实现热部署详细版(亲测有效)

简介 JRebel可快速实现热部署&#xff0c;节省了大量重启时间&#xff0c;提高了个人开发效率。 JRebel是一款JVM插件&#xff0c;它使得Java代码修改后不用重启系统&#xff0c;立即生效。 安装JRebel 1.file–>setting–>plugins–>在Marketplace的搜索框输入JRe…

【记录问题】RuntimeError:working outside of application context. Flask使用SQLAlchemy数据库

前提&#xff1a;Flask使用SQLAlchemy数据库 本质&#xff1a;依赖包版本不匹配 问题1&#xff1a;报错RuntimeError&#xff1a;working outside of application context. 运行程序报错&#xff0c;如下错误&#xff1a; 原因&#xff1a;flask-sqlalchemy 版本过高导致&am…

试题 算法训练 自行车停放

问题描述 有n辆自行车依次来到停车棚&#xff0c;除了第一辆自行车外&#xff0c;每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或右边。(e.g.停车棚里已经有3辆自行车&#xff0c;从左到右编号为&#xff1a;3,5,1。现在编号为2的第4辆自行车要停在5号自行车的左…

python自学之《21天学通Python》(16)——第19章 用Pillow库处理图片

Pillow是Python2.X时代比较流行的Python ImagingLibrary&#xff08;简称Pillow&#xff09;图像处理库的分支&#xff0c;并修复了一些bug。Pillow提供了对Python3的支持&#xff0c;为Python3解释器提供了图像处理的功能。和Pillow库一样提供了广泛的文件格式支持、高效的内部…

IDEA如何创建一个springboot项目

要想进入springboot的殿堂&#xff0c;你的跨进springboot的门槛&#xff0c;下面就是使用IDEA初始话一个简单的springboot项目。 选择Create New Project 选择Spring Initializer——>选择对应的jdk版本——>Default默认在线构建&#xff0c;需要联网噢 选择自己想写…

2005-2019年我国地级市国内外旅游人数和收入数据

旅游产业的发展情况是一个城市经济和文化影响力的重要指标&#xff0c;我们在很多研究中都会用到旅游相关的数据&#xff0c;之前我们介绍过1978-2020年的中国旅游统计年鉴和2022年13604条的全国A级景区数据&#xff08;可以查看之前推送的文章&#xff09;。 本次我们为大家介…

上传文件-课后程序(JAVA基础案例教程-黑马程序员编著-第九章-课后作业)

【案例9-3】 客户端向服务端上传文件 【案例介绍】 1.案例描述 编写一个客户端向服务端上传文件的程序&#xff0c;要求使用TCP通信的的知识&#xff0c;将本地机器输入的路径下的文件上传到D盘中名称为upload的文件夹中。并把客户端的IP地址加上count标识作为上传后文件的文…

网络基础之IP地址和子网掩码

一、IP地址IP地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一个逻辑地址&#xff0c;以此来屏蔽物理地址的差异。习惯上&#xff0c;我们用分成四段的十进制数表示IP地址&#xff0c;从0.0.0.0 一直到255.255.255.255。互联网上的…

虚拟内存原理

局部性原理 计算机组成原理里我们可以知道cache掉入的数据都是连续的 我们可以看下面的例子&#xff0c;data创建的数组&#xff0c;因为我们要读入的是这个数组所以调入的是这一段内存的内容就大概率不会miss 但是我们要知道有些程序的代码被执行的几率是很小的&#xff0c;…

通达信KDJ抄底指标公式,利用J值小于0

前几天介绍了平滑KDJ指标公式&#xff0c;当时有人提出来不建议处理KDJ&#xff0c;KDJ的特点是灵敏&#xff0c;经过处理后就失去其意义了。不过我认为每种指标有相应的使用场景&#xff0c;不必拘泥于原始指标&#xff0c;指标也是人想出来的。今天就利用KDJ的灵敏&#xff0…