Shiro是由Apache提供的一个强大且易用的Java安全开源框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

在Shrio中主要提供了授权,认证,加密,事务管理(可以不需要web容器 ),web集成,集成等主要功能。

Shrio主要内容:

Authentication(授权):有时候就类似于登陆

Authorization(认证):访问控制,控制是否可以访问某些指定的资源

SessionManagement(事务管理):即使没有web容器,也可以为用户管理自己的Session

Cryptography(加密):为数据加密

还有蓝色部分的一些支持的功能。

在Shrio里面有三个基本概念:

Subject:可以理解为当前用户,不一定是人,也有可能是一个线程之类第三方服务的。需要绑定到一个SecurityManager,

当我们跟一个Subject交互的时候,它把交互内容转换成一个跟SecurityManager的交互信息。

SecurityManager:是Shrio结构中的核心。管理着所有的Subject。

Realms:Realm扮演着用户安全数据和Shrio之间的桥梁。当我们认证或者授权的时候,都会去Realms中查找这些信息。

就像是我们程序中的DAO层,保存着我们数据库的连接信息一样。在SecurityManager中至少需要配置一个Realms,

但是也可以配置多个。

Shiro的详细结构:

Subject和SecurityManager我们上面都说过了,下面就来简单介绍下其他的几个组件。  

Authenticator:主要负责执行用户的验证操作,去Realms中都需验证信息等等。

Authentication Strategy:当我们配置了多个Realms的时候,认证策略主要负责觉得我们认证通过的原则。

Authorizer:主要负责判断用户是否用访问xx资源的权限。

SessionManager:提供了一个管理session的环境,可以让用户在非web容器的环境下使用session。

SessionDao:用来持久化session

CacheManager:用来获取Cache实例,管理缓存,提高效率。

Cyptography:加密操作

需要注意的是,这些都是在SecurityManager的管理下的。作为一个轻量级的容器。对操作进行转发。而实际操作都是由各个组件来完成的。

下面就来简单体验一下,我们使用的是Maven项目。

下面是pom文件,shiro依赖了slf4j和log4j包。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.fuwh</groupId>
<artifactId>shirodemo</artifactId>
<version>0.0.1-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.3.2</version>
</dependency> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency> </dependencies> </project>

需要注意的是,在添加slf4j-log4j12依赖包的时候,在Maven仓库中直接添加的依赖信息中,有scope为test,需要去掉,不然可能会导致下面的错误。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

由于是第一个例子,我们就按照shiro逛网给出的一种简单方式,用配置文件中写入用户名密码的认证方式来体验一下登陆检证。

[users]
fuwh=fuwh1234
package com.fuwh.demo;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
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; public class ShiroDemo01 { private static Logger log=LoggerFactory.getLogger(ShiroDemo01.class);
public static void main(String[] args) {
//取得SecurityManager工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
//取得SecurityManager实例
SecurityManager securityManager=factory.getInstance();
//将securityManager绑定到SecurityUtil
SecurityUtils.setSecurityManager(securityManager); /* 至此为止,简单的shiro环境就配置好了 */ //取得当前用户
Subject currentUser=SecurityUtils.getSubject();
//取得当前用户的session
Session session=currentUser.getSession();
//可以在web容器中一样使用session
session.setAttribute("attr","value");
log.info("取得的值:"+session.getAttribute("attr").toString()); //使用shiro来进行登陆验证
if(!currentUser.isAuthenticated()) {
UsernamePasswordToken token=new UsernamePasswordToken("fuwh","fuwh1234");
try {
currentUser.login(token);
log.info("登陆成功!!!");
} catch (Exception e) {
e.printStackTrace();
log.error("认证失败...");
}
}
currentUser.logout();
}
}

这就实现了一个简单的通过Shiro的配置文件来验证登陆。

当然,Shiro能做的远远不止这些,下面,我们在shiro.ini文件中加入一些角色的验证信息。

[users]
fuwh=fuwh1234,admin [roles]
admin=lightsaber:test

修改程序代码如下:

