Shiro框架概述
Shiro框架一个强大且易于使用的开源安全框架,用于处理身份认证、授权、会话管理和密码加密等安全相关的任务。
Shiro框架是Apache软件基金会的一个顶级项目,旨在简化Java应用程序的安全性开发。
Shiro提供了一个综合的解决方案,使得开发人员可以轻松地集成安全性功能到他们的应用程序中。
Shiro框架作用
Shiro框架的主要作用包括:
1.身份认证
Shiro允许应用程序验证用户的身份,确保用户是合法的并且已成功登录。
2.授权
Shiro提供了一种灵活的方式来定义和管理用户对资源,比如:URL、方法、文件等的访问权限,并且支持基于角色和权限的访问控制。
3.会话管理
Shiro可以管理用户的会话,包括跨页面的状态保持、会话过期和会话管理等功能。
4.密码加密
Shiro提供了密码加密和验证的支持,以确保存储在数据库中的用户密码是安全的。
Shiro框架组件
Shiro 架构包含三个主要的组件,如下图所示:
分别是:Subject(主体)、SecurityManager(安全管理器)、Realm(领域)。
1.Subject(主体)
Subject是Shiro的核心概念,表示应用程序的用户或系统的代表。
Subject负责执行身份认证、授权、会话管理等操作。
2.SecurityManager(安全管理器)
SecurityManager是Shiro的核心组件,管理Subject、Realm(用于验证和授权)、Session等。
SecurityManager的配置是Shiro的关键部分,它决定了整个安全体系的行为。
3.Realm(领域)
Realm是Shiro的数据源,用于获取用户信息、验证身份和授权。
Realm是与应用程序的数据源交互的桥梁,开发人员需要实现Realm接口以适应应用程序的数据源,例如:数据库、LDAP、自定义数据源等。
Shiro框架架构
Shiro框架架构,如下图所示:
主要会涉及到:
- Subject:表示当前操作的用户,可以是个人用户或者系统账户。Subject可以执行身份认证和授权操作。
- SecurityManager:是Shiro的核心组件,负责协调各种安全操作。它管理着Subject、Realm(用于验证和授权)、Session等。
- Realm:Realm是Shiro的数据源,用于获取用户信息、验证身份和授权。开发者需要实现Realm接口以适应应用程序的数据源。
- SessionManager:管理用户的会话,可以配置会话的过期时间、存储位置等。
- Cryptography:Shiro支持密码加密,以确保用户密码的安全存储。
- Authentication:负责身份认证,验证用户是否合法。
- Authorization:负责授权,确定用户是否有权访问某个资源或执行某个操作。
Shiro框架流程
Shiro的基本工作流程,如下图所示:
主要包含如下步骤:
1.身份认证(Authentication)
用户发起登录请求,提供用户名和密码,Shiro使用Subject执行身份认证,通过Realm验证用户的身份。
2.授权(Authorization)
当用户尝试访问受保护的资源或执行某个操作时,Shiro执行授权操作。
Shiro检查Subject的角色和权限,以确定用户是否有权访问资源。
如果授权成功,用户可以访问资源或执行操作,否则将拒绝访问。
3.会话管理(Session Management)
Shiro可以管理用户的会话,包括会话的创建、过期、销毁等。
4.密码加密(Cryptography)
Shiro支持密码加密和验证,开发人员可以选择使用Shiro提供的密码加密算法,也可以自定义密码加密逻辑。
Shiro框架使用
1.引入Shiro依赖
项目中引入Shiro的依赖,如下所示:
- org.apache.shiro
- shiro-core
- 1.8.1
2.配置Shiro
在项目中配置Shiro的各个组件,包括Realm、SecurityManager、SessionManager等。
如下所示:
- [main]
- securityManager = org.apache.shiro.web.mgt.DefaultWebSecurityManager
- [users]
- # 用户名和密码的定义
- username = password, role1, role2
- [roles]
- # 角色的定义
- role1 = permission1, permission2
- role2 = permission3
- [urls]
- # URL权限的配置
- /admin/** = authc, roles[admin]
- /user/** = authc, roles[user]
- /public/** = anon
3.编写Realm
Realm是Shiro的关键组件,需要实现一个或多个Realm来连接到应用程序的数据源,验证用户的身份和执行授权操作。
如下所示:
- public class MyRealm extends AuthorizingRealm {
- @Override
- protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
- // 执行授权操作,返回用户的角色和权限信息
- // 实现授权逻辑
- return authorizationInfo;
- }
- @Override
- protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
- // 执行身份认证操作,验证用户名和密码
- // 实现身份认证逻辑
- return authenticationInfo;
- }
- }
4.写应用程序代码
在您的应用程序代码中,您可以使用Shiro的Subject对象执行身份认证和授权操作。
- // 获取当前用户的Subject
- Subject currentUser = SecurityUtils.getSubject();
- // 身份认证
- if (!currentUser.isAuthenticated()) {
- UsernamePasswordToken token = new UsernamePasswordToken("username", "password");
- currentUser.login(token);
- }
- // 执行授权操作
- if (currentUser.hasRole("admin")) {
- // 用户拥有"admin"角色
- }
- if (currentUser.isPermitted("read")) {
- // 用户拥有"read"权限
- }
5.集成Shiro到应用程序
最后,需要将Shiro集成到您的应用程序中,以确保安全性功能生效。
这通常涉及到配置Web容器(如Apache Tomcat)或其他应用程序环境来使用Shiro的过滤器,以拦截请求并进行身份认证和授权检查。
Shiro框架总结
Shiro框架的架构涵盖了核心组件Subject、SecurityManager和Realm,以及身份认证、授权、会话管理和密码加密等核心功能。
Shiro框架可以适应各种数据源和应用场景,提供灵活的配置选项,使得开发人员能够轻松地集成安全性功能。