安全框架shiro
一、简介
1、Apache的强大灵活开药框架
2、提供认证、授权、企业会话管理、安全加密/
3、可以脱离spring简单灵活粒度较粗,没有的功能可以自己去拓展
二、了解的知识点
- shiro整体架构,各组件的概念
- shiro认证,授权的过程
- shiro自定义realm和filter
- shiro session管理
- shiro 缓存管理
- shiro 集成spring
三、整体架构
Shiro包含
主体subject
提交至securityManager(包含认证中心Authenticator、授权中心Authorizer、SecurityManger缓存管理、SecurityManger会话管理、内置realm------与数据文件交互获取数据(JdbcRealm/IniReam/ActiveDirectory/CustomRealm))
四、实现步骤测试代码(以下演示JdbcRealm情况下认证授权的写法):
1、pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>hjy-shiro</artifactId>
<groupId>com.hjy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>shiro-test</artifactId>
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
</dependencies>
</project>
2、测试类(此处使用shiro内置JdbcRealm,自定义Realm可以在理解内置Realm之后自行编写)
/**
*@author hjy
*
*单元测试
*/
public class JdbcRealmTest {
//1、构建SecurityManager环境
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
/*此处盛放realm例如:jdbcRealm 这个是shiro内置JdbcRealm,使用前先new出对象并配置数据库信息DruidDataSource,设置realm数据源*/
DruidDataSource dataSource = new DruidDataSource();
{
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("root");
}
@Test
public void AuthenticatorTest() {
JdbcRealm jdbcRealm = new JdbcRealm();
jdbcRealm.setDataSource(dataSource);
jdbcRealm.setPermissionsLookupEnabled(true);
defaultSecurityManager.setRealm(jdbcRealm);
//2、主体提交请求认证
SecurityManagerUtils.setSecurityManager(defaultSecurityManager);
Subject subject = SecurityManagerUtil.getSubject();
//获取请求的令牌即用户名和密码组成的token
UsernamePasswordToken token = new UsernamePasswordToken();
// 用户登录验证
subject.login(token);
//判断是否认证成功
subject.isAuthenticated();
//用户登录登出(需要测试就去掉注释)
//subject.logout()
//用户权限检测(需要测试就去掉注释)
//subject.checkPermission("user:update");
//注意:连接数据库的环境下需要开启权限开关即加上这句代码://jdbcRealm.setPermissionsLookupEnabled(true);
// 打印一下认证结果
System.out.println("isAuthenticated" + subject.isAuthenticated());
}
}