一、shiro权限-角色-用户关系分析
二、加载权限表达式
步骤:
1)先自定义名称注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionName {
String value();
}
2)在所有的controller中的需要进行权限控制方法里面贴上2给标签(这里只写employee:list方法,其他方法一样):如
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@RequestMapping("")
@RequiresPermissions("employee:list")
@PermissionName("员工列表")
public String index() throws Exception{
System.out.println("执行了员工列表....");
return "employee";
}
}
3)在PermissionController编辑reload方法, 加载权限
其中:IPermissionDAO添加一个获取所有权限表达是方法, 具体实现类
@Controller
public class PermissionController {
//请求映射处理映射器
//springmvc在启动时候将所有贴有请求映射标签:RequestMapper方法收集起来封装到该对象中
@Autowired
private RequestMappingHandlerMapping rmhm;
@Autowired
private IPermissionDAO permissionDAO;
@RequestMapping("/reload")
public String reload() throws Exception{
//将系统中所有权限表达式加载进入数据库
//0:从数据库中查询出所有权限表达式,然后对比,如果已经存在了,跳过,不存在添加
List<String> resourcesList = permissionDAO.getAllResources();
//1:获取controller中所有带有@RequestMapper标签的方法
Map<RequestMappingInfo, HandlerMethod> handlerMethods = rmhm.getHandlerMethods();
Collection<HandlerMethod> methods = handlerMethods.values();
for (HandlerMethod method : methods) {
//2:遍历所有方法,判断当前方法是否贴有@RequiresPermissions权限控制标签
RequiresPermissions anno = method.getMethodAnnotation(RequiresPermissions.class);
if(anno != null){
//3:如果有,解析得到权限表达式,封装成Permission对象保存到Permission表中
//权限表达式
String resource = anno.value()[0];
//去除重复的
if(resourcesList.contains(resource)){
continue;
}
Permission p = new Permission();
p.setResource(resource);
//设置权限名称
p.setName(method.getMethodAnnotation(PermissionName.class).value());
//保存
permissionDAO.save(p);
}
}
return "main";
}
}
4)在main主页中点击重新加载权限,进行权限加载
5)查看Permission表