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