Shiro框架入门

简介: Shiro框架入门

简介

Shiro 是当下常见的安全框架,主要用于用户验证和授权操作。

如同 spring security 一样都是是一个权限安全框架,但是与Spring Security相比,在于他使用了和比较简洁易懂的认证和授权方式。

Shiro的核心组件:

  • Subject :当前用户的操作
  • SecurityManager:用于管理所有的Subject
  • Realms:用于进行权限信息的验证

Subject:即当前用户,在权限管理的应用程序里往往需要知道谁能够操作什么,谁拥有操作该程序的权利,shiro中则需要通过Subject来提供基础的当前用户信息,Subject 不仅仅代表某个用户,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。


SecurityManager:即所有Subject的管理者,这是Shiro框架的核心组件,可以把他看做是一个Shiro框架的全局管理组件,用于调度各种Shiro框架的服务。


Realms:Realms则是用户的信息认证器和用户的权限人证器,我们需要自己来实现Realms来自定义的管理我们自己系统内部的权限规则。

实现方式

在shiro的用户权限认证过程中其通过两个方法来实现:

1、Authentication:是验证用户身份的过程。

2、Authorization:是授权访问控制,用于对用户进行的操作进行人证授权,证明该用户是否允许进行当前操作,如访问某个链接,某个资源文件等。

创建Shiro项目

使用IDEA创建maven项目,在pom.xml中添加依赖:

  <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-core</artifactId>
      <version>1.4.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.6.1</version>
    </dependency>

使用shiro

Shiro提供了一个通用的方案通过 INI 进行配置 ,当然也可以通过XML,YMAL,JSON等进行配置。

在resource目录下面,创建一个shiro.ini的文件。内容如下:

#定义用户
[users]
#用户名 zhang3  密码是 12345, 角色是 admin
zhang3 = 12345,admin
#用户名 li4  密码是 abcde, 角色是 产品经理
li4 = abcde,productManager
#定义角色
[roles]
#管理员什么都能做
admin = *
#产品经理只能做产品管理
productManager = addProduct,deleteProduct,editProduct,updateProduct,listProduct
#订单经理只能做产品管理
orderManager = addOrder,deleteOrder,editOrder,updateOrder,listOrder
  • 创建User对象
package cn.jp.shiro.pojo;
/**
 * @author JP
 * @title: User
 * @projectName studyShiro
 * @description:准备用户类,存储账户和密码
 *
 * @date 2019/2/22 00229:18
 */
public class User {
    private String name;
    private String password;
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}
  • 创建一个TestShiro测试类
package cn.jp.shiro.test;
import java.util.ArrayList;
import java.util.List;
import cn.jp.shiro.pojo.User;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
/**
 * @author JP
 * @title: TestShiro
 * @projectName studyShiro
 * @description:测试shiro安全框架
 * @date 2019/2/22 00229:22
 */
public class TestShiro {
    public static void main(String[] args) {
        User zhang3 = new User();
        zhang3.setName("zhang3");
        zhang3.setPassword("12345");
        User li4 = new User();
        li4.setName("li4");
        li4.setPassword("abcde");
        User wang5 = new User();
        wang5.setName("wang5");
        wang5.setPassword("wrongpassword");
        List<User> users = new ArrayList<>();
        users.add(zhang3);
        users.add(li4);
        users.add(wang5);
        //角色们
        String roleAdmin = "admin";
        String roleProductManager = "productManager";
        String orderManager = "orderManager";
        List<String> roles = new ArrayList<>();
        roles.add(roleAdmin);
        roles.add(roleProductManager);
        roles.add(orderManager);
        //权限们
        String permitAddProduct = "addProduct";
        String permitAddOrder = "addOrder";
        String permitDeleteProduct = "deleteProduct";
        List<String> permits = new ArrayList<>();
        permits.add(permitAddProduct);
        permits.add(permitAddOrder);
        permits.add(permitDeleteProduct);
        //登录每个用户
        for (User user : users) {
            if (login(user)) {
                System.out.printf("%s \t成功登陆,用的密码是 %s\t %n", user.getName(), user.getPassword());
            } else {
                System.out.printf("%s \t成功失败,用的密码是 %s\t %n", user.getName(), user.getPassword());
            }
        }
        System.out.println("------- 分割线------");
        //判断能够登录的用户是否拥有某个角色
        for (User user : users) {
            for (String role : roles) {
                if (login(user)) {
                    if (TestShiro.hasRole(user, role)) {
                        System.out.printf("%s\t 拥有角色: %s\t%n", user.getName(), role);
                    } else {
                        System.out.printf("%s\t 不拥有角色: %s\t%n", user.getName(), role);
                    }
                }
            }
        }
        System.out.println("------- 分割线------");
       for(User user:users){
           for(String permit:permits){
               if(login(user)){
                   if(isPermitted(user,permit)){
                       System.out.printf("%s\t 拥有权限: %s\t%n",user.getName(),permit);
                   }else{
                       System.out.printf("%s\t 不拥有权限: %s\t%n",user.getName(),permit);
                   }
               }
           }
       }
    }
    /**
     * @return
     * @Author jp
     * @Description //TODO 用户拥有角色
     * @Date 9:37 2019/2/22 0022
     * @Param
     **/
    public static boolean hasRole(User user, String role) {
        Subject subject = getSubject(user);
        return subject.hasRole(role);
    }
    /**
     * @return
     * @Author jp
     * @Description //TODO 判断是否拥有权限
     * @Date 9:39 2019/2/22 0022
     * @Param
     **/
    public static boolean isPermitted(User user, String permit) {
        Subject subject = getSubject(user);
        return subject.isPermitted(permit);
    }
    /**
     * @Author jp
     * @Description //TODO
     * @Date 10:21 2019/2/22 0022
     * @Param
     * @return
     **/
    private static Subject getSubject(User user) {
        //加载配置文件,获取工厂
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        //获取安全管理实例
        SecurityManager sm = factory.getInstance();
        //将安全管理sui者放入全局对象
        SecurityUtils.setSecurityManager(sm);
        //全局对象通过安全管理者生成Subject对象
        Subject subject = SecurityUtils.getSubject();
        return subject;
    }
    /**
     * @return
     * @Author jp
     * @Description //TODO 判断用户是否登录
     * @Date 9:35 2019/2/22 0022
     * @Param
     **/
    private static boolean login(User user) {
        Subject subject = getSubject(user);
        //如果已经登录,退出
        if (subject.isAuthenticated())
            subject.logout();
        //封装用户数据
        UsernamePasswordToken token = new UsernamePasswordToken(user.getName(), user.getPassword());
        try {
            //将用户数据token,最终传递到Realm中进行对比
            subject.login(token);
        } catch (AuthenticationException e) {
            //验证错误
            return false;
        }
        return subject.isAuthenticated();
    }
}

实现效果

20200401134307494.png

当输入的账户与shiro.ini配置文件里账户匹配时,登录成功,然后验证角色所拥有的权限~




相关文章
|
存储 安全 Java
Shiro 框架基本使用
Apache Shiro是一个强大且易用的Java安全框架,它执行身份验证、授权、密码和会话管理。Shiro框架通过其三个核心组件:Subject、SecurityManager和Realms,提供了一个通用的安全认证框架。
63 0
|
存储 算法 程序员
【Shiro】第三章 Shiro入门(二)
【Shiro】第三章 Shiro入门(二)
81 1
|
安全 数据安全/隐私保护
【Shiro】第三章 Shiro入门(一)
【Shiro】第三章 Shiro入门
76 1
|
存储 算法 数据安全/隐私保护
【Shiro】第三章 Shiro入门(三)
【Shiro】第三章 Shiro入门(三)
78 1
|
缓存 数据库 数据安全/隐私保护
【Shiro】第三章 Shiro入门(四)
【Shiro】第三章 Shiro入门(四)
81 0
|
存储 缓存 安全
Shiro学习之Shiro简介
Shiro学习之Shiro简介
105 0
|
Java 网络安全 数据库
shiro实战教程(二)
shiro实战教程(二)
232 1
shiro实战教程(二)
|
缓存 安全 前端开发
shiro架构的入门介绍
shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。 spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单。 shiro不依赖于spring,shiro不仅可以实现 web应用的权限管理,还可以实现c/s系统, 分布式系统权限管理,shiro属于轻量框架,越来越多企业项目开始使用shiro。
shiro架构的入门介绍
|
存储 数据采集 缓存
Shiro简介
.什么是Shiro - .ApacheShiro 是一个Java的安全(权限)框架。 - .Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。 - .Shiro可以完成,认证,授权,加密,会话管理,Web集成,缓存等。
Shiro简介
|
缓存 安全 Java
Shiro框架学习
Shiro框架学习
183 0
Shiro框架学习