Shiro基于Realm授权的配置流程

2019-07-14  本文已影响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;
}
上一篇下一篇

猜你喜欢

热点阅读