单据权限,业务场景:需要实现用户对访问资源进行动态权限校验。
例如:小王负责商家A下的所有资源运营工作,小张负责品牌A,小李负责品牌B
一:设计思路
(1)新增一个自定义注解permitable,用于资源转换为shiro的权限表示字符串
(2)新增一个AOP切面,用于将自定义注解标注的方法和shiro权限校验关联起来
(3)校验当前用户是否有足够的权限去访问保护资源
二:编码实现
1、新建PermissionResolver接口
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import static java.util.stream.Collectors.toList;
/**
* 资源权限解析器
*
* @author wuyue
* @since 1.0, 2019-09-07
*/
public interface PermissionResolver {
/**
* 解析资源
*
* @return 资源的权限表示字符串
*/
String resolve();
/**
* 批量解析资源
*/
static List<String> resolve(List<PermissionResolver> list) {
return Optional.ofNullable(list).map(obj -> obj.stream().map(PermissionResolver::resolve).collect(toList()))
.orElse(Collections.emptyList());
}
}
2、新增业务资源实体类,并实现PermissionResolver接口,此处以商品资源为例,例如新建Product.java
import com.wuyue.shiro.shiro.PermissionResolver;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.util.Date;
@Getter
@Setter
@ToString
@Entity
@Table(name = "product")
public class Product implements PermissionResolver {
@Override
public String resolve() {
return merchantId + ":" + brandId + ":" + id;
}
@Id
@GenericGenerator(name = "idGen", strategy = "uu