1. 程式人生 > >shiro學習之路(4)------角色認證授權,許可權認證授權

shiro學習之路(4)------角色認證授權,許可權認證授權

思路介紹:

首先通過使用者登入獲取到Subject物件,通過裡面的一些方法來判斷使用者的角色.

例:

1.判斷是否擁有該角色,返回boolean值

subject.hasRole("role2") 返回一個boolean型
subject.hasRoles(List<String> list)返回一個boolean型陣列,通過迴圈對面一個角色進行判斷
subject.hasAllRoles(List<String> list)返回一個boolean型,判斷使用者是否擁有所有角色
檢測是否擁有該角色,如果沒有直接丟擲異常
subject.checkRole("role1"
); subject.checkRoles(Arrays.asList("role1","role2")); subject.checkRoles("role1","role2");

2.許可權驗證:返回boolean值,用法和角色認證一樣
subject.isPermitted(String str);
subject.isPermitted(String...strings);
subject.isPermittedAll(String...strings);
3.新建.ini檔案,建立一個角色的.ini和一個許可權的.ini檔案

左邊表示使用者,右邊第一個表示密碼,後面就表示該使用者所擁有的角色

上面的users表示使用者和角色,下面是設定該角色所擁有的許可權

4.新增一個junit包

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
</dependency>

5.新建一個測試類

 /**
  * 角色認證授權-HasRole
  */
@Test
public void roleHasRole(){
    Subject subject = login("classpath:shiro_role.ini"
,"spf","123456"); System.out.println(subject.hasRole("role2")?"有role2角色":"沒有role2角色"); boolean[] flags = subject.hasRoles(Arrays.asList("role1","role2")); System.out.println(flags[0]?"有role1角色":"沒有role1角色"); System.out.println(flags[1]?"有role2角色":"沒有role2角色"); System.out.println(subject.hasAllRoles(Arrays.asList("role1","role2"))?"role1,role2兩個角色都有":"role1,role2兩個角色不全有"); subject.logout(); } /** * 角色認證授權-CheckRole * 認證不成功就丟擲異常 */ @Test public void roleCheckRole(){ Subject subject = login("classpath:shiro_role.ini","spf","123456"); subject.checkRole("role1"); subject.checkRoles(Arrays.asList("role1","role2")); subject.checkRoles("role1","role2"); subject.logout(); } /** * 許可權認證授權-isPermitted */ @Test public void rolePermitted(){ Subject subject = login("classpath:shiro_permitted.ini","spf","123456"); //Subject subject = login("classpath:shiro_permitted.ini","jack","123"); System.out.println(subject.isPermitted("update")?"有update這個許可權":"沒有update這個許可權"); boolean[] flags = subject.isPermitted("select","update"); System.out.println(flags[0]?"有select這個許可權":"沒有select這個許可權"); System.out.println(flags[1]?"有update這個許可權":"沒有update這個許可權"); System.out.println(subject.isPermittedAll("select","update")?"有select,update這兩個許可權":"select,update這兩個許可權不全有"); subject.logout(); } private Subject login(String url, String username, String password){ // 讀取配置檔案,初始化SecurityManager工廠 Factory<SecurityManager> factory = new IniSecurityManagerFactory(url); // 獲取securityManager例項 SecurityManager securityManager=factory.getInstance(); // 把securityManager例項繫結到SecurityUtils SecurityUtils.setSecurityManager(securityManager); // 得到當前執行的使用者 Subject subject = SecurityUtils.getSubject(); // 建立token令牌,使用者名稱/密碼 UsernamePasswordToken token=new UsernamePasswordToken(username, password); try { // 身份認證 subject.login(token); System.out.println("身份認證成功"); } catch (AuthenticationException e) { e.printStackTrace(); if (e instanceof IncorrectCredentialsException) { throw new IncorrectCredentialsException("密碼錯誤"); } else if (e instanceof UnknownAccountException) { throw new UnknownAccountException("使用者名稱錯誤"); } } return subject; }

OK!