1. 程式人生 > >1 Shiro簡單使用

1 Shiro簡單使用

程式碼git地址

https://github.com/3748/Shiro.git

1.1 依賴引入

<dependency>
	<groupId>org.apache.shiro</groupId>
	<artifactId>shiro-spring</artifactId>
	<version>1.3.2</version>
</dependency>

1.2 配置

  • shiro.ini
[users]
# 使用者 : gp6
# 密碼 : 123456
# 角色 : role1和role2
gp6 = 123456, role1, role2

################################        users ----> roles   分割線  ########################

[roles]
# 角色role1可以對permitted1做任何操作
role1 = permitted1:*

# 角色role2允許對user型別的gp6使用者進行刪除delete操作
# 型別 : type
# 操作 : delete
# 使用者 : user1
role2 = type:delete:user1

1.3 簡單使用

package com.gp6.shiro01;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import
org.apache.shiro.util.Factory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 簡單的快速啟動應用程式,演示如何使用Shiro的API */ public class Quickstart { private static final transient Logger log = LoggerFactory.getLogger(Quickstart.class); public static void main(String[] args) { /* 建立具有配置的realms、users、roles和permissions的Shiro SecurityManager的最簡單方法是使用簡單的INI配置 通過使用一個工廠來完成,該工廠可以攝取classpath下的shiro.ini檔案以及返回一個SecurityManager例項 */
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); SecurityManager securityManager = factory.getInstance(); /* 對於這個簡單的示例quickstart,製作SecurityManager可作為JVM單例訪問。 大多數應用程式不會這樣做,而是依賴於它們的容器配置或web.xml */ SecurityUtils.setSecurityManager(securityManager); // 獲取當前的 Subject,呼叫SecurityUtils.getSubject() Subject currentUser = SecurityUtils.getSubject(); // 測試使用Session // 獲取Session,呼叫Subject.getSession() Session session = currentUser.getSession(); session.setAttribute("someKey", "Value"); String value = (String) session.getAttribute("someKey"); if (value.equals("Value")) { log.info("從session中獲取設入的值[" + value + "]"); } // 檢驗當前使用者是否登入 // 呼叫Subject的isAuthenticated() if (!currentUser.isAuthenticated()) { // 將使用者名稱和密碼封裝為 UsernamePasswordToken 物件 UsernamePasswordToken token = new UsernamePasswordToken("gp6", "123456"); // 記住我 token.setRememberMe(true); try { // 登入 currentUser.login(token); } catch (UnknownAccountException uae) { log.info("使用者[{}]不存在" , token.getPrincipal()); return; } catch (IncorrectCredentialsException ice) { log.info("用號[{}]存在,密碼錯誤" ,token.getPrincipal()); return; } catch (LockedAccountException lae) { log.info("用號[{}]被鎖定",token.getPrincipal()); return; }catch (AuthenticationException ae) { log.info("認證異常的父類"); return; } } log.info("用號[{}]登入成功",currentUser.getPrincipal()); // 測試是否有某一個角色. 呼叫 Subject 的 hasRole 方法. if (currentUser.hasRole("role1")) { log.info("使用者[{}]擁有[role1]角色",currentUser.getPrincipal()); } else { log.info("使用者[{}]不擁有角色[role1]",currentUser.getPrincipal()); return; } // 測試使用者是否具備某一個行為. 呼叫 Subject 的 isPermitted() 方法 if (currentUser.isPermitted("permitted1:update")) { log.info("可以修改"); } else { log.info("不能修改"); } // 測試使用者是否具備某一個行為. if (currentUser.isPermitted("type:delete:user1")) { log.info("允許對user型別的gp6使用者進行刪除delete操作"); } else { log.info("Sorry, 許可權不足!"); } // 登出前,已認證 System.out.println("---->" + currentUser.isAuthenticated()); // 執行登出. 呼叫 Subject 的 Logout() 方法. currentUser.logout(); // 登出後,未認證 System.out.println("---->" + currentUser.isAuthenticated()); System.exit(0); } }