shiro实现基于角色的权限授权

shiro除了登陆验证之外,还有一点就是对系统进行相应的权限操作,而基于角色的授权是目前最通用的做法,也是符合业务逻辑的。具体思路如下:

1.数据库设计好权限表,角色表(权限标识是自定义的,shiro会根据表格里面相应的权限对系统做出管理)

2.将权限表与角色表做外键关联(多对一),用户表与角色表做外键关联

3.在自定义的Realm里实现授权

4.在controller层的方法里加上对应权限(推荐使用注解,只是需要在配置文件中开启注解,这点自行百度,并无什么难点)


开启shiro注解的配置如下:

 
    

    
    
        
    

    
        
    

    
    
                
    

对数据库的建表等操作就不给出来了,这点需要自己实现,下面就是授权代码:

大体流程是:先从数据中查找出该用户的对应角色,然后通过角色找出对应的权限,然后再通过add方法设置角色和权限

    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//        System.out.println("授权");
        SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
        List permissions=new ArrayList<>();
        List roles=new ArrayList<>();
        String username= (String) principalCollection.getPrimaryPrincipal();
//        System.out.println("username"+username);
        croUser=croUserService.findUserByName(username);
        List croRoleRoots=croRoleRootService.FindRootByRoleId(croUser.getCroRole().getId());
        for(CroRoleRoot croRoleRoot:croRoleRoots){
            String permission=croRootService.FindRootById(croRoleRoot.getCroRoot().getId()).getRoot();
//            System.out.println("权限:"+permission);
            permissions.add(permission);
        }
        roles.add(croUser.getCroRole().getRolename());
        info.addRoles(roles);//设置角色
        info.addStringPermissions(permissions);//设置权限
        return info;
    }



下一步就是在controller层的方法中添加对应的权限注解,这样才能让上面的代码有效从而达到对系统权限控制的目的

  @RequiresPermissions("user:select")//对应权限注解
    public String listCoupons(){
        upcroCoupons=croCouponsService.FindCouponsByid(id);
        return "updatecoupons";
    }

接着就可以进行测试操作了,当无权限的时候,会抛出一个无权限异常,用户的操作不会有任何效果。



注:注解只是其中一种方式,还有直接使用if-else判断和shiro标签的方式。建议学习shiro的程序猿去看看注解和shiro方式,并且这两种方式可以一起用,达到自己所设想的效果。

你可能感兴趣的:(shiro)