Shiro细颗粒授权控制
对url建立的访问限制认为是粗颗粒的控制,并不能完全满足我们控制。
我们还能使用shiro细颗粒授权控制
细颗粒授权控制包括:方法级别 和 代码级别
方法级别的控制:就是对某个方法加访问控制,用户必须拥有某个权限,才能访问该方法。
方法级别控制流程:1. 开启注解
在 web层的 applicationContext_shiro.xml 文件里边的最后加入一下代码
2.然后在biz(业务层)添加方法的注解:@RequiresPermissions("相应的方法权限名称")
/**
* 审核
*
* @param uuid 订单编号
* @param empUuid 审核员
*/
@RequiresPermissions("采购订单审核")
public void doCheck(Long uuid, Long empUuid) {
// 获取订单,并进入持久化状态
Orders orders = ordersDao.get(uuid);
if (!Orders.STATE_CREATE.equals(orders.getState())) {
throw new ErpException("亲!该订单已经审核过了");
}
// 1.修改订单的状态
orders.setState(Orders.STATE_CHECK);
// 2.设置审核时间
orders.setChecktime(new Date());
// 3.审核人
orders.setChecker(empUuid);
}
3.还可以在action相应的方法里边捕获异常:
/**
* 订单审核
*/
public void doCheck() {
//获取当前登录用户
Emp loginUser = getLoginUser();
if(loginUser == null) {
//如果用户没有登录或者session失效
write(ajaxReturn(false, "请您登录后再进行操作"));
return;
}
try {
ordersBiz.doCheck(getId(), loginUser.getUuid());
write(ajaxReturn(true, "审核成功"));
}catch(ErpException e) {
write(ajaxReturn(false, e.getMessage()));
}
catch (Exception e) {
write(ajaxReturn(false, "审核失败"));
e.printStackTrace();
}
}
最后使用成功,成功被拦截。
代码级别的控制:(代码块细颗粒权限控制)我项目里边的关于订单的add()方法用到了代码级别的权限控制
//增加代码级别的权限控制
Subject subject = SecurityUtils.getSubject();
//如果是采购订单的申请
if(Orders.TYPE_IN.equals(orders.getType())) {
//增加代码级别的权限控制
//判断当前用户是否有采购订单申请的权限
if(! subject.isPermitted("我的采购订单")) {
throw new ErpException("权限不足");
}
}else if(Orders.TYPE_OUT.equals(orders.getType())) {
if(! subject.isPermitted("销售订单录入")) {
throw new ErpException("权限不足");
}
}else {
throw new ErpException("非法参数");
}