國際物流雲商專案筆記005:shiro的許可權控制
一、實現方式
有兩種方式,第一種是在的shiro的配置檔案(applicationContext-shiro.xml)中(即過濾器),第二種是通過註解
二、程式碼實現
1、配置檔案
在配置檔案的<property name="filterChainDefinitions">標籤下的<value>標籤中,通過配置perms過濾器來控制訪問,如需要控制部門管理的訪問,可通過如下設定。等號之前的表示需要控制的路徑,等號之後表示需要“部門管理”許可權。如果無許可權會根據配置檔案中的<property name="unauthorizedUrl" value="/index2.jsp" />標籤跳轉到指定的頁面
/sysadmin/deptAction* = perms["部門管理"]
而“部門管理”這個許可權是根據在自定義的類“AuthRealm”中授權方法(doGetAuthorizationInfo)裡面,通過SimpleAuthorizationInfo物件的addStringPermission方法增加的許可權名稱。
2、註解
由於Struts2框架和shiro框架存在衝突的問題,許可權配置不能在web層進行,所以可以在service層配置。如在deptAction裡面需要通過deptService物件的相關方法來獲取需要的資源,所以可以在該方法上新增@RequiresPermissions註解來控制。
程式碼如下:
@Override
@RequiresPermissions(value="部門管理")
public Page<Dept> findPage(Specification<Dept> spec, Pageable pageable) {
return deptDao.findAll(spec, pageable);
}
如果需要呼叫findPage方法,則需要“部門管理”許可權,否則會拋異常
注意:註解的方式對於UserService無法控制,因為在自定義的AuthRealm類中的AuthenticationInfo方法需要UserService來獲取資料庫中的密碼。也就是說只要是在AuthRealm類中被AuthenticationInfo使用的,都無法通過註解來控制
三、區別
配置檔案的方式無許可權時會跳轉到指定的頁面,註解則會直接拋異常。而且配置檔案比較集中,好管理,所以建議使用配置檔案的形式。
建議寫一個action,配置控制權限,否則到最後寫的話會很累