Shiro教程4(授權操作)

概念

授權,又稱作為訪問控制,是對資源的訪問管理的過程,即對於認證通過的用戶,授予他可以訪問某些資源的權限。

代碼觸發

通過寫if/else 授權代碼塊完成

Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有權限
} else {
//無權限
}

註解觸發

通過在執行的Java方法上放置相應的註解完成

@RequiresRoles("admin")
public void hello() {
//有權限
}

標籤觸發

在JSP/GSP頁面通過相應的標籤完成

<hasrole>

/<hasrole>

注意本文先講代碼觸發,後面兩種情況再後面案例中使用講解。

Shiro教程4(授權操作)

Shiro教程4(授權操作)

在ini.xml文件中設置

[users]
#用戶zhang的密碼是123,此用戶具有role1和role2兩個角色
zhang=123,role1,role2
wang=123,role2

[roles]
#角色role1對資源user擁有create、update權限
role1=user:create,user:update
#角色role2對資源user擁有create、delete權限
role2=user:create,user:delete
#角色role3對資源user擁有create權限
role3=user:create

驗證角色和權限

@Test
public void test() {
\t// 1.獲取SecurityManager工廠對象
\tFactory<securitymanager> factory =
\t\t\tnew IniSecurityManagerFactory("classpath:shiro.ini");
\t// 2.通過Factory對象獲取SecurityManager對象
\tSecurityManager securityManager = factory.getInstance();
\t// 3.將SecurityManager對象添加到當前運行環境中
\tSecurityUtils.setSecurityManager(securityManager);
\t
\t// 4.獲取Subject對象
\tSubject subject = SecurityUtils.getSubject();
\tAuthenticationToken token = new UsernamePasswordToken("zhang", "123");
\t// 登錄操作
\ttry {
\t\tsubject.login(token);
\t} catch (UnknownAccountException e) {
\t\tSystem.out.println("賬號出錯...");
\t} catch(IncorrectCredentialsException e){
\t\tSystem.out.println("密碼出錯...");
\t}

\t// 獲取登錄的狀態
\tSystem.out.println(subject.isAuthenticated());
\t// 認證通過後進行權限驗證 角色
\tSystem.out.println(subject.getPrincipal()+"是否具有role1角色:"+subject.hasRole("role1"));
\tSystem.out.println(subject.getPrincipal()+"是否具有role3角色:"+subject.hasRole("role3"));
\tboolean[] types = subject.hasRoles(Arrays.asList("role1","role2"));
\tSystem.out.println(subject.getPrincipal()+"是否具有role1和role2角色:"+types[0]+","+types[1]);
\t//subject.checkRole("role1");
\t//subject.checkRole("role3");
\t// 驗證權限
\tSystem.out.println(subject.getPrincipal()+"是否具有user:create權限:"+subject.isPermitted("user:create"));
\tSystem.out.println(subject.getPrincipal()+"是否具有user:delete角色:"+subject.isPermitted("user:delete"));
\tboolean t = subject.isPermittedAll("user:create","user:delete");
\tSystem.out.println(subject.getPrincipal()+"是否具有user:create和user:delete的權限:"+t);
}/<securitymanager>

輸出結果:

true
zhang是否具有role1角色:true
zhang是否具有role3角色:false
zhang是否具有role1和role2角色:true,true
zhang是否具有user:create權限:true
zhang是否具有user:delete角色:true
zhang是否具有user:create和user:delete的權限:true

注意

subject.checkRole("role3");
subject.checkPermission("aaa");

檢查是否存在該角色和權限,如果不存在則會拋異常

Shiro教程4(授權操作)

Shiro教程4(授權操作)

/**
* 授權方法
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
\t// 獲取當前登錄的賬號
\tString userName = (String) principals.getPrimaryPrincipal();
\t// 根據賬號信息 可以去數據庫中查詢出該賬號對應的 角色和權限信息
\t
\tList<string> roles = new ArrayList<>();
\troles.add("r1");
\troles.add("r2");
\troles.add("r3");
\t
\tList<string> ps = new ArrayList<>();

\tps.add("order:create");
\tps.add("order:query");
\tps.add("order:delete");
\t
\tSimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
\t// 添加角色
\tinfo.addRole("role1");
\tinfo.addRoles(roles);
\t// 添加權限
\tinfo.addStringPermission("user:update");
\tinfo.addStringPermissions(ps);
\treturn info;
}/<string>/<string>

ini.xml文件

[main]
#自定義 realm
customRealm=com.dpb.realm.MyRealm
#將realm設置到securityManager
securityManager.realms=$customRealm

測試方法和之前一樣

@Test
public void test() {
\t// 1.獲取SecurityManager工廠對象
\tFactory<securitymanager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
\t// 2.通過Factory對象獲取SecurityManager對象
\tSecurityManager securityManager = factory.getInstance();
\t// 3.將SecurityManager對象添加到當前運行環境中
\tSecurityUtils.setSecurityManager(securityManager);

\t// 4.獲取Subject對象
\tSubject subject = SecurityUtils.getSubject();
\tAuthenticationToken token = new UsernamePasswordToken("root", "123456");
\t// 登錄操作
\ttry {
\t\tsubject.login(token);
\t} catch (UnknownAccountException e) {
\t\tSystem.out.println("賬號出錯...");
\t} catch (IncorrectCredentialsException e) {
\t\tSystem.out.println("密碼出錯...");
\t}

\t// 獲取登錄的狀態
\tSystem.out.println(subject.isAuthenticated());

\t// 獲取登錄的狀態
\tSystem.out.println(subject.isAuthenticated());
\t// 認證通過後進行權限驗證 角色
\tSystem.out.println(subject.getPrincipal() + "是否具有role1角色:" + subject.hasRole("role1"));
\tSystem.out.println(subject.getPrincipal() + "是否具有role3角色:" + subject.hasRole("role3"));
\tboolean[] types = subject.hasRoles(Arrays.asList("role1", "role2"));
\tSystem.out.println(subject.getPrincipal() + "是否具有role1和role2角色:" + types[0] + "," + types[1]);
\t// subject.checkRole("role1");
\t//subject.checkRole("role3");
\t// 驗證權限
\tSystem.out.println(subject.getPrincipal() + "是否具有user:create權限:" + subject.isPermitted("user:create"));
\tSystem.out.println(subject.getPrincipal() + "是否具有user:delete角色:" + subject.isPermitted("user:delete"));
\tboolean t = subject.isPermittedAll("user:create", "user:delete");
\tSystem.out.println(subject.getPrincipal() + "是否具有user:create和user:delete的權限:" + t);
\t//subject.checkPermission("aaa");
}/<securitymanager>


分享到:


相關文章: