SpringSecurity:hasAuthority与自定义权限校验

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防御的,所以这里选择了关闭

posted @   天启A  阅读(388)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示