1 shrio简介
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
2 shrio架构
shrio架构图
shrio三个核心组件:Subject, SecurityManager 和 Realms.
Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。
Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
3 基于maven的简单测试
准备工作 pom.xml
<properties>
<shiro.version>1.4.0</shiro.version>
<junit.version>4.12</junit.version>
<slf4j.version>1.7.2</slf4j.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>${slf4j.version}</version>
</dependency>
</dependencies>
3.1 创建简单的shrio类
package simplecount01;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
public class FirstShiro {
//1 创建简单本地realm对象
SimpleAccountRealm realm=new SimpleAccountRealm();
public boolean validSimpleCount(){
// 2 设置本地realm的账号
realm.addAccount("test","1234");
//3 创建安全管理器核心对象
DefaultSecurityManager manager=new DefaultSecurityManager();
//4 在安全管理的核心对象中添加realm对象
manager.setRealm(realm);
// 5 通过工具类设置安全管理器
SecurityUtils.setSecurityManager(manager);
// 6 通过工具类得到subject对象
Subject subject = SecurityUtils.getSubject();
// 7 创建测试登录令牌对象
AuthenticationToken token=new UsernamePasswordToken("test","12345");
// 8 测试令牌登录
subject.login(token);
// 验证登录是否有效
return subject.isAuthenticated();
}
}
3.2 junit测试
package demo;
import org.junit.Assert;
import org.junit.Test;
import simplecount01.FirstShiro;
public class ShirtDemoTest {
FirstShiroone=new FirstShiro();
@Test
public void testSimpleCount(){
boolean b =one.validSimpleCount();
Assert.assertEquals("is ok!",true,b);
}
}
网友评论