美文网首页
@PerAuthorizr权限注解

@PerAuthorizr权限注解

作者: 小名源治 | 来源:发表于2022-08-30 10:04 被阅读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

相关文章

网友评论

      本文标题:@PerAuthorizr权限注解

      本文链接:https://www.haomeiwen.com/subject/kyfdnrtx.html