美文网首页
Shiro基于Realm授权的配置流程

Shiro基于Realm授权的配置流程

作者: 我叫罗大大 | 来源:发表于2019-07-14 22:28 被阅读0次
    具体配置

    ①给需要权限的处理方法加上权限表达式注解@RequiresPermissions

    //第一个参数代表中文权限表达式,第二个参数代表权限表达式
    @RequiresPermissions(value = {"员工编辑", "employee:input"}, logical = Logical.OR)
    

    Logical.OR:当多个权限表达式存在时,校验只要有一个即可以

    Logical.AND:当多个权限表达式存在时,必须都存在才可以校验

    ②配置注解扫描器AuthorizationAttributeSourceAdvisor,并添加到安全管理器管理

    <!--权限注解扫描器-->
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> 
        <!--添加安全管理器-->
        <property name="securityManager" ref="securityManager"/>
    </bean>
    

    ③服务器代码实现注解的加载

    //再次加载时不应该出现重复的参数
    //先查询出数据库保存的数据,和得到的注解的方法作对比,如果存在则不往数据库添加权限表达式
    public void reload() { 
        //获取到所有控制器的对象
        Map<String, Object> beans = application.getBeansWithAnnotation(Controller.class);
        System.out.println("application"+beans.entrySet());
        //得到控制器对象
        Collection<Object> values = beans.values();
        //遍历controller对象里的方法
        for (Object controller : values) {
            //得到控制器里的所有的方法
            //获取父类里的方法
            Method[] methods = controller.getClass().getSuperclass().getDeclaredMethods();
            //遍历控制器里的方法,判断是否有requestPermission注解
            for (Method method : methods) {
                boolean annotationPresent =
                    method.isAnnotationPresent(RequiresPermissions.class);
                if (annotationPresent) {
                    //得到当前方法的简单名字
                    //String methodName = method.getName();
                    String expression = StringUtils.getExpression(method);
                    //判断当前表达式的名字是否存在,存在则不保存
                    List<Permission> permissions = permissionMapper.queryForList(new                         PermissionQuery());
                    HashSet<String> set = new HashSet<>();
                    for (Permission permission : permissions) {
                        set.add(permission.getExpression());
                    }
                    if (!set.contains(expression)) {
                        Permission permission = new Permission();
                        permission.setName(method.
                         getAnnotation(RequiresPermissions.class).value()[0]);
                        permission.setExpression(method.
                        getAnnotation(RequiresPermissions.class).value()[1]);
                        permissionMapper.insert(permission);
                    }
                }
            }
        }
    }
    

    ④在自建Realm中实现授权

    //获取授权信息
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        //查出所有权限信息
        List<Permission> permissions = permissionService.selectAll();
        //得到用户,判断是否是超级管理员
        Employee employee =(Employee)principalCollection.getPrimaryPrincipal();
        if (employee.isAdmin()) {
            info.addRole("admin");
            //如果是admin,则给予所有的权限
            info.addStringPermission("*:*");
        }else {
            //查询到该用户的角色的编码
            List<String> roleList = roleMapper.getRoleIdByEmployeeId(employee.getId());
            //查询到该用户的权限信息
            List<String> permissionList = 
            permissionService.getPerssionsByEmployeeId(employee.getId());
            //添加该用户的角色信息
            info.addRoles(roleList);
            //添加该用户的权限信息
            info.addStringPermissions(permissionList);
        }
        //返回授权认证的信息
        return info;
    }
    

    相关文章

      网友评论

          本文标题:Shiro基于Realm授权的配置流程

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