shiro基礎學習(三)—shiro授權


一、入門程序

1.授權流程

     image

 

2.授權的三種方式

(1)編程式: 通過寫if/else 授權代碼塊完成。

Subject subject = SecurityUtils.getSubject();

if(subject.hasRole("admin")) {

     //有權限

} else {

     //無權限

}

(2)注解式: 通過在執行的Java方法上放置相應的注解完成。

@RequiresRoles("admin")

public void hello() {

     //有權限

}

(3)JSP/GSP 標簽: 在JSP/GSP 頁面通過相應的標簽完成。

<shiro:hasRole name="admin">

     <!— 有權限—>

</shiro:hasRole>

 

3.ini文件

shiro-permission.ini

image

     在ini文件中用戶、角色、權限的配置規則是:“用戶名=密碼,角色1,角色2...” “角色=權限1,權限2...”,首先根據用戶名找角色,再根據角色找權限,角色是權限集合。

     權限字符串的規則是:“資源標識符:操作:資源實例標識符”,意思是對哪個資源的哪個實例具有什么操作,“:”是資源/操作/實例的分割符,權限字符串也可以使用*通配符。

例子:

用戶創建權限: user:create,或user:create:*

用戶修改實例001的權限: user:update:001

用戶實例001的所有權限: user:*:001

 

4.測試代碼

/*
 * 授權的測試
 */
public class AuthorzationTest{

	//角色授權、資源授權測試
	
	@Test
	public void testAuthorzation(){
		//創建SecurityManager工廠
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-permission.ini");
		
		//創建SecurityManager
		SecurityManager securityManager = factory.getInstance();
		
		//將SecurityManager設置到系統環境
		SecurityUtils.setSecurityManager(securityManager);
		
		//創建Subject
		Subject subject = SecurityUtils.getSubject();

		//創建token令牌
		UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123");
		
		//執行認證
		try{
			subject.login(token);
		}catch(AuthenticationException e){
			e.printStackTrace();
		}
		
		System.out.println("是否認認證通過: " + subject.isAuthenticated());
		
		
		//基於角色的授權(角色標識)
		boolean hasRole = subject.hasRole("role3");
		System.out.println("基於角色的授權: " + hasRole);
		
		//基於資源的授權(權限標識符)
		boolean permitted = subject.isPermitted("user:create");
		System.out.println("基於資源的授權: " + permitted);
	}
	
}

結果:

       是否認認證通過: true
       基於角色的授權: false
       基於資源的授權: true

 

二、自定義Realm

1.shiro-realm.ini

     在shiro-realm.ini中配置自定義的realm,將realm設置到securityManager中。

     image

 

2.實現代碼

/*
 * 自定義Realm
 */
public class CustomRealm extends AuthorizingRealm{

	
	//設置Realm名稱
	@Override
	public void setName(String name){
		super.setName("customRealm");
	}

	//用於認證
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException{
		
		//1.從token取出用戶身份信息
		String userCode = (String)token.getPrincipal();
		
		//2.根據用戶userCode查詢數據庫
		//模擬從數據庫查詢到的密碼
		String password = "123";
		
		//3.查詢到返回認證信息
		SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userCode,password,this.getName());
		
		return info;
	}

	//用於授權
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals){
		
		//獲取主身份信息
		 String userCode = (String)principals.getPrimaryPrincipal();
		 
		 //根據身份信息獲取權限信息
		 //模擬從數據庫獲取到數據
		 List<String> permissions = new ArrayList<String>();
		 permissions.add("user:create"); //用戶的創建權限
		 permissions.add("items:add"); //商品的添加權限
		 
		 //將查詢到授權信息填充到對象中
		 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
		 info.addStringPermissions(permissions);
		 
		return info;
	}
}

 

3.測試代碼

	@Test
	public void testCusRealm(){
		//創建SecurityManager工廠
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-realm.ini");
		
		//創建SecurityManager
		SecurityManager securityManager = factory.getInstance();
		
		//將SecurityManager設置到系統環境
		SecurityUtils.setSecurityManager(securityManager);
		
		//創建Subject
		Subject subject = SecurityUtils.getSubject();
		
		//創建token令牌
		UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123");
		
		//執行認證
		try{
			subject.login(token);
		}catch(AuthenticationException e){
			e.printStackTrace();
		}
		
		System.out.println("是否認認證通過: " + subject.isAuthenticated());
		
		
		//基於資源的授權(權限標識符)
		boolean permitted = subject.isPermitted("user:create");
		System.out.println("基於資源的授權: " + permitted);
	}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM