springboot和shiro實現角色和許可權認證

2021-10-05 21:18:10 字數 4262 閱讀 3490

首先,需要在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關注全域性的服務治...