shiro实现基于角色的权限授权
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; }
@RequiresPermissions("user:select")//对应权限注解 public String listCoupons(){ upcroCoupons=croCouponsService.FindCouponsByid(id); return "updatecoupons"; }
接着就可以进行测试操作了,当无权限的时候,会抛出一个无权限异常,用户的操作不会有任何效果。
注:注解只是其中一种方式,还有直接使用if-else判断和shiro标签的方式。建议学习shiro的程序猿去看看注解和shiro方式,并且这两种方式可以一起用,达到自己所设想的效果。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。