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防御的,所以这里选择了关闭
标签:
springsecurity
, 软件工程日报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通