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

来源:互联网 发布:vs2015怎么编译c语言 编辑:程序博客网 时间:2024/05/17 01:47

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

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

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

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

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


开启shiro注解的配置如下:

 <!--配置lifecycleBeanPostProcessor, 可以自动的来调用配置在spring IOC 容器中shiro bean的生命周期方法-->    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />    <!--启用IOC容器中使用shiro的注解,但必须在配置 lifecycleBeanPostProcessor才可以使用–>-->    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"          depends-on="lifecycleBeanPostProcessor">        <property name="proxyTargetClass" value="true" />    </bean>    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">        <property name="securityManager" ref="securityManager"/>    </bean>    <!--扫描所有shiro注解的文件-->    <context:component-scan base-package="action">                <context:exclude-filter type="annotation"                  expression="org.springframework.stereotype.Controller" />    </context:component-scan>

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

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

    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {//        System.out.println("授权");        SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();        List<String> permissions=new ArrayList<>();        List<String> roles=new ArrayList<>();        String username= (String) principalCollection.getPrimaryPrincipal();//        System.out.println("username"+username);        croUser=croUserService.findUserByName(username);        List<CroRoleRoot> 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方式,并且这两种方式可以一起用,达到自己所设想的效果。

阅读全文
3 1