Apache Shiro 使用手册(一) Shiro架构介绍
Shiro简介
Shiro是一个易于使用的Java安全框架,提供了认证、授权、加密和会话管理等功能。
Shiro经常用于Web应用程序和RESTful服务,不过也可以用于非Web环境。Shiro与其他Java安全框架(如Spring Security)相比,其API更加简单易用,而且使用过程中无需强制使用Spring框架。
Shiro架构
整个Shiro的架构可以分为三层:
-
Subject:主体,即当前操作用户。在Shiro中,Subject可以是一个人,也可以是一个第三方服务、守护进程账户或者其他任何可以代表“用户”这个概念的东西。
-
SecurityManager:安全管理器,所有涉及到安全认证、授权、加密和会话管理的操作都必须经过SecurityManager处理。SecurityManager是Shiro核心组件之一。
-
Realms:Realm是Shiro与安全数据(如用户账户、角色和权限)之间的桥梁。在Shiro中可以配置一个或多个Realm,来支持不同类型的安全数据存储方式(如数据库、LDAP等)。
以下是Shiro的整体架构示意图:
+-------+ Subject +--------+
| | +------>----| |
| | | | |
| | | | |
| | +<-----<----| |
| | Principal | |
| | | |
| App | | Shiro |
| | | |
| | | |
| | | |
| | +<-----<----| |
| | | | |
| | | | |
| | +------>----| |
+-------+ Session +--------+
示例1:认证一个用户
首先,Shiro提供了一个UsernamePasswordToken
类来封装用户的身份信息(如账户名和密码),在下面的示例中我们将使用该类。
//创建一个UsernamePasswordToken实例,来封装用户的身份信息
UsernamePasswordToken token = new UsernamePasswordToken("user", "password");
// 获取SecurityManager实例
DefaultSecurityManager securityManager = new DefaultSecurityManager();
//把Realm配置到SecurityManager中
securityManager.setRealm(new MyRealm());
//将SecurityManager配置到Shiro中
SecurityUtils.setSecurityManager(securityManager);
//获取当前用户Subject
Subject currentUser = SecurityUtils.getSubject();
//通过currentUser.login()方法进行用户认证
//如果认证失败,将会抛出AuthenticationException异常
currentUser.login(token);
在上面的示例中,我们使用了一个名为"MyRealm"的Realm(需要自己实现),其实现了Shiro的Realm
接口,并提供了用于查询用户数据的方法。此处省略了MyRealm类的具体实现细节。
示例2:授权
接下来,我们将介绍如何在Shiro中进行授权操作。下面的代码演示了如何检查当前用户是否具有某个权限:
// 获取当前用户Subject
Subject currentUser = SecurityUtils.getSubject();
//检查当前用户是否具有"print"权限
if (currentUser.isPermitted("print")) {
System.out.println("用户具有该权限!");
} else {
System.out.println("用户不具有该权限!");
}
在实际应用中,可以将权限列表和角色信息存储在数据库中,然后通过Realm从数据库中查询出来,以便进行授权操作。
总结
本文简要介绍了Shiro的三层架构、Subject、SecurityManager和Realm的概念,并给出了两个示例来说明如何在Shiro中进行认证和授权操作。在实际应用中,可以根据实际需要选择不同的Realm实现,以便从不同的数据源中查询用户认证和授权相关信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Apache Shiro 使用手册(一) Shiro架构介绍 - Python技术站