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方式,并且这两种方式可以一起用,达到自己所设想的效果。