首页 > 其他分享 >SpringSecurity:hasAuthority与自定义权限校验

SpringSecurity:hasAuthority与自定义权限校验

时间:2024-07-24 18:06:53浏览次数:7  
标签:hasAuthority return String 自定义 SpringSecurity csrf 权限

springsecurity中有两种权限控制方法

1.基于注解

@PreAuthorize("hasAuthority('syst:add')")

他的作用是在controller方法上进行权限校验,如果该用户具有对应的权限则放行,否则抛出AccessDeniedHandler,403(权限不足)

2.基于配置

        // 基于配置的权限控制
        http
                .authorizeRequests()
                .antMatchers("/example").hasAuthority("admin");

 

翻阅一下源码:

// 注解对应的最外层方法,传入注解内对应的权限字符串,进入下一个方法
@Override
public final boolean hasAuthority(String authority) {
return hasAnyAuthority(authority);
}
// 继续向下传播
@Override
public final boolean hasAnyAuthority(String... authorities) {
return hasAnyAuthorityName(null, authorities);
}
// 上述prefix传的是null,即不用处理前缀问题(prefix是在role的判断时使用的) roles即authorities
// 这个方法即通过getAuthoritySet取得一个当前用户的权限集合,然后和roles一一比对,一旦有成功则返回true即可以放行
private boolean hasAnyAuthorityName(String prefix, String... roles) {
Set<String> roleSet = getAuthoritySet();
for (String role : roles) {
String defaultedRole = getRoleWithDefaultPrefix(prefix, role);
if (roleSet.contains(defaultedRole)) {
return true;
}
}
return false;
}
//getRoleWithDefaultPrefix就是拼劲字符串不写了
//getAuthoritySet意思很直白,代码看不太懂,不写了喵。

自定义一份hasAuthority:(效果和系统自带的是一样的,这里只是演示如何实现)

//取出当前用户的所有权限,和注解提供的权限一一比对,
@Component public class AuthorityExpression { public boolean hasAuthority(String authority) { Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); LoginUser loginUser=(LoginUser) principal; List<String> permissions = loginUser.getPermissions(); return permissions.contains(authority); } }

el表达式:使用自定义权限校验@beanName.method

@PreAuthorize("@authorityExpression.hasAuthority('syst:list')")

 

 

securityConfig解读:csrf

  http
                .csrf().disable()

这里是指关闭了csrf防护,

什么是csrf:攻击者通过欺骗浏览器去访问用户认证过的站点,因为已经在浏览器认证过,所以浏览器会放行操作

 csrf的成功离不开cookie,但是我们的前后端分离项目通过请求头自定义的token可以有效防御。也就是说,我们其实是不需要csrf防御的,所以这里选择了关闭

标签:hasAuthority,return,String,自定义,SpringSecurity,csrf,权限
From: https://www.cnblogs.com/kun1790051360/p/18321420

相关文章

  • 25 Docker网络管理_自定义网络
     欢迎来到@一夜看尽长安花博客,您的点赞和收藏是我持续发文的动力对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:[email protected]。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。​   专栏:java全栈C&C++Python......
  • Python 无法 pickle 自定义类型
    我正在尝试在ProcessPool中运行一个函数,该函数将通过读取python文件并运行生成的类中的方法来加载一些自定义类。我遇到的错误是TypeError:cannotpickle'generator'object该方法需要返回一个生成器。我该如何解决这个问题,谢谢。我用谷歌搜索但没有运气。......
  • [十万个为什么] [lua] 自定义byte_buffer
    #include"lprefix.h"#include"lua.h"#include"lauxlib.h"#include"lualib.h"#defineBYTE_BUFFER_META_TABLE_NAME"byte_buffer*"#defineGET_BYTE_BUFFER(L)((byte_buffer_t*)luaL_checkudata(L,1,BYTE_......
  • 【C语言】自定义类型——联合和枚举
    目录一、联合体1.1联合体类型的声明1.2联合体的特点1.2.1特点11.2.2特点21.2.3特点31.3联合体的大小1.4相同成员的结构体和联合体的对比1.5使用联合体节省空间的例子1.6运用联合体判断大小端1.7利用联合体打印存储的字节内容二、枚举类型2.1枚举类型的......
  • mybatisPlus3.4 自定义sqlSessionFactory sql注入器失效、mybatis-plus批量插入报错In
    文章目录一、报错背景二、解决方法在mybatis-plus项目中集成自定义批量插入方法后报错。以下整理一下报错及解决方法。一、报错背景mybatis-plus是不提供insertList批量插入方法的,本人在自定义批量插入方法后,启动时正常,但是执行到insertList时报错。org.apache.i......
  • flask写接口,定制日志输出以及将请求状态以及自定义日志写入文件中
    前言:无论是写接口还是写项目,配置日志是必选的;适合配置可以帮助自己排查代码逻辑问题简单说一说日志的等级以及用处1.日志等级DEBUG:10INFO:20WARN:30ERROR。40CRITICAL:50数字越大,等级越高!!2.日志用处:        DEBUG(调试):用于开发阶段的调试,开启后,会记录程序......
  • 在帝国CMS中设置自定义页面主要涉及以下步骤
    步骤1:创建新页面登录帝国CMS后台。在左侧导航栏中,单击“页面管理”。单击“添加单页信息”。步骤2:设置页面基本信息在“页面名称”字段中输入页面的名称。在“页面别名”字段中输入页面的别名(用于在URL中使用)。在“所属栏目”字段中选择页面的父栏目(如果没有,则选择“顶级栏......
  • Typora设置自定义脚本上传图片
    搭建图床服务这里利用CloudFlare搭建免费的图床服务cf-image-hosting部署Pages$gitclonehttps://github.com/ifyour/cf-image-hosting.git$cdcf-image-hosting$npminstall&&npmrundeploy部署成功后会显示如下信息设置自定义域名点击左侧Workers和Pages,选......
  • 织梦dedecms自定义表单选项必填怎么修改?
    我们先在plus/diy.php文件中的的第40行下加上一下代码//增加必填字段判断if($required!=&#39;&#39;){if(preg_match(&#39;/,/&#39;,$required)){$requireds=explode(&#39;,&#39;,$required);foreach($requiredsas$field){if($$field==&#39;&#39;){......
  • 自定义全选框,当勾选√添加到selection中,再次勾选从selection中移除
    <el-table:data="tableData"ref="tableData"height="450px"class="customer-no-border-table":row-class-name="tableRowClassName":......