@PerAuthorizr权限注解
2022-08-30 本文已影响0人
小名源治
@PreAuthorize是可以用来控制一个方法或类是否能够被调用的,通俗一点就是看看你有没有权利用被注解的东西。有权限就正常执行方法或类,没有权限就返回403;
@PreAuthorize("@ss.hasPermi('system:config:list')")
@GetMapping("/list")
public TableDataInfo list(SysConfig config)
{
startPage();
List<SysConfig> list = configService.selectConfigList(config);
return getDataTable(list);
}
1.@PreAuthorize("@ss.hasPermi('system:config:list')")分析
@ss.hasPermi() :是一个类中的方法,这个service类的重命名为ss;
system:config:list :是当前要求的权限
2.@ss
判断是否有该权限的流程:
1.将需要的权限传入hasPermi方法中;
2.获取当前用户的信息(信息中包含该用户的权限信息集合);
3.检查用户的权限集合中是否有需要的权限,或者该用户拥有最高权限;
@Service("ss")
public class PermissionService {
/**
* 所有权限标识
*/
private static final String ALL_PERMISSION = "*:*:*";
/**
* 管理员角色权限标识
*/
private static final String SUPER_ADMIN = "admin";
private static final String ROLE_DELIMETER = ",";
private static final String PERMISSION_DELIMETER = ",";
/**
* 验证用户是否具备某权限
*
* @param permission 权限字符串
* @return 用户是否具备某权限
*/
public boolean hasPermi(String permission) {
if (StringUtils.isEmpty(permission)) {//为空就返回false
return false;
}
LoginUser loginUser = SecurityUtils.getLoginUser();//获取当前用户信息
if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) {
//当前用户为空 或者 当前用户的权限信息为空 那么就返回false
return false;
}
//将权限设置到请求头中
PermissionContextHolder.setContext(permission);
//判断用户的请求列表中是否有当前权限
return hasPermissions(loginUser.getPermissions(), permission);
}
/**
* 判断是否包含权限
*
* @param permissions 权限列表
* @param permission 权限字符串
* @return 用户是否具备某权限
*/
private boolean hasPermissions(Set<String> permissions, String permission) {
return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission));
}
}
3.拓展知识:
@Service(XXX),括号里面的内容的作用。当一个接口有多个实现类的时候,那么用@Service("abc")注解标记当前类,相当于给当前类取了个名字。
比如Student实现了Person接口,在你的controller里面@Autowired Person时,
假如这时Person还有另一个实现类User,为了确定实例化Student还是User, @Service括号里面的东西就有用了,
@Autowired
@Qualifier("student")
private Person person;
原文链接:http://demo.ruoyi.vip/
原文链接:https://blog.csdn.net/qq_22585453/article/details/84829876