shiro
关于shiro:不依赖容器!
依赖
推荐插件:Ini(shiro.ini)
Authentication(认证):用户身份识别,通常被称为用户“登录”
Authorization(授权):访问控制。比如某个用户是否具有某个操作的使用权限。
Session Management(会话管理):特定于用户的会话管理,甚至在非web 或 EJB 应用程序。
Cryptography(加密):在对数据源使用加密算法加密的同时,保证易于使用。
还有其他的功能来支持和加强这些不同应用环境下安全领域的关注点。特别是对以下的功能支持:
Web支持:Shiro的Web支持API有助于保护Web应用程序。
缓存:缓存是Apache Shiro API中的第一级,以确保安全操作保持快速和高效。
并发性:Apache Shiro支持具有并发功能的多线程应用程序。
测试:存在测试支持,可帮助您编写单元测试和集成测试,并确保代码按预期得到保障。
“运行方式”:允许用户承担另一个用户的身份(如果允许)的功能,有时在管理方案中很有用。
“记住我”:记住用户在会话中的身份,所以用户只需要强制登录即可。
3个核心组件
Subject
当前用户,Subject 可以是一个人,但也可以是第三方服务、守护进程帐户、时钟守护任务或者其它–当前和软件交互的任何事件。
SecutiryManager
管理所有Subject,SecurityManager 是 Shiro 架构的核心,配合内部安全组件共同组成安全伞。
Realm
用于进行权限信息的验证,我们自己实现。Realm 本质上是一个特定的安全 DAO:它封装与数据源连接的细节,得到Shiro 所需的相关的数据。在配置 Shiro 的时候,你必须指定至少一个Realm 来实现认证(authentication)和/或授权(authorization)。
详细
身份验证
@Test public void testHelloworld() { //1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); //2、得到SecurityManager实例 并绑定给SecurityUtils org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); //3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证) Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123"); try { //4、登录,即身份验证 subject.login(token); } catch (AuthenticationException e) { //5、身份验证失败 } Assert.assertEquals(true, subject.isAuthenticated()); //断言用户已经登录 //6、退出 subject.logout(); }
-
首先通过
new IniSecurityManagerFactory
并指定一个ini
配置文件来创建一个SecurityManager
工厂; -
接着获取
SecurityManager
并绑定到SecurityUtils
,这是一个全局设置,设置一次即可; -
通过
SecurityUtils
得到Subject
,其会自动绑定到当前线程;如果是web 环境在请求结束时需要解除绑定;然后获取身份验证的Token
,如用户名 / 密码; -
调用
subject.login
方法进行登录,其会自动委托给SecurityManager.login
方法进行登录; -
如果身份验证失败请捕获
AuthenticationException
或其子类,常见的如:DisabledAccountException
(禁用的帐号)、LockedAccountException
(锁定的帐号)、UnknownAccountException
(错误的帐号)、ExcessiveAttemptsException
(登录失败次数过多)、IncorrectCredentialsException
(错误的凭证)、ExpiredCredentialsException
(过期的凭证)等,具体请查看其继承关系;对于页面的错误消息展示,最好使用如 “用户名 / 密码错误” 而不是 “用户名错误”/“密码错误”,防止一些恶意用户非法扫描帐号库; - 最后可以调用
subject.logout
退出,其会自动委托给SecurityManager.logout
方法退出。
权限
加密
自定义登陆认证
与springBoot整合
ShiroConfig配置类
登陆拦截
认证
执行login方法
login方法会跳到认证的这个方法来
授权:在认证的基础上
对资源进行权限管理,
对角色进行授予权限:需要在下面的return new SimpleAuthenticationInfo(user,user.getPwd,"")的第一个参数存值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!