package com.fuwh.demo;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
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; public class ShiroDemo01 { private static Logger log=LoggerFactory.getLogger(ShiroDemo01.class);
public static void main(String[] args) {
//取得SecurityManager工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
//取得SecurityManager实例
SecurityManager securityManager=factory.getInstance();
//将securityManager绑定到SecurityUtil
SecurityUtils.setSecurityManager(securityManager); /* 至此为止,简单的shiro环境就配置好了 */ //取得当前用户
Subject currentUser=SecurityUtils.getSubject();
//取得当前用户的session
Session session=currentUser.getSession();
//可以在web容器中一样使用session
session.setAttribute("attr","value");
log.info("取得的值:"+session.getAttribute("attr").toString()); //使用shiro来进行登陆验证
if(!currentUser.isAuthenticated()) {
UsernamePasswordToken token=new UsernamePasswordToken("fuwh","fuwh1234");
try {
currentUser.login(token);
log.info("登陆成功!!!");
} catch (Exception e) {
e.printStackTrace();
log.error("认证失败...");
}
} log.info("角色认证开始....");
if(currentUser.hasRole("admin")) {
log.info("当前用户有admin角色");
}else {
log.info("当前用户没有admin角色");
} log.info("权限认证开始....");
if(currentUser.isPermitted("lightsaber:debug")) {
log.info("当前用户有lightsaber:debug权限");
}else {
log.info("当前用户没有lightsaber:debug权限");
} currentUser.logout();
}
}
2017-08-20 21:16:33,432 [main] INFO  [org.apache.shiro.session.mgt.AbstractValidatingSessionManager] - Enabling session validation scheduler...
2017-08-20 21:16:34,048 [main] INFO [com.fuwh.demo.ShiroDemo01] - 取得的值:value
2017-08-20 21:16:34,051 [main] INFO [com.fuwh.demo.ShiroDemo01] - 登陆成功!!!
2017-08-20 21:16:34,051 [main] INFO [com.fuwh.demo.ShiroDemo01] - 角色认证开始....
2017-08-20 21:16:34,051 [main] INFO [com.fuwh.demo.ShiroDemo01] - 当前用户有admin角色
2017-08-20 21:16:34,051 [main] INFO [com.fuwh.demo.ShiroDemo01] - 权限认证开始....
2017-08-20 21:16:34,052 [main] INFO [com.fuwh.demo.ShiroDemo01] - 当前用户没有lightsaber:debug权限

上面就是运行的结果了....

