一、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表