ApacheShiro是一個(gè)功能強(qiáng)大且易于使用的Java安全框架必怜,提供了認(rèn)證,授權(quán)妆距,加密,和會(huì)話管理朴恳。
Shiro有三大核心組件:
Subject:即當(dāng)前用戶,在權(quán)限管理的應(yīng)用程序里往往需要知道誰能夠操作什么,誰擁有操作該程序的權(quán)利包雀,shiro中則需要通過Subject來提供基礎(chǔ)的當(dāng)前用戶信息憋他,Subject 不僅僅代表某個(gè)用戶孩饼,與當(dāng)前應(yīng)用交互的任何東西都是Subject,如網(wǎng)絡(luò)爬蟲等竹挡。所有的Subject都要綁定到SecurityManager上捣辆,與Subject的交互實(shí)際上是被轉(zhuǎn)換為與SecurityManager的交互。
SecurityManager:即所有Subject的管理者此迅,這是Shiro框架的核心組件,可以把他看做是一個(gè)Shiro框架的全局管理組件旧巾,用于調(diào)度各種Shiro框架的服務(wù)耸序。作用類似于SpringMVC中的DispatcherServlet,用于攔截所有請(qǐng)求并進(jìn)行處理鲁猩。
Realm:Realm是用戶的信息認(rèn)證器和用戶的權(quán)限人證器坎怪,我們需要自己來實(shí)現(xiàn)Realm來自定義的管理我們自己系統(tǒng)內(nèi)部的權(quán)限規(guī)則。SecurityManager要驗(yàn)證用戶廓握,需要從Realm中獲取用戶搅窿。可以把Realm看做是數(shù)據(jù)源隙券。
1男应、搭建測(cè)試工程
新建一個(gè)maven項(xiàng)目,簡單了解一下Shiro的API娱仔。
2沐飘、引入jar包
在pom.xml加上依賴
# 日志
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
# shiro
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
如需配置日志打印,在resources文件夾新建log4j.properties文件牲迫,內(nèi)容為:
log4j.rootLogger=INFO, stdout,
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
3耐朴、編寫shiro配置文件:在resources文件夾下新建shiro.ini文件,文件內(nèi)容如下:
# 用戶
[users]
#賬號(hào)=密碼,角色1,角色2(角色可以無限多:用英文逗號(hào)隔開盹憎,用戶多個(gè)的話換行一樣的格式)
test=123456,role1,role2
# 角色
[roles]
#角色=權(quán)限1,權(quán)限2(權(quán)限可以無限多:用英文逗號(hào)隔開筛峭,角色多個(gè)的話換行一樣的格式)
role2=perm1
role1=perm1,perm2
4、測(cè)試代碼
public class ShiroTest {
private static final transient Logger log =
LoggerFactory.getLogger(ShiroTest.class);
public static void main(String[] args){
//1陪每、SecurityManager:classpath:shiro.ini
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//2影晓、解析配置文件,并返回一些SecurityManager
SecurityManager securityManager = factory.getInstance();
//3奶稠、SecurityManager綁定給SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
//4俯艰、安全操作,Subject是當(dāng)前登錄的用戶
Subject currentUser = SecurityUtils.getSubject();
//5锌订、測(cè)試在應(yīng)用的當(dāng)前回話中設(shè)置屬性
Session session = currentUser.getSession();
//如果用戶沒有登陸過
if(!currentUser.isAuthenticated()){
UsernamePasswordToken token = new UsernamePasswordToken("test","123456");
//記住我
token.setRememberMe(true);
try{
currentUser.login(token);
log.info("用戶【"+currentUser.getPrincipal()+"】 登錄成功");
//登錄之后查看是否擁有指定角色
if(currentUser.hasRole("admin")){
log.info("有admin角色");
}else{
log.info("沒有admin角色");
}
if(currentUser.hasRole("role1")){
log.info("有role1角色");
}else{
log.info("沒有role1角色");
}
//查看用戶是否擁有某個(gè)權(quán)限
if(currentUser.isPermitted("perm1")){
log.info("有perm1權(quán)限");
}else{
log.info("沒有perm1權(quán)限");
}
if(currentUser.isPermitted("guest")){
log.info("有g(shù)uest權(quán)限");
}else{
log.info("沒有g(shù)uest權(quán)限");
}
//登出
currentUser.logout();
}catch (UnknownAccountException uae){
log.info(token.getPrincipal()+" 賬戶不存在");
}catch (IncorrectCredentialsException ice){
log.info(token.getPrincipal()+" 密碼不正確");
}catch (LockedAccountException lae){
log.info(token.getPrincipal()+" 用戶被鎖定了 ");
}catch (AuthenticationException ae){
//無法判斷是什么錯(cuò)
log.info(ae.getMessage());
}
}
}
}
注:rememberMe只能記住你登錄過竹握,但不會(huì)記住你的權(quán)限信息。
小技巧
在我們開發(fā)的過程中辆飘,我們經(jīng)常會(huì)遇到修改一點(diǎn)點(diǎn)東西時(shí)候啦辐,都需要重啟操作來生效谓传。因此,spring boot為我們提供了一個(gè)devTool熱更新工具芹关,無需重啟即可生效
pom.xml中引入相關(guān)jar
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF8</project.reporting.outputEncoding>
</properties>
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
...
<dependencies>
如何使用
【提示】: 由于我自己使用的是idea進(jìn)行開發(fā),因此對(duì)eclipse的引入是否需要快捷鍵并不是很清楚续挟,提供了相關(guān)鏈接
IDEA使用:
- 修改了java類的地方,使用Ctrl+Shift+F9進(jìn)行熱更新
- 靜態(tài)頁面/模板頁面侥衬,使用Ctrl+F9進(jìn)行熱更新
- 快捷鍵使用后不生效诗祸?前往File-Settings-Compiler-Build Project automatically選項(xiàng)開始idea自動(dòng)編譯
eclipse使用:
- 直接引入
- 不生效?Eclipse熱部署