1 Shiro簡單使用
阿新 • • 發佈:2018-12-29
程式碼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);
}
}