Shiro是Apache旗下的开源框架,将软件系统的安全认证相关功能抽取出来,一个功能强大且易于使用的Java安全框架,它执行身份验证、授权、加密和会话管理
Subject——主体
外部应用与Subject进行交互,Subject记录了当前操作用户,将用户概念 理解为当前操作的主体,可能是一个通过浏览器请求的用户,也可能是一个运行的程序,Subject在shiro中是一个接口,接口中定义了很多认证授权的方法,外部通过Subject进行认证全收,而Subject是通过SecurityManager安全管理器进行认证授权的
SecurityManager——安全管理器
是一个接口,继承了这三个接口:Authenticator、Authorizer、SessionManager
对全部的Subject进行安全管理,是shiro的核心,负责对所有的Subject进行安全管理。理解SecurityManager可以完成Subject的认证、授权,实质上SecurityManager通过Authenticator进行认证 ,通过 Authorizer进行授权,通过SessionManager进行会话管理
Authenticator——认证器
对用户身份进行认证,Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自定义认证器
Authorizer——授权器
用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限
Realm——领域
相当于DataSource数据源,SecurityManager进行安全认证需要通过Realm获取用户权限数据:比如,用户身份数据在数据库,那么realm需要从数据库中获取用户信息
SessionManager——会话管理
依赖web容器的Session,也可应用在非web,也可以将分布式应用的会话集中在一起管理,所以可实现单点登录
SessionDAO——会话DAO
对session会话操作的一套接口,比如要将session存储到数据库,可以通过jdbc将会话存储到数据库
CacheManager——缓存管理
将用户权限数据存储到缓存,提高性能
Cryptography——密码管理
加密/解密组件,方便开发
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
</dependencies>
shiro.ini配置文件
[users]
wangtingting=123
yinjinhui=123456
public class TestAuthenticator {
public static void main(String[] args) {
//1.创建安全管理器对象
DefaultSecurityManager securityManager = new DefaultSecurityManager();
//2.给安全管理器设置Realm
securityManager.setRealm(new IniRealm("classpath:shiro.ini"));
//3.SecurityUtils给全局安全工具类设置安全管理器
SecurityUtils.setSecurityManager(securityManager);
//4.关键对象Subject主体
Subject subject = SecurityUtils.getSubject();
//5.创建令牌
UsernamePasswordToken token = new UsernamePasswordToken("wangtingting","123");
try{
System.out.println(subject.isAuthenticated());
subject.login(token);//用户认证
System.out.println(subject.isAuthenticated());
}catch (Exception e){
e.printStackTrace();
}
}
}
注意:当时直接创建的普通Maven项目,ini配置文件放在resource文件夹中,但是报错说找不到,idea不会自动将新文件或目录及其他资源更新到target目录中,必须在pom.xml中设置
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>