Shiro學習筆記 三(認證受權)

 

第一種首先基於角色的權限控制java

1.因爲不斷的建立SecurityFactory工程等步驟重複屢次,因此應該將這些步驟封裝成一個工具類apache

仍是首先看一下目錄結構工具

主要用到文件  學習

首先貼一下工具類的方法測試

package com.zuoyan.utils;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
/**
 * 將獲取當前用戶封裝成一個方法,方便每次調用
 * @author zuoyan
 *
 */
public class ShiroUtil {

    /**
     * 獲取當前用戶  1.配置文件的位置 2.用戶得帳號 3.用戶的密碼
     * @param configFile
     * @param userName
     * @param password
     * @return
     */
    public static Subject login(String configFile,String userName,String password){
        // 讀取配置文件,初始化SecurityManager工廠
        Factory<SecurityManager> factory=new IniSecurityManagerFactory(configFile);
        // 獲取securityManager實例
        SecurityManager securityManager=factory.getInstance();
        // 把securityManager實例綁定到SecurityUtils
        SecurityUtils.setSecurityManager(securityManager);
        // 獲得當前執行的用戶
        Subject currentUser=SecurityUtils.getSubject();
        // 建立token令牌,用戶名/密碼
        UsernamePasswordToken token=new UsernamePasswordToken(userName, password);
        try{
            // 身份認證
            currentUser.login(token);    
            System.out.println("身份認證成功!");
        }catch(AuthenticationException e){
            e.printStackTrace();
            System.out.println("身份認證失敗!");
        }
        return currentUser;
    }
}

 

shiro_role.int配置文件中的內容spa

[users]
zuoyan=zuoyan123,role1,role2,role3
java1234=123456,role1,role2
jack=123,role1

 

還有最後就是在測試方法中調用的代碼3d

RoleTest.javacode

package com.zuoyan.shiro;



import java.util.Arrays;

import org.apache.shiro.subject.Subject;
import org.junit.Test;

import com.zuoyan.utils.ShiroUtil;


public class RoleTest {

    @Test
    public void testHasRole() {
        Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "zuoyan", "zuoyan123");
        // Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "jack", "123");
        System.out.println(currentUser.hasRole("role1")?"有role1這個角色":"沒有role1這個角色");
        boolean []results=currentUser.hasRoles(Arrays.asList("role1","role2","role3"));
        System.out.println(results[0]?"有role1這個角色":"沒有role1這個角色");
        System.out.println(results[1]?"有role2這個角色":"沒有role2這個角色");
        System.out.println(results[2]?"有role3這個角色":"沒有role3這個角色");
        System.out.println(currentUser.hasAllRoles(Arrays.asList("role1","role2"))?"role1,role2這兩個角色都有":"role1,role2這個兩個角色不全有");
        
        currentUser.logout();
    }

    @Test
    public void testCheckRole() {
        Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "java1234", "123456");
        // Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "jack", "123");
        currentUser.checkRole("role1");
        //這兩個方法是同樣的若是沒有經過就會報錯
        currentUser.checkRoles(Arrays.asList("role1","role2"));
        currentUser.checkRoles("role1","role2","role3");
        
        currentUser.logout();
    }
}

這種狀況是認證成功的效果blog

 

 

 若是要是用戶的認證都沒有經過的話,那麼向下執行就會顯示沒有XXX這個角色token

--------------------------------------------------------------下面學習受權-------------------------------------------------------------

在資源文件下建立    shiro_permission.ini

文件中的內容爲:

[users]
java1234=123456,role1,role2
jack=123,role1
[roles]
role1=user:select
role2=user:add,user:update,user:delete

role1 角色只具備查找的權限   role2的角色能夠進行  增 刪  改

新建一個測試類,就是測試角色權限的

以下代碼

package com.zuoyan.shiro;

import org.apache.shiro.subject.Subject;
import org.junit.Test;

import com.zuoyan.utils.ShiroUtil;

public class PermissionTest {
    
    @Test
    public void testIsPermitted() {
        Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "java1234", "123456");
        // Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123");
        System.out.println(currentUser.isPermitted("user:select")?"有user:select這個權限":"沒有user:select這個權限");
        System.out.println(currentUser.isPermitted("user:update")?"有user:update這個權限":"沒有user:update這個權限");
        boolean results[]=currentUser.isPermitted("user:select","user:update","user:delete");
        System.out.println(results[0]?"有user:select這個權限":"沒有user:select這個權限");
        System.out.println(results[1]?"有user:update這個權限":"沒有user:update這個權限");
        System.out.println(results[2]?"有user:delete這個權限":"沒有user:delete這個權限");
        System.out.println(currentUser.isPermittedAll("user:select","user:update")?"有user:select,update這兩個權限":"user:select,update這兩個權限不全有");
        
        currentUser.logout();
    }

    @Test
    public void testCheckPermitted() {
        Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "java1234", "123456");
        // Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123");
        currentUser.checkPermission("user:select");
        currentUser.checkPermissions("user:select","user:update","user:delete");
        currentUser.logout();
    }

}

運行效果圖

 

 此次測試更換一個用戶帳號,權限比較小的,

判斷權限的語句 :currentUser.isPermitted (參數是用戶的權限)

返回值是bool類型的

 

使用check的狀況  

若是不成功   就會拋出異常! 並且沒有返回值

相關文章
相關標籤/搜索