Shiro入门的更多相关文章

  1. Apache shiro集群实现 (一) shiro入门介绍

    近期在ITOO项目中研究使用Apache shiro集群中要解决的两个问题,一个是Session的共享问题,一个是授权信息的cache共享问题,官网上给的例子是Ehcache的实现,在配置说明上不算很 ...

  2. 用户认证授权和Shiro入门

    1.权限管理基础(认证和授权): 前言 本文主要讲解的知识点有以下: 权限管理的基础知识 模型 粗粒度和细粒度的概念 回顾URL拦截的实现 Shiro的介绍与简单入门 一.Shiro基础知识 在学习S ...

  3. shiro入门教程

    一.shiro入门 shiro.ini和log4j.properties要放在src下面,lib是和src同级别的,然后lib下面的jar包是必须的,lib下面的jar包需要add path,如果报错 ...

  4. 转:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权

    原文地址:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法.shiro认证与shiro授权 以下是部分内容,具体见原文. shiro介绍 什么是shiro shiro是Apache ...

  5. Shiro入门指引

    最近项目中用到Shiro,专门对其研究了一番,颇有收获,以下是笔者最近写的博客,希望对大家入门有所帮助. Shiro入门资源整理 Shiro在SpringBoot中的使用 Shiro源码解析-登录篇 ...

  6. Shiro——入门Demo

    Shiro——入门Demo 环境-  引入相关maven依赖, shiro-core,commons-logging 配置shiro配置文件:ini后缀 主方法测试: import org.apach ...

  7. Shiro入门学习之shi.ini实现授权(三)

    一.Shiro授权 前提:需要认证通过才会有授权一说 1.授权过程 2.相关方法说明 ①subject.hasRole("role1"):判断是否有该角色 ②subject.has ...

  8. Shiro入门学习与实战(一)

    一.概述 1.Shiro是什么? Apache Shiro是java 的一个安全框架,主要提供:认证.授权.加密.会话管理.与Web集成.缓存等功能,其不依赖于Spring即可使用: Spring S ...

  9. shiro入门学习--使用MD5和salt进行加密|练气后期

    写在前面 在上一篇文章<Shiro入门学习---使用自定义Realm完成认证|练气中期>当中,我们学会了使用自定义Realm实现shiro数据源的切换,我们可以切换成从关系数据库如MySQ ...

  10. 安全框架Shiro入门

    Shiro简介 Apache Shiro是Java的一个安全框架,官网为shiro.apache.org,主要场景为控制登陆,判断用户是否有访问某个功能的权限等等. Shiro的核心功能(入门知识,只 ...

随机推荐

  1. Spring Boot 系列(二)单元测试&网络请求

    实际开发中,Junit单元测试是必不可少的.在spring-boot 中可以通过测试模块(spring-boot-starter-test)快速使用单元测试功能. 开始 本示例在 spring boo ...

  2. js模块加载之AMD和CMD

    当我写这篇文章的时候,sea.js已经逐渐退出历史的舞台,详细链接.不过任何新事物的出现都是对旧事物的取其精华,去其糟粕,所以了解一下以前模块的加载也是一件好事. js模块化的原因自不比多说,看看HU ...

  3. Java字符串格式化记录

    最近打log的时候用到了字符串的格式化. Java中String格式化和C语言的很类似.把情况都列出来,以后好查询. public static void main(String[] args) { ...

  4. C++学习(五)入门篇——基本类型

    面向对象编程的本质是设计并扩展自己的数据类型,让类型和数据匹配. 内置C++分成两种类型:基本类型和复合类型 1.简单变量 程序需要存储信息时,必须记录三个基本属性 (1)信息将存储在哪 (2)要存储 ...

  5. xdu_1165:均值滤波

    题目: Problem A 均值滤波问题描述图像中的噪声在空间上的自相关很低,因此往往可以用均值滤波加以削弱.具体来说,对于每个像素点P(x; y),我们选出所有距P 的Manhattan 距离不超过 ...

  6. 可存放任意类型变量的动态数组--C语言实现

    之前在训练营的时候被要求用C语言实现一个可以存放任意类型数据的栈.现在尝试实现一个数组版本. 首先用到的结构体如下(接触了Win32编程所以长得有点像里面的那些类型): typedef struct ...

  7. OpenCV探索之路(二十一)如何生成能在无opencv环境下运行的exe

    我们经常遇到这样的需求:我们在VS写好的程序,需要在一个没有装opencv甚至没有装vs的电脑下运行,跑出效果.比如,你在你的电脑用opencv+vs2015写出一个程序,然后老师叫你把程序发给他,他 ...

  8. iOS项目冗余资源扫描脚本

    iOS项目冗余资源扫描脚本 随着iOS项目的版本不断迭代,app中冗余文件会越来越多,app size也持续增加,是时候需要对app冗余资源进行检测,对app进行瘦身. 使用方法: 1. 运行环境为m ...

  9. 前端数据存储方案集合(cookie localStorage等)以及详解 (一)

    客户端.前端 存储 一. 起 因 首先解释下为什么想来写这个关于前端存储的问题,因为最近在做小程序相关的内容.但是,在开发过程中,我们难免会遇到 token 存储. 代码缓存. 图片存储等等. 以及可 ...

  10. 蓝桥杯比赛javaB组练习《牌型种数》

    牌型种数 小明被劫持到X赌城,被迫与其他3人玩牌.一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张.这时,小明脑子里突然冒出一个问题:如果不考虑花色,只考虑点数,也不考虑自己得到的牌 ...