Shiro沒有Spring Security做的功能強大。
shiro四大組件:Authentication認(rèn)證,Authorization授權(quán),Session Manager會話管理,Cryptography密碼學(xué).
shiro與系統(tǒng)交互過程:1、應(yīng)用代碼通過Subject來進(jìn)行認(rèn)證和授權(quán),而Subject又委托給SecurityManager;2、我們需要給Shiro的SecurityManager注入Realm,從而讓SecurityManager能得到合法的用戶及其權(quán)限進(jìn)行判斷。
從以上也可以看出,Shiro不提供維護(hù)用戶/權(quán)限,而是通過Realm讓開發(fā)人員自己注入。
shiro單純用MD5加密不安全,需要加鹽加密。
環(huán)境配置
1.添加依賴
2.配置web.xml(在shiro官網(wǎng)查找
3.在Controller層創(chuàng)建自定義realm類:AuthRealm,繼承AuthorizingRealm
4.在Controller層配置applicationContext-shiro.xml, Spring整合shiro(shiro官網(wǎng)查找
anon匿名訪問,指定放行資源
authc認(rèn)證訪問資源
perms授權(quán)訪問資源
使用shiro完成登錄功能:
Controller中的認(rèn)證過程
//1.獲取subject
Subject subject = SecurityUtils.getSubject();
//2.構(gòu)造用戶名和密碼
UsernamePasswordToken upToken = new UsernamePasswordToken(user,password);
//3.借助subject完成用戶登錄
subject.login(upToken);//login進(jìn)行身份認(rèn)證
//4.通過shiro獲取用戶對象,保存到session中(realm認(rèn)證方法構(gòu)造器第一個參數(shù)就是數(shù)據(jù)庫的用戶信息)
User user = (User)subject.getPrincipal(); //獲取安全數(shù)據(jù)(用戶對象)
Realm中的認(rèn)證過程
//1.獲取到用戶界面輸入的用戶名和密碼
UsernamePasswordToken upToken = (UsernamePasswordToken) authenticationToken;
//2.根據(jù)upToken獲得用戶名
//3.根據(jù)用戶名查找用戶信息
//4.用SimpleAuthenticationInfo封裝用戶信息,第一個參數(shù):安全數(shù)據(jù)(user對象)第二個參數(shù):密碼(數(shù)據(jù)庫密碼)第三個參數(shù):當(dāng)前調(diào)用realm域的名稱(類名即可
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getPassword(),this.getName());
使用shiro授權(quán)(權(quán)限判斷
realm中后授權(quán)功能
//1.根據(jù)認(rèn)證用戶獲取當(dāng)前登錄的用戶對象
User user = (User) principalCollection.getPrimaryPrincipal();
//2.根據(jù)用戶id獲得權(quán)限
//3.使用set集合遍歷權(quán)限
//4.用SimpleAuthorizationInfo封裝用戶信息
硬編碼實現(xiàn)授權(quán)
在Controller中添加
Subject subject = SecurityUtils.getSubject();
subject.cheakPermission("權(quán)限名稱");//權(quán)限校驗
xml中實現(xiàn)授權(quán)
在applicationContext-shiro.xml中添加
perms的位置必須在authc上。
/訪問資源=perms["權(quán)限名稱"]
注解實現(xiàn)授權(quán)
- 在applicationContext-shiro.xml中開啟shiro注解支持
- 開啟Aop自動代理(已經(jīng)完成)
- 在controller中使用@RequiresPermissions(“”)注解