Spring Boot整合Shiro進行權限授權管理
上次咱們說到了在Spring Boot中整合Shiro進行身份驗證,在其基礎上咱們今天繼續來說說Shiro另一個很重要的功能權限管理。
一.自己定義的域重寫doGetAuthorizationInfo方法
上一章中咱們的域MyShiroRealm中doGetAuthorizationInfo方法直接返回null,不做權限的處理。現在我們需要重寫這個方法進行用戶權限的分配。
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
System.out.println("權限配置-->MyShiroRealm.doGetAuthorizationInfo()");
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
// 驗證後通過的用戶信息
UserInfo userInfo = (UserInfo) principals.getPrimaryPrincipal();
for (Role role : userInfo.getRoleList()) {
// 分配角色
authorizationInfo.addRole(role.getRole());
for (Permission p : role.getPermissions()) {
// 分配權限
authorizationInfo.addStringPermission(p.getPermission());
}
}
return authorizationInfo;
}
二.訪問需要權限的鏈接
在UserController控制器中我們新增一個方法進行測試
@RequestMapping("/userAdd")
@RequiresPermissions("userInfo:add")//需要權限;
@RequiresRoles("admin")
public String userInfoAdd(){
return "userInfoAdd";
}
從註解上大概也能猜出來,訪問/userAdd需要userInfo:add權限和admin的用戶。現在啓動項目的話會發現這兩個註解並沒有生效,我們需要配置兩個代理。在ShiroConfig類中加上:
/**
* 開啓shiro aop註解支持. 使用代理方式;所以需要開啓代碼支持;
*
* @param securityManager
* @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
@Bean
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
}
三.啓動項目進行測試
啓動項目我們在下面代碼處打個斷點看下訪問的用戶信息裏有什麼
UserInfo [uid=1, name=ADMIN, password=5b48c185e886ff93be5244f979b2864b, salt=asdfghjkl, roleList=[Role [id=1, role=admin, permissions=[SysPermission [id=1, name=UserManger, url=userInfo/userList, permission=userInfo:view, roles=null], SysPermission [id=2, name=UserAdd, url=userInfo/userAdd, permission=userInfo:add, roles=null], SysPermission [id=3, name=UserDelete, url=userInfo/userDel, permission=userInfo:del, roles=null]], userInfos=null]]]
發現請求訪問的用戶具有role的角色和userInfo:add的權限,所以可以訪問。
可以把需要的權限和角色進行修改後再發送訪問請求,會發生什麼大家可以自行測試。