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,"")的第一个参数存值

 

posted @   happy_in  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示