首先,需要在mysql資料庫中建立五個表,分別為user、user_role、role、permission、role_permission表;
user表需要的基本字段:id, username, password, createtime;
user_role表需要的基本字段:user_id, role_id;
role表需要的基本字段:role_id, role_name, role_key(角色許可權字串,為admin或者common), remark;
permission表需要的基本字段:id, perms, url;
role_permission表需要的基本字段:id, role_id, permission_id
在user實體類中新增list型別的role使多表查詢時候進行連線
在role實體類中新增list型別的permission使多表查詢時候進行連線
查詢角色授權和許可權授權的sql語句
<
!--多表聯查查詢使用者角色授權--
>
"queryuserrolebyid" parametertype=
"integer" resultmap=
"rolemap"
>
select distinct *
from role r
left join user_role ur on ur.role_id = r.role_id
left join user us on us.id = ur.user_id
where us.id = #
<
/select>
<
!--多表聯查查詢使用者許可權授權--
>
"querypermsbyuserid" resulttype=
"string" parametertype=
"integer"
>
select distinct pr.perms
from permission pr
left join role_permission rp on pr.id = rp.permission_id
left join role r on rp.role_id = r.role_id
left join user_role ur on r.role_id = ur.role_id
left join user us on us.id = ur.user_id
where us.id = #
<
/select>
service層的寫法
/**
* 根據使用者id查詢角色
* 這個方法寫在role的service層
* @param userid 使用者id
* @return 許可權列表
*/set
selectrolekeys
(integer userid)
;/**
* 根據使用者id查詢許可權
* 這個方法寫在permission的service層
* @param userid 使用者id
* @return 許可權列表
*/set
selectpermsbyuserid
(integer userid)
;
impl的寫法
/**
* 根據使用者id查詢角色
*這個方法寫在role的impl層
* @param userid 使用者id
* @return 許可權列表
*/@override
public set
selectrolekeys
(integer userid)
}return permsset;
}/**
* 根據使用者id查詢許可權
* 這個方法寫在permission的impl層
* @param userid 使用者id
* @return 許可權列表
*/@override
public set
selectpermsbyuserid
(integer userid)
}return permsset;
}
在自定義的realm中的dogetauthorizationinfo方法中進行角色和許可權的授權
/**
* 執行授權邏輯
** @param principalcollection
* @return
*/@override
protected authorizationinfo dogetauthorizationinfo
(principalcollection principalcollection)
",json.
tojsonstring
(user));
}else
",json.
tojsonstring
(user));
} subject.
getsession()
.setattribute
("user"
,user)
;// 管理員擁有所有許可權
if(user.
isadmin()
)else
",roles)
; logger.
info
("使用者許可權資訊:{}"
,perms)
;// 角色加入authorizationinfo認證物件
info.
setroles
(roles)
;// 許可權加入authorizationinfo認證物件
info.
setstringpermissions
(perms);}
return info;
}
因為將快取儲存到redis中,取出的時候devtools熱部署會提示型別轉換錯誤,所有需要判斷取出的型別是否正確,如果不正確需要將它強制型別轉換成需要的資料格式。
判斷是否是管理員的isadmin()方法的寫法,寫在user的實體類中
public
static
boolean
isadmin
(integer userid)
public
boolean
isadmin()
使用方法就是在controller層的方法上新增@requirespermissions(value = )註解或者 @requiresroles(value = 「」)註解,讓使用者擁有value屬性中的值得時候才能擁有許可權訪問該方法,否則沒法訪問。
為了讓註解生效,需要在shiroconfig的配置類中進行配置
/**
* 開啟shiro 註解模式
* 可以在controller中的方法前加上註解
* 如 @requirespermissions("userinfo:add")
* @return
*/@bean
public authorizationattributesourceadvisor authorizationattributesourceadvisor()
springboot和springmvc的區別
springmvc從兩個方面來看,一是spring,spring的核心中ioc和aop,ioc就是控制反轉 就是將原本由程式 直接操作的物件的呼叫權交給容器 目的是為了減低計算機 的耦合度,所謂的耦合度就是 中的邏輯關係不要太緊密,避免後面改的人會因為不懂業務邏輯導致改錯 除此之外也避免我們每次建立...
springmvc和springboot做分頁查詢
第一種 springmvc 1 pom.xml引入分頁外掛程式 pagehelper 5.1.9 2 在spring配置檔案中的sqlsessionfactory中引入分頁外掛程式 helperdialect mysql 該屬性會自動的進行資料庫鏈結的識別,自動配置適用的分頁方式。使用sqlserv...
SpringBoot和SpringCould的關係
spring boot 是 spring 的一套快速配置腳手架,可以基於spring boot 快速開發單 個微服務,spring cloud是乙個基於spring boot實現的雲應用開發工具 spring boot專 注於快速 方便整合的單個微服務個體,spring cloud關注全域性的服務治...