Shiro框架2

基本使用

1.环境搭建

引入pom依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.9.0</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

说明:Shiro获取权限相关信息可以通过数据库获取,也可以通过ini配置文件获取

这里演示从ini文件中获取。

  • 在resources目录下创建ini文件

注:这里等号左边的(如:zhangsan),就代表用户名。等号右边的(123456)就代表对应的密码。

2.登录认证

2.1登录认证概念

① 身份验证:就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。

② 在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro,从而应用能验证用户身份;

③ principals:身份,即主体的标识属性,可以是任何属性,如用户名、邮箱等,唯一即可。一个主体可以有多个principals,但只有一个主身份( Primary principals ),一般是用户名/邮箱/手机号。

④ credentials:证明/凭证,即只有主体知道的安全值,如密码/数字证书等。

最常见的principals和credentials组合就是用户名/密码

2.2登录认证基本流程

① 收集用户身份/凭证,即如用户名/密码

② 调用 Subject.login 进行登录,如果失败将得到相应 的 AuthenticationException异常,根据异常提示用户 错误信息;否则登录成功

③ 创建自定义的 Realm 类,继承 org.apache.shiro.realm.AuthenticatingRealm类,实现 doGetAuthenticationInfo() 方法

2.3demo样例

四步走:

  1. 初始化获取SecurityManager
  2. 获取subject对象
  3. 创建token对象,web应用用户名密码从页面传递
  4. 完成登录
java 复制代码
    public static void main(String[] args) {
        //1.创建安全管理器对象
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        //2.给安全管理器设置realm
        securityManager.setRealm(new IniRealm("classpath:shiro.ini"));
        //3.SecurityUtils给全局安全工具类设置安全管理器
        SecurityUtils.setSecurityManager(securityManager);
        //4.关键对象subject主体
        Subject subject = SecurityUtils.getSubject();
        //5.创建令牌
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123456");
        try {
            System.out.println("认证状态"+subject.isAuthenticated());//false
            //用户认证
            subject.login(token);
            System.out.println("登陆成功");
            System.out.println("认证状态"+subject.isAuthenticated());
        }catch (UnknownAccountException e){
            e.printStackTrace();
            System.out.println("认证失败,用户名不存在");
        }catch (IncorrectCredentialsException e){
            e.printStackTrace();
            System.out.println("认证失败,密码错误");
        }
    }

常见的异常类型

DisabledAccountException(帐号被禁用)

LockedAccountException(帐号被锁定)

ExcessiveAttemptsException(登录失败次数过多)

ExpiredCredentialsException(凭证过期)等

相关推荐
newxtc25 分钟前
【支付行业-支付系统架构及总结】
安全·支付宝·第三方支付·风控系统·财付通
newxtc1 小时前
【旷视科技-注册/登录安全分析报告】
人工智能·科技·安全·ddddocr
成都古河云1 小时前
智慧场馆:安全、节能与智能化管理的未来
大数据·运维·人工智能·安全·智慧城市
Gworg1 小时前
您与此网站之间建立的连接不安全解决方法
安全
ac-er88882 小时前
MySQL如何实现PHP输入安全
mysql·安全·php
jjyangyou5 小时前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
AltmanChan6 小时前
大语言模型安全威胁
人工智能·安全·语言模型
马船长6 小时前
红帆OA iorepsavexml.aspx文件上传漏洞
安全
hikktn13 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
23zhgjx-NanKon15 小时前
华为eNSP:QinQ
网络·安全·华为