Apache Shiro
程序员文章站
2022-07-02 14:42:07
简介 Apache Shiro是一个灵活强大的开源安全框架。它能处理认证、授权、企业session管理以及加密。 Apache Shiro的初衷是简单上手易于理解。 Shiro旨在在各种应用环境(小到命令行应用,大到企业级应用)实现以上功能,无需第三方依赖,容器或应用服务。当然需要的话可以集成到这些 ......
简介
apache shiro是一个灵活强大的开源安全框架。它能处理认证、授权、企业session管理以及加密。
apache shiro的初衷是简单上手易于理解。
shiro旨在在各种应用环境(小到命令行应用,大到企业级应用)实现以上功能,无需第三方依赖,容器或应用服务。当然需要的话可以集成到这些环境。
apache shiro的功能:
核心功能:
- authentication(认证):解决登录问题
- authorization(授权):解决权限控制问题,就是某人有权限访问哪些内容
- session management (会话管理): 管理用户的会话
- cryptography(加密):使用加密算法确保数据安全
附加功能:
- web support api能很简单的保护web 应用
- caching能够使安全操作更高效
- 并发
- 测试框架,能实现安全方面的单元测试以及集成测试。
- “run as”:这里我理解为用户角色切换
- “remember me”:这里我理解为在浏览器登录过一次,下次就无需再登录了
术语
- authentication: 校验用户身份,确保应用被真实的身份访问
- authorization: 也叫权限控制,决定用户哪些内容可以访问,哪些内容不能访问,通常使用角色role以及权限permissions来实现。
- cipher: 加密解密算法。
- credential: 中文翻译为证书。它是用来校验用户身份的信息。credential通常是指用用户自己知道的私密信息,例如密码
- cryptography: 密码系统。保护信息的措施,将信息脱敏。主要有两种方式:cipher加密解密算法,以及不可逆转的散列算法。
- hash: 散列算法。通常用来对密码,指纹密码通过一些算法(md5、sha)转换,并且转换后的密码不可逆
- permissions: 许可。仅仅描述行为
- principal: 应用中用户信息的所有属性。
- realm: 特指安全的dao。realm将应用特定的数据转换成shiro能识别的数据。shiro提供一些连接安全数据源的realms,例如ldap,关系型数据库(jdbc),ini配置文件等等。你也可以注入你自己的realm。
- role: 角色
- session: 用来在一段时间内和系统进行交互和用户关联的状态数据。
- subject: 主体,代表了当前 “用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 subject
栗子
开启shiro
首先需要知道的是,shiro中所有的东西都是和securitymanage关联的。熟悉java security的人都知道,他是shiro的securitymanager概念,而不是java的 java.lang.securitymanager 。
所以开启shiro的第一步是配置好securitymanager实例。
配置:
# ============================================================================= # tutorial ini configuration # # usernames/passwords are based on the classic mel *s' film "spaceballs" :) # ============================================================================= # ----------------------------------------------------------------------------- # users and their (optional) assigned roles # username = password, role1, role2, ..., rolen # ----------------------------------------------------------------------------- [users] root = secret, admin guest = guest, guest presidentskroob = 12345, president darkhelmet = ludicrousspeed, darklord, schwartz lonestarr = vespa, goodguy, schwartz # ----------------------------------------------------------------------------- # roles with assigned permissions # rolename = perm1, perm2, ..., permn # ----------------------------------------------------------------------------- [roles] admin = * schwartz = lightsaber:* goodguy = winnebago:drive:eagle5
创建一个securitymanager实例
public static void main(string[] args) { log.info("my first apache shiro application"); inisecuritymanagerfactory factory = new inisecuritymanagerfactory("classpath:shiro.ini"); securitymanager securitymanager = factory.getinstance(); securityutils.setsecuritymanager(securitymanager); system.exit(0); }
仅三行代码,shiro就在应用中添加了。接下来对这三行代码进行解释:
- 使用shiro的inisecuritymanagerfactory获取shiro.ini配置文件,该文件在classpath(resource)的根路径下。
- factory.getinstance()方法会解析ini文件并且返回对应的securitymanager实例。
- 在这个简单的例子中,我们将securitymanager设置为内存中的静态单例。在复杂的场景,可能需要将securitymanager放在应用特定的内存中,如web应用的servletcontext或者spring 容器的实例
使用shiro
谈到应用的安全问题,我们很自然的会想到当前用户。shiro api使用subject来表示当前用户的概念。
在安全的世界里,’subject’主体可以表示一个人,也可以表示第三方进程,定时任务等当前与软件交互的任何事物。
session
session类似httpsessions,唯一不同的是它不需要http环境。
上面提到的subject表示当前用户,当前用户是谁,现在还是匿名用户,直到它们至少登录一次。
if(!subject.isauthenticated()) { usernamepasswordtoken usernamepasswordtoken = new usernamepasswordtoken("lonestarr", "vespa"); usernamepasswordtoken.setrememberme(true); subject.login(usernamepasswordtoken); }
如果登录失败了怎么办?你可以catch登录失败异常。
try { subject.login(usernamepasswordtoken); } catch (unknownaccountexception uae) { throw new unknownaccountexception("不存在该用户"); } catch (incorrectcredentialsexception ice) { throw new incorrectcredentialsexception("用户名或密码错误"); }
推荐阅读
-
Apache Shiro 使用手册(五) Shiro 配置说明
-
apache中使用mod_gnutls模块实现多个SSL站点配置(多个HTTPS协议的虚拟主机)
-
apache中使用mod_log_slow分析响应慢的请求
-
apache禁止搜索引擎收录、网络爬虫采集的配置方法
-
win2003下PHP使用preg_match_all导致apache崩溃问题的解决方法
-
Apache、Nginx下Font Awesome在 Firefox 中不显示问题解决方法
-
由Apache 500错误引出的临时文件问题分析解决
-
阿里云linux服务器下安装Apache的简单方法
-
在varnish、squid、apache、nginx中选出一个更好的缓存服务器
-
Apache NameVirtualHost *:80 has no VirtualHosts问题解决办法