SpringBoot:集成Shiro之INI认证篇

前言


上一篇SpringBoot:集成Shiro之简述篇中,我们简述了Shiro的基本概念以及Shiro的内部流程方式.下面我先简述一下本篇博客的基本内容以及使用场景.

本篇博客主要是讲 在SpringBoot 2.0 中集成Shiro,使用INI文件的形式完成登录认证(只认证非授权),使用场景只应对较少的用户的系统,而且账号密码为固定.

集成环境 : Mac   |   JDK 1.8   |   SpringBoot 2.0

❗️❗️❗️ INI文件优缺点必看,因为这是你架构程序的第一步!

INI文件优势 : 简单易懂 , 集成方便.
INI文件缺点 : 采用硬编码方式把认证授权信息写在INI文件中,可维护性差.


搭建Shiro基本环境


首先,我们先使用IDEA创建一个SpringBoot 2.0的web工程(关于JDK,这里我就不多说了).具体过程如下所示.

  • 选择SpringBoot模板,创建Spring Boot ,点击下一步.
  • 设定Spring Boot工程的基本配置信息.点击下一步.
  • 选择Spring Boot 的所含模块,因为这里我们只需要做演示功能,所以我们只选择Web模块,当然了,实际工程我们需要根据我们的需求来选择我们所需要的模块.点击下一步完成工程的创建.
  • 然后打开工程,等待一段时间,因为你使用了Web模块,所以Maven需要下载依赖的Jar包.同时,我们需要导入Shiro的依赖Jar包,因为Spring Boot已经对Shiro进行了支持.所以我们直接导入下面的一个依赖模块即可.
        <!-- shiro用户权限管理 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-starter</artifactId>
            <version>1.4.0</version>
        </dependency>


配置INI文件认证部分


当工程所有都配置完成之后,我们运行Shiro项目,发现并不能运行成功,报错信息如下所示.

***************************
APPLICATION FAILED TO START
***************************

Description:

No bean of type 'org.apache.shiro.realm.Realm' found.

Action:

Please create bean of type 'Realm' or add a shiro.ini in the root classpath (src/main/resources/shiro.ini) or in the META-INF folder (src/main/resources/META-INF/shiro.ini).

这是因为我们没有配置INI文件,所以我们根据提示在resources或者src/main/resources/META-INF文件夹下创建一个名为shiro.ini的文件.并且添加我们的用户验证信息.如下图所示.

然后,我们把下面的用户信息写入shiro.ini文件中.其中用户root密码为123456,用户admin的密码为admin.

[users]
root=123456
admin=admin


认证逻辑代码


下面的一张图是上一篇博客中讲述的,上一个模块的INI文件就是对应图中的Realm.现在我们所需要做的工作内容就是组装Subject主体,以及配置Secruity Manager.

为了保证代码的逻辑性,我们把验证逻辑抽到一个类中.然后我们开始根据INI文件创建SecurityManager并且绑定到SecurityUtils中,整体代码如下所示.

        //初始化SecurityManager对象
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

        //通过SecurityManager工厂对象,获取SecurityManager实例对象.
        SecurityManager securityManager =  factory.getInstance();

        // 把 securityManager 实例 绑定到 SecurityUtils
        SecurityUtils.setSecurityManager(securityManager);

紧接着,我们开始获取我们Subject主体,以及配置我们的用户信息token令牌,如下所示.

        //组建Subject主体.
        Subject subject = SecurityUtils.getSubject();

        //创建 token 令牌
        UsernamePasswordToken token = new UsernamePasswordToken(userName,passWord);

接下来我们就需要进行token令牌认证了,这里我需要说明一下,用户登录不成功有两种情况,一为用户不存在,二为用户密码不正确.所以我们要crash出对应的错误,然后通过不同的错误类型,进行数据的返回.这里我就统一用一种错误表示了.不做细分处理了.具体代码如下所示.

        //用户登录操作.
        try{
            subject.login(token);
            resultMap.put("code","200");
            resultMap.put("msg","用户登录成功");
        }catch (AuthenticationException e){
            //登录失败原因 1 用户不存在 2 用户密码不正确
            e.printStackTrace();
            resultMap.put("code","-1");
            resultMap.put("msg","用户登录失败");
        }

上面就完成了 构建Secruity Manager对象组建Subject主体通过Realm完成认证过程 三个步骤.接下来我们需要封装一下,所以MyShiro整体代码如下所示.

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;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;


@Component
public class MyShiro {


    public Map<String,Object> userLoginAction (String userName,String passWord){

        Map<String,Object> resultMap = new HashMap<>();

        //初始化SecurityManager对象
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

        //通过SecurityManager工厂对象,获取SecurityManager实例对象.
        SecurityManager securityManager =  factory.getInstance();

        // 把 securityManager 实例 绑定到 SecurityUtils
        SecurityUtils.setSecurityManager(securityManager);

        //组建Subject主体.
        Subject subject = SecurityUtils.getSubject();

        //创建 token 令牌
        UsernamePasswordToken token = new UsernamePasswordToken(userName,passWord);

        //用户登录操作.
        try{
            subject.login(token);
            resultMap.put("code","200");
            resultMap.put("msg","用户登录成功");
        }catch (AuthenticationException e){
            //登录失败原因 1 用户不存在 2 用户密码不正确
            resultMap.put("code","-1");
            resultMap.put("msg","用户登录失败");
        }
        return resultMap;

    }
}

添加 @Component 的原因是为了方便在下一模块使用自动化创建.


用户登录接口


上面我们已经完成了认证流程的封装,然后接下来,我们写一个简单的用户登录接口,验证我们的shiro是否能够正常的使用.

首先创建一个用户登录接口控制器UserLoginController,导入MyShiro.并且创建一个用户登录接口方法.代码过于简单,这里就不过叙述了 ,整体代码如下所示.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class UserLoginController {

    @Autowired
    MyShiro myShiro;

    @RequestMapping(value = "/login",method = RequestMethod.POST)
    public Map<String,Object> userLoginAction (@RequestParam(value = "userName") String userName,
                                               @RequestParam(value = "password") String password){

        Map<String,Object> resultMap = myShiro.userLoginAction(userName,password);

        return resultMap;

    }
    
}

接下来我们就运行我们的项目,然后查看我们用户是否能够登录成功.


用户登录成功
用户登录失败


结语


到这里,SpringBoot2.0集成Shiro之INI认证篇就完结了,使用INI文件做用户认证操作还是很简单的.下一篇,我们将看一下,如何使用INI文件进行授权操作,欢迎继续关注,如果有任何问题,欢迎一切和骚栋探讨~感谢大家.

Demo传送门


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容