Shiro 基本使用

本文介绍了Shiro的基本使用,包括添加Maven依赖,通过INI文件配置用户信息,详细阐述了登录认证的概念和流程,以及角色和授权的管理。同时,文章还讲解了Shiro中的加密机制,特别是MD5加密的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、添加依赖

二、INI 文件

三、登录认证

1.概念

2.登录认证基本流程

四、角色、授权

1.授权概念

2.授权方式

3.实现方式

(1)获取角色信息

(2)判断权限信息信息

五、Shiro 加密

使用Shiro进行密码加密


前言

这篇文章主要介绍了Shiro基本使用,账号密码信息都使用通过 ini 配置文件获取,了解登录认证流程和角色、授权的方式,Shiro 内嵌很多常用的加密算法,比如 MD5 加密。Shiro 可以很简单的使用信息加密等。

一、添加依赖

我们先搭一个Maven项目,然后添加依赖

<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>

二、INI 文件

Shiro 获取权限相关信息可以通过数据库获取,也可以通过 ini 配置文件获取
ini 配置文件可以在项目的resources目录下创建
shiro.ini文件

[users]
admin=123456
query=147852
people=963

三、登录认证

1.概念

  • 身份验证:就相当于标明特定的身份ID,例如:账号密码,邮箱,姓名之内的。
  • 在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro,从
    而应用能验证用户身份。
  • principals:身份,一般是用户名、邮箱。credentials:证明/凭证 ,一般是密码、密钥等。
  • 最常见的principals和credentials组合就是用户名/密码。

2.登录认证基本流程

  •  获取用户的身份信息,即用户名和密码。
  • 调用 Subject.login 进行登录,如果失败将得到相应 的 AuthenticationException
    异常,根据异常提示用户 错误信息;否则登录成功。
  • 创建自定义的 Realm 类,继承 AuthenticatingRealm类,实现 doGetAuthenticationInfo() 方法。
    public static void main(String[] args) {
            //1 初始化获取 SecurityManager
            IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro.ini");
            SecurityManager instance = factory.getInstance();
            SecurityUtils.setSecurityManager(instance);
            //2 获取 Subject 对象
            Subject subject=SecurityUtils.getSubject();
            //3 创建 token 对象,web 应用用户名密码从页面传递
            AuthenticationToken token=new UsernamePasswordToken("admin","123456");
            //4 完成登录
            try {
                subject.login(token);
                System.out.println("登录成功");
            }
            catch (UnknownAccountException e) {
                e.printStackTrace();
                System.out.println("用户不存在");
            }
            catch (IncorrectCredentialsException e) {
                e.printStackTrace();
                System.out.println("密码错误");
            }
            catch (AuthenticationException ae) {
                
            }
        }

四、角色、授权

1.授权概念

  • 授权,也叫访问控制,即在应用中控制谁访问哪些资源(如访问页面/编辑数据/页面操作 等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。
  • 主体(Subject):访问应用的用户,在 Shiro 中使用 Subject 代表该用户。用户只
    有授权 后才允许访问相应的资源。
  • 资源(Resource):在应用中用户可以访问的 URL,用户只要授权后才能访问。
  • 权限(Permission):即权限表示在应用中用户能不能访问某个资源。
  • 角色(Role):权限的集合,一般情况下会赋予用户角色而不是权限

2.授权方式

可以使用代码if/else判断

if(subject.hasRole("admin"))
{
    //有权限
}else{
    //没有权限
}

注解式:通过在执行的Java方法上放置相应的注解完成,没有权限将抛出相应的异常

@RequiresRoles("admin")

3.实现方式

(1)获取角色信息

1、给shiro.ini增加角色配置

[users]
admin=123456,role1234
query=147852

2、使用hasRole()判断用户是否有指定角色

 subject.login(token);
 System.out.println("登录成功");
 //判断角色
 boolean role = subject.hasRole("role1234");
 System.out.println(role);

(2)判断权限信息信息

1、给shiro.ini增加权限配置
[roles]
role1234=user:insert,user:select

2、判断用户是否有指定权限  

boolean isPermitted = subject.isPermitted("user:insert");
System.out.println("是否拥有此权限:"+isPermitted);
//用 checkPermission 方法,但没有返回值,没权限抛 AuthenticationException
subject.checkPermission("user:select");

五、Shiro 加密

在有部分开发中,一些敏感信息需要进行加密,比如说用户的密码。Shiro 内嵌很多 常用的加密算法,比如 MD5 加密。Shiro 可以很简单的使用信息加密

使用Shiro进行密码加密

public static void main(String[] args) {
        //密码明文
        String password = "123456";
        //使用md5加密
        Md5Hash md5Hash = new Md5Hash(password);
        System.out.println("md5加密 = " + md5Hash.toHex());
        //带盐的md5加密,盐就是在密码明文后拼接新字符串,然后再进行加密
        Md5Hash md5Hash2 = new Md5Hash(password,"admin");
        System.out.println("带盐的md5加密 = " + md5Hash2.toHex());
        //为了保证安全,避免被破解还可以多次迭代加密,保证数据安全
        Md5Hash md5Hash3 = new Md5Hash(password,"admin",3);
        System.out.println("md5带盐的3次加密 = " + md5Hash3.toHex());
        //使用父类进行加密
        SimpleHash simpleHash = new SimpleHash("MD5",password,"admin",3);
        System.out.println("父类带盐的3次加密 = " + simpleHash.toHex());

    }

通过学习和实践记录笔记,继续加油冲冲冲!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值