一、簡介:
shiro是一個安全框架,顧名思義就是對系統的訪問進行安全控制,包含用戶身份認證(登錄),用戶權限控制(通過角色,權限字符串等)。
成都創新互聯是一家企業級云計算解決方案提供商,超15年IDC數據中心運營經驗。主營GPU顯卡服務器,站群服務器,服務器托管,海外高防服務器,成都機柜租用,動態撥號VPS,海外云手機,海外云服務器,海外服務器租用托管等。
權限里面很關鍵的兩個東西:認證和授權。
1. 認證沒什么好說的,目的就是判斷用戶的賬號密碼是否正確之類的,授權的作用嘛,簡單的解釋就是給用戶賦予相應的權限。
2. 判斷一個用戶有沒有權限訪問,無非是攔截URL能否訪問,分為以下幾個操作
①判斷當前URL是否需要攔截,不需要則放行,需要則進入下一步
②判斷用戶是否已登陸,有則下一步,無則拋出401未認證
④從資源表/權限表讀取當前登陸用戶的可訪問地址,進入下一步判斷是否包含用戶當前訪問的地址,有則放行,無則拋出403無權限。
二、簡單搭建
1.maven工程,版本自行選擇
2.配置web.xml,需要配置shiro特定的過濾器,主要作用是把所有的bean交給spring管理,通過spring容器來管理filter的生命周期,通過spring注入的形式,來代理一個filter執行,主要目的是,找到在spring中維護的目標filter。
xmlns:context="http://www.springframework.org/schema/context"
xmlns:rsf="http://www.suning.com/schema/rsf"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.suning.com/schema/rsf http://www.suning.com/schema/rsf/rsf.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
exceptionResolver作用在于統一的異常捕捉。
ShiroDbRealm類中有doGetAuthorizationInfo(AuthenticationToken token) ,doGetAuthenticationInfo兩個方法,doGetAuthenticationInfo(PrincipalCollection arg0)作用在于登陸認證,包括用戶名和密碼的驗證,如果不做用戶名密碼的驗證。
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken upToken =(UsernamePasswordToken)token;
String userName=upToken.getUsername();
return new SimpleAuthenticationInfo(userName,
upToken.getPassword(),getName());
}
/**
* 授權查詢回調函數, 進行鑒權但緩存中無用戶的授權信息時調用,負責在應用程序中決定用戶的訪問控制的方法
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
UserLoginBean user = (UserLoginBean) SecurityUtils.getSubject().getSession().getAttribute(LcssConstant.LOGIN_COMMAND);
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addRole(user.getRoleCode());
//權限編碼
String authorityStr = CommonUtil.getAuthorityStr(user.getInitialFlag(), user.getRoleCode());
List idList = new ArrayList<>();
if(!StringUtil.isNullOrEmpty(authorityStr)){
idList = Arrays.asList(authorityStr.split(","));
}
info.addStringPermissions(idList);
return info;
}
doGetAuthorizationInfo(PrincipalCollection arg0),每次controller層調用都會進入這個方法來判斷當前用戶是否有權限。如果有權限進入方法,沒權限拒絕訪問。
注解RequiresPermissions的使用:@RequestMapping("/addWorkOrderSureMessage.th")
br/>@RequestMapping("/addWorkOrderSureMessage.th")
RequiresPermissions放在controller層中,控制訪問,每次訪問當前方法,都會進入doGetAuthorizationInfo(PrincipalCollection arg0)進行權限認證,包含1001權限才能進入方法,否則驗證不通過。
三、總結:
Shiro可以幫助我們完成:認證、授權、加密、會話管理、與Web集成、緩存等。
Realm是Shiro的核心組建,也一樣是兩步走,認證和授權,在Realm中的表現為以下兩個方法。
認證:doGetAuthenticationInfo,核心作用判斷用戶名密碼是否正確
授權:doGetAuthorizationInfo,核心作用是獲取用戶的權限字符串,用于后續的判斷
Authentication:身份認證/登錄,驗證用戶是不是擁有相應的身份;
Authorization:授權,即權限驗證,驗證某個已認證的用戶是否擁有某個權限;即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色。或者細粒度的驗證某個用戶對某個資源是否具有某個權限;