Shiro 授權:
參考鏈接:http://jinnianshilongnian.iteye.com/blog/2020017
授權,也稱訪問控制,即在應用中控制用戶可以訪問哪些資源(訪問頁面/頁面操作/編輯數據等)
roles:角色,代表操作集合,可以理解為權限的集合(隱式角色)
perms:權限(顯示角色)
三種設置權限方式:
1 編程式:
Subject subject = SecurityUtils.getSubject(); if(subject.hasRole(“admin”)) { //有權限 } else { //無權限 }
2 注解式:
@RequestMapping("/list")
@ResponseBody
@RequiresPermissions({"sys:menu:list"})
public DataGridResult getPage(@RequestParam Map<String, Object> params) {
Query query = new Query(params);
return sysMenuService.getPageList(query);
}
3 標簽式:
<shiro:hasPermission name="sys:user:create">
<a href="form?add" class="btn btn-success " type="button">
<i class="fa fa-plus"></i> <span class="bold">新增</span>
</a>
</shiro:hasPermission>
兩種授權方式:
1.1 基於角色授權:
[users] draco = 615, role1, role3 harry = 130, role2
1.2 基於權限授權:
[users]
draco = 615, role1, role3
harry = 130, role2
[roles]
role1 = sys:user,sys:menu
role2 = sys:user:create,sys:user:update,sys:user:list
role3 = sys:config:list
2 編程式授權
//分配權限 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //為用戶分配角色: List<String> roles = Arrays.asList("admin", "user"); info.addRoles(roles); //為用戶分配資源: List<String> perms = Arrays.asList("sys:role:list", "sys:role:info", "sys:user:save"); info.addStringPermissions(perms);
驗證權限:
boolean authenticated = currentUser.isAuthenticated(); log.debug("是否登陸成功:"+ authenticated); //授權 if(authenticated){ //授權:角色 //單個角色的判斷 boolean isHasRole = currentUser.hasRole("role1"); System.out.println(isHasRole); //多個角色判斷:逐個判斷 boolean[] isHasRoles = currentUser.hasRoles(Arrays.asList("role1", "role2")); for(int i = 0; i< isHasRoles.length; i++){ System.out.print(isHasRoles[i]+"\t"); } //多個角色判斷:總體判斷 System.out.println(); boolean isHasAllRoles = currentUser.hasAllRoles(Arrays.asList("role1", "role2")); System.out.println(isHasAllRoles); //check方法:拋出異常 try { currentUser.checkRole("role3"); } catch (AuthorizationException e) { System.out.println("你沒有被分配這個角色"); e.printStackTrace(); } //授權:權限 //單個授權的判斷 boolean isPermitted = currentUser.isPermitted("sys:user"); System.out.println(isPermitted); //多個權限判斷 boolean isPermittedAll = currentUser.isPermittedAll("sys:user", "sys:menu"); System.out.println(isPermittedAll); //check方法 try { currentUser.checkPermission("sys:config:list"); } catch (AuthorizationException e) { System.out.println("你沒有被分配這個權限"); e.printStackTrace(); } }
授權流程:
1 調用subject.isPermitted()進行驗證,自動委托給SecurityManager
2 SecurityManger將身份驗證委托給Authorizer
3 Authorizer負責真正的授權者,是Shiro API中授權核心的入口點
4 Authorizer在進行授權之前,會調用相應的Realm獲取Subject相應的角色/權限用於匹配傳入的角色/權限
5 Authorizer會判斷Realm的角色/權限是否和傳入的匹配,如果有多個Realm,會委托給ModularRealmAuthorizer進行循環判斷,如果匹配如isPermitted*/hasRole*會返回true,否則返回false表示授權失敗

