javascript
SpringBoot+Shiro学习(四):Realm授权
上一節我們講了自定義Realm中的認證(doGetAuthenticationInfo),這節我們繼續講另一個方法doGetAuthorizationInfo授權
授權流程
流程如下:
ModularRealmAuthorizer進行多Realm匹配流程:
如果Realm進行授權的話,應該繼承AuthorizingRealm,其流程是:
1.1、如果調用hasRole,則直接獲取AuthorizationInfo.getRoles()與傳入的角色比較即可;
1.2、首先如果調用如isPermitted(“user:view”),首先通過PermissionResolver將權限字符串轉換成相應的Permission實例,默認使用WildcardPermissionResolver,即轉換為通配符的WildcardPermission;
2、通過AuthorizationInfo.getObjectPermissions()得到Permission實例集合;通過AuthorizationInfo. getStringPermissions()得到字符串集合并通過PermissionResolver解析為Permission實例;然后獲取用戶的角色,并通過RolePermissionResolver解析角色對應的權限集合(默認沒有實現,可以自己提供);
3、接著調用Permission. implies(Permission p)逐個與傳入的權限比較,如果有匹配的則返回true,否則false。
先看一段簡單的授權方法重寫
@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {//獲取用戶名String username = (String) principals.getPrimaryPrincipal();//此處從數據庫獲取該用戶的角色Set<String> roles = getRolesByUserName(username);//此處從數據庫獲取該角色的權限Set<String> permissions = getPermissionsByUserName(username);//放到info里返回SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();info.setStringPermissions(permissions);info.setRoles(roles);return info;} 復制代碼PrincipalCollection
因為我們可以在Shiro中同時配置多個Realm,所以呢身份信息可能就有多個;因此其提供了PrincipalCollection用于聚合這些身份信息:
public?interface?PrincipalCollection?extends?Iterable,?Serializable?{??Object?getPrimaryPrincipal();?//得到主要的身份??<T>?T?oneByType(Class<T>?type);?//根據身份類型獲取第一個??<T>?Collection<T>?byType(Class<T>?type);?//根據身份類型獲取一組??List?asList();?//轉換為List??Set?asSet();?//轉換為Set??Collection?fromRealm(String?realmName);?//根據Realm名字獲取??Set<String>?getRealmNames();?//獲取所有身份驗證通過的Realm名字??boolean?isEmpty();?//判斷是否為空?? }??? 復制代碼因為PrincipalCollection聚合了多個,此處最需要注意的是getPrimaryPrincipal,如果只有一個Principal那么直接返回即可,如果有多個Principal,則返回第一個(因為內部使用Map存儲,所以可以認為是返回任意一個);oneByType / byType根據憑據的類型返回相應的Principal;fromRealm根據Realm名字(每個Principal都與一個Realm關聯)獲取相應的Principal。
AuthorizationInfo
AuthorizationInfo用于聚合授權信息的:
public?interface?AuthorizationInfo?extends?Serializable?{??Collection<String>?getRoles();?//獲取角色字符串信息??Collection<String>?getStringPermissions();?//獲取權限字符串信息??Collection<Permission>?getObjectPermissions();?//獲取Permission對象信息?? }??? 復制代碼當我們使用AuthorizingRealm時,如果身份驗證成功,在進行授權時就通過doGetAuthorizationInfo方法獲取角色/權限信息用于授權驗證。 Shiro提供了一個實現SimpleAuthorizationInfo,大多數時候使用這個即可。
我們再跟蹤一下代碼,看看是如何調用Authorizer的
subject.hasRole("admin") 復制代碼總結
以上是生活随笔為你收集整理的SpringBoot+Shiro学习(四):Realm授权的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java B2B2C springmvc
- 下一篇: Kubernetes共享使用Ceph存储