Apache Shiro 是 Java 的一个安全框架。
Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等
Realm 类似与数据源
一、org.apache.shiro.realm.text.IniRealm 使用最简单配置
二、jdbcRealm 与数据库进行交互
Subject:主体,代表了当前 “用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject,如网络爬虫,机器人等;即一个抽象概念;所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager;可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者;
SecurityManager:安全管理器;即所有与安全有关的操作都会与 SecurityManager 交互;且它管理着所有 Subject;可以看出它是 Shiro 的核心,它负责与后边介绍的其他组件进行交互,如果学习过 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;
使用 IniRealm数据源 例子:
依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.1</version>
</dependency>
</dependencies>
shiro.ini文件
[users]
wang=123,admin,guest
liu=123,guest
# 用户对应角色 角色对应权限
[roles]
admin=select,save,update,delete
guest=select,update
测试文件
package com.qust;
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.subject.Subject;
import org.junit.Test;
public class shiroTest {
@Test
public void shiro(){
//获取securityManagerFactory的工厂 使用IniSecurityManagerFactory; 如果ini文件名为shiro.ini 那么是不用写配置文件名
IniSecurityManagerFactory securityManagerFactory = new IniSecurityManagerFactory("classpath:shiro.ini");
//通过创建的工厂 获取 securityManager对象 (securityManager 类似于 springMVC上的 dispaterServlet)
SecurityManager securityManager = securityManagerFactory.getInstance();
//SecurityUtils工具类进行绑定 SecurityManager 这是一个全局设置,设置一次即可
SecurityUtils.setSecurityManager(securityManager);
//通过 SecurityUtils 得到 Subject,其会自动绑定到当前线程
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("wang","123");
try {
//调用 subject.login 方法进行登录,其会自动委托给 SecurityManager.login 方法进行登录
subject.login(usernamePasswordToken);
} catch (UnknownAccountException e) { //未知账户异常
e.printStackTrace();
} catch (LockedAccountException e){ //锁定账户
e.printStackTrace();
} catch (DisabledAccountException e){ //账户不可用异常
e.printStackTrace();
} catch (ExcessiveAttemptsException e){ //登录次数过多异常
e.printStackTrace();
} catch (IncorrectCredentialsException e){ //错误的凭证
e.printStackTrace();
} catch (ExpiredCredentialsException e){ //过期的凭证
e.printStackTrace();
} catch (AuthenticationException e){ //上面异常的父异常
e.printStackTrace();
}
System.out.println("成功!");
//判断该用户是否有该角色 返回boolean
System.out.println(subject.hasRole("admin"));
//判断该用户是否拥有该权限 返回boolean
System.out.println(subject.isPermitted("select"));
}
}
只有shiro.ini文件配置不同 另外再加三个依赖
依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
JDBCRealm例子;
dataSource=org.springframework.jdbc.datasource.DriverManagerDataSource
dataSource.url=jdbc:mysql://localhost:3306/work1
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.username=root
dataSource.password=admin
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource=$dataSource
#自定义查询语句 详见jdbcRealm类
jdbcRealm.authenticationQuery=select password from user where username = ?
securityManager.realms=$jdbcRealm
变量名=全类名 相当于该类的实列
变量名.属性=setter方法赋值
$变量名 引用 对象实列