第一種首先基於角色的權限控制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的狀況
若是不成功 就會拋出異常! 並且沒有返回值