只需要6个步骤,springboot集成shiro,并完成登录

Springboot 整合 Shiro 实现登录认证和权限校验 shiro介绍: Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 三个核心组件:Subject, SecurityManager 和 Realms. Subject:即“当前操作用户”。但是,在Shiro中,Sub... 阅读详情
小Hub领读:

导入jar包,配置yml参数,编写ShiroConfig定义DefaultWebSecurityManager,重写Realm,编写controller,编写页面,一气呵成。搞定,是个高手~


上面一篇文章中,我们已经知道了shiro的认证与授权过程,这也是shiro里面最核心常用的基础功能。现在我们把shiro集成到我们的项目中,开始搭建一个有认证和权限体系的项目,比如用户中心需要登录之后才能访问等!

1、极简入门,Shiro的认证与授权流程解析

集成Shiro

根据官方文档: https://shiro.apache.org/spring-boot.html

第一步:集成导入jar包:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-web-starter</artifactId>
    <version>1.4.2</version>
</dependency>

有些同学还在用 shiro-spring的jar包,但是集成的配置就相对多一点,所以可以直接使用starter包更加方便。

第二步:写好配置,官方给我们提供的属性参数,以及一些默认值,如果不符合我们的需求,可以自行改动哈。

从配置上就可以看出,shiro的注解功能,rememberMe等功能已近自动集成进来了。所以starter包使用起来还是非常简单的,只需要熟悉shiro的流程,从0开发不在话下哈。

  • application.yml

shiro:
  web:
    enabled: true
  loginUrl: /login
spring:
  freemarker:
    suffix: .ftl # 注意新版本后缀是 .ftlh
    template-loader-path: classpath:/templates/
    settings:
      classic_compatible: true #处理空值

上面的配置,我就改了一下登录的url,其他都是使用默认的,作为我们最简单的测试,相信你们。

第三步:配置shiro的securityManager和自定义realm。因为realm负责我们的认证与授权,所以是必须的,自定义的realm必须要交给securityManager管理,所以这两个类需要重写。然后还有一些资源的权限说明,所以一般需要定义ShiroFilterChainDefinition,所以有3个类我们常写的:

  • AuthorizingRealm

  • DefaultWebSecurityManager shiro的核心管理器

  • ShiroFilterChainDefinition 过滤器链配置

@Configuration
public class ShiroConfig {
    @Bean
    AccountRealm accountRealm() {
        return new AccountRealm();
    }
    @Bean
    public DefaultWebSecurityManager securityManager(AccountRealm accountRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(accountRealm);
        return securityManager;
    }
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
        // logged in users with the 'admin' role
        chainDefinition.addPathDefinition("/admin/**", "authc, roles[admin]");
        // logged in users with the 'document:read' permission
        chainDefinition.addPathDefinition("/docs/**", "authc, perms[document:read]");
        chainDefinition.addPathDefinition("/login", "anon");
        chainDefinition.addPathDefinition("/doLogin", "anon");
        // all other paths require a logged in user
        chainDefinition.addPathDefinition("/**", "authc");
        return chainDefinition;
    }
}

上面说到ShiroFilterChainDefinition是定义过滤器配置的,啥意思呢,我们来看看其中一句:

chainDefinition.addPathDefinition("/admin/**", "authc, roles[admin]");

这一句代码意思是说:访问 /admin/**开头的链接,都需要已经完成登录认证 authc、并且拥有 admin角色权限才能访问。

你可以看到key-value是 链接-过滤器的组合,过滤器可以同时多个。那么authc、role、perms、anon到底是哪来的呢?有啥特殊意义?是啥拦截器?

我们来看下这个说明文档:

可以看到,其实每个简写单词,都是一个过滤器的名称。比如authc代表这 FormAuthenticationFilter。每个过滤器具体是啥用的?我们看几个常用的吧:

  • authc 基于表单的拦截器,没有登录会跳到相应的登录页面登录

  • user 用户拦截器,用户已经身份验证 / 记住我登录的都可

  • anon 匿名拦截器,即不需要登录即可访问

  • roles 角色授权拦截器,验证用户是否拥有所有角色

  • perms 权限授权拦截器,验证用户是否拥有所有权限

第四步:ok,根据需求项目的资源制定项目过滤器链 ShiroFilterChainDefinition。我们再回到AccountRealm这个类。我们之前说过,认证授权的过程,我们是在Realm里面完成的。所以我们需要继承Realm,并实现两个方法。

但是这里需要注意,我们一般不直接继承 Realm,可以看看Realm接口:

  • org.apache.shiro.realm.Realm

public interface Realm {
    String getName();
    boolean supports(AuthenticationToken token);
    AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException;
}

而从上一篇文章中,我们分析的认证授权的源码过程时候,你会看到,认证和授权分别调用的realm是 AuthenticatingRealm和 AuthorizingRealm。说明源码里面已经经过了一些封装,所以我们就不能再直接继承 Realm,那么 AuthenticatingRealm和 AuthorizingRealm我们继承哪个呢?我们发现 AuthorizingRealm是继承 AuthenticatingRealm的,所以在重写realm的时候,我们只需要集成超类 AuthorizingRealm即可。

public abstract class AuthorizingRealm extends AuthenticatingRealm

所以,结合了授权与验证,还有缓存功能,我们自定义Realm的时候继承AuthorizingRealm即可。

  • com.markerhub.shiro.AccountRealm

public class AccountRealm extends AuthorizingRealm {
    @Autowired
    UserService userService;
    /**
     * 授权方法
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        AccountProfile principal = (AccountProfile) principalCollection.getPrimaryPrincipal();
        // 硬编码(赋予用户权限或角色)
        if(principal.getUsername().equals("MarkerHub")){
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            info.addRole("admin");
            return info;
        }
        return null;
    }
    /**
     * 认证方法
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        AccountProfile profile = userService.login(token.getUsername(), String.valueOf(token.getPassword()));
        // 把用户信息存到session中,方便前端展示
        SecurityUtils.getSubject().getSession().setAttribute("profile", profile);
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(profile, token.getCredentials(), getName());
        return info;
    }
}
  • com.markerhub.service.impl.UserServiceImpl

@Service
public class UserServiceImpl implements UserService {
    @Override
    public AccountProfile login(String username, String password) {
        //TODO 查库,然后匹配密码是否正确!
        if(!"MarkerHub".equals(username)) {
            // 抛出shiro异常,方便通知用户登录错误信息
            throw new UnknownAccountException("用户不存在");
        }
        if(!"111111".equals(password)) {
            throw new IncorrectCredentialsException("密码错误");
        }
        AccountProfile profile = new AccountProfile();
        profile.setId(1L);
        profile.setUsername("MarkerHub");
        profile.setSign("欢迎关注公众号MarkerHub哈");
        return profile;
    }
}

上面代码中,我login方法直接给出了账号MarkerHub,并赋予了角色admin。

第五步:ok,准备动作已经热身完毕,接下来我们去编写登录、退出接口,以及我们的界面:

  • com.markerhub.controller.IndexController

@Controller
public class IndexController {
    @Autowired
    HttpServletRequest req;
    @RequestMapping({"/", "/index"})
    public String index() {
        System.out.println("已登录,正在访问!!");
        return "index";
    }
    @GetMapping("/login")
    public String login() {
        return "login";
    }
    /**
     * 登录
     */
    @PostMapping("/doLogin")
    public String doLogin(String username, String password) {
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            SecurityUtils.getSubject().login(token);
        } catch (AuthenticationException e) {
            if (e instanceof UnknownAccountException) {
                req.setAttribute("errorMess", "用户不存在");
            } else if (e instanceof LockedAccountException) {
                req.setAttribute("errorMess", "用户被禁用");
            } else if (e instanceof IncorrectCredentialsException) {
                req.setAttribute("errorMess", "密码错误");
            } else {
                req.setAttribute("errorMess", "用户认证失败");
            }
            return "/login";
        }
        return "redirect:/";
    }
    /**
     * 退出登录
     */
    @GetMapping("/logout")
    public String logout() {
        SecurityUtils.getSubject().logout();
        return "redirect:/login";
    }
}

第六步:登录页面:

  • templates/login.ftl

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8"/>
    <title>MarkerHub 登录</title>
</head>
<body>
    <h1>用户登录</h1>
    <h3>欢迎关注公众号:MarkerHub</h3>
    <form method="post" action="/doLogin">
        username: <input name="username" type="text">
        password: <input name="password" type="password">
        <input type="submit" name="提交">
    </form>
    <div style="color: red;">${errorMess}</div>
</body>
</html>

登录成功页面:

  • templates/index.ftl

<h1>登录成功:${profile.username}</h1>
<h3>${profile.sign}</h3>
<div><a href="/logout">退出</a></div>

ok,代码我们已经编写完成,接下来,我们运行项目,然后访问首页,将自行跳转到登录页面,然后输入账号密码之后,我们可以看到完成登录!

登录界面: 

登录成功页面:

 

结束语

好了,今天做了一个极简的登录注册功能,介绍了一下shiro的基本整合步骤。流程还是挺简单的哈哈,不知道你看懂了没。

而在一些负载均衡的场景中,我们的会话信息是需要共享的,所以shiro一般会和redis整合在一起,你知道怎么整合吗?我们明天再聊哈,记得来哦,MarkerHub每天发文时间19点20分。

附:demo git源码地址:https://github.com/MarkerHub/JavaDemo/tree/master/整合示例/springboot-shiro-demo


(完)

MarkerHub文章索引:(点击阅读原文直达)

https://github.com/MarkerHub/JavaIndex
【推荐阅读】
eblog项目讲解视频上线啦,长达17个小时!!
SpringBoot整合redisson实现分布式锁
极简入门,Shiro的认证与授权流程解析
面试官: HashMap 为什么线程不安全?
Spring cache整合Redis,并给它一个过期时间!

好文!必须点赞

SpringBoot集成shiro认证,实现Shiro认证的登录操作 其实,扩展阅读:(看一下官方的解释为什么叫Subject而不叫User)翻译如下:我们最初是想把它叫做User的,这样很容易理解,但是大部分的应用程序都已经有了User类,为了不和这些原有的api发生冲突,我们最后决定不这么做。 阅读详情

相关推荐

springboot集成shiro禁止用户多点登录或重复登录剔除

近期用springboot整合shiro,进行了一个小项目。因为shiro只是一个Java安全框架,并不会做重复登录的拦截,当一个用户登录成功后(chrome登录),再用另外一个浏览器登录(IE登录)或者另外一台电脑进行登录,两个都会登录成功,两个不同的session。(题外话:同一个浏览器登录后,再打开一个标签页访问项目会直接进入登录后跳转的页面,两者是同一个session。) 预期目的:不允...

qq_35113996的博客 1万+

SpringBoot-集成Shiro(登录注册、权限控制、分布式Session、登录验证码)

SpringBoot-集成Shiro 任何涉及到用户的系统都需要权限控制,目前权限控制有2大框架Shiro与SpringScurity,Shiro是一个简单易上手的权限控制框架,在(Shiro框架入门到精通)[https://blog.youkuaiyun.com/weixin_44642403/article/details/117886286]中对Shiro框架的核心思想,以及认证授权流程进行了学习后,接下来本片博客就讲解如何把Shiro集成到SpringBoot中 业务分析 权限控制 首先我们要对权限控制的

JolyouLu的博客 1041

Springboot+shiro简单登录案例

Shiro的简单登录,如若没有足够积分下载可留下邮箱或者私信我,直接发到你们邮箱,文章链接:https://blog.youkuaiyun.com/sutongxuevip/article/details/80584607

SpringBoot整合Shiro并实现登录

SpringBoot整合Shiro并实现登录 和 退出登录

qq_40738239的博客 1189

SpringBoot整合Shiro后实现免密登录

SpringBoot整合Shiro后实现免密登录 1,说明一下步骤,需要在原来基础新增三个文件 2,新增CustomToken,重写UsernamePasswordToken免密登录调用方法和密码登录调用方法都在里面。 3,新增MyRetryLimitCredentialsMatcher,重写HashedCredentialsMatcher,主要是判定登录是否是免密登录。 4,新增LoginType,登录类型枚举 5,修改ShiroConfig文件,即Shiro配置文件,主要关注:57,63,65-90行 原文链接:https://blog.youkuaiyun.com/zlxls/article/details/105455375

STM32G474的HRTIM实战:用CubeMX配置互补PWM驱动全桥电路(附移相算法代码)

本文详细介绍了如何使用STM32G474的HRTIM高分辨率定时器,通过CubeMX配置互补PWM驱动全桥电路,并附移相算法代码。内容涵盖HRTIM硬件架构解析、CubeMX配置全流程、移相控制算法实现及调试技巧,为数字电源和电机控制领域提供实用解决方案。

weixin_27017211的博客 486

SpringBoot整合Shiro

1,前言 在以往的权限管理中,我们的权限管理通常是有以下几个步骤: 创建用户,分配权限。 用户登录,权限拦截器拦截请求,识别当前用户登录信息 从权限表中判断是否拥有权限 从以上步骤中可以提取到以下三个问题。 1.如何让Shiro拦截请求。     在web开发中,Shiro会提供一个拦截器来对请求进行拦截。 2.Shiro如何判断发起请求用户的身份?     在web开发中,会借助session来判断,如果禁用了

WDH_05的博客 506

手把手教你用SAM模型实现精准图像分割:从环境配置到实战应用

本文详细介绍了如何使用Meta推出的Segment Anything Model(SAM)实现精准图像分割,从环境配置到实战应用的全流程。特别针对电商场景中的商品分割需求,提供了硬件配置、模型下载、API使用及优化策略等实用指南,帮助开发者快速掌握这一强大的深度学习工具。

pepsi的博客 1067

SpringBoot + Shiro实现登陆认证(实现过程 + 源码解析 + 代码展示)

文章目录 1.概述 1.1 SpringBoot 1.2 Shiro 2.Shiro实现登录认证 导入pom依赖 配置核心方法 3.Shiro登录认证源码解析 代码地址 1.概述 1.1 SpringBoot 今天要做的是使用SpringBoot配合Shiro来实现登陆的认证,所以SpringBoot是必不可少的,相信大家能用到Shiro了,SpringBoot一定不差,那就不做过多赘述,我们主要来介绍Shiro。 1.2 Shiro Shiro是java的一个安全框架,

m0_67402914的博客 2080

实战解析:如何用Python逆向破解FastMoss的TikTok数据加密签名(附完整代码)

本文详细解析了如何用Python逆向破解FastMoss平台的TikTok数据加密签名机制,包括MD5加密算法和JS逆向分析。通过完整的Python代码示例,帮助开发者理解签名生成原理并实现自动化请求,提升数据获取能力。

weixin_30955617的博客 561

告别Keil4!手把手教你用Keil C51 V9.61编译51单片机代码(附最新激活方法)

本文详细介绍了Keil C51 V9.61在51单片机开发中的全栈升级指南,包括编译速度提升、调试器性能优化和现代开发支持等核心优势。通过智能安装方案、项目迁移实战和新特性深度应用,帮助开发者告别Keil4,大幅提升开发效率。附有最新激活方法和实用技巧,适用于嵌入式开发工程师。

weixin_26886855的博客 421

apache shiro jar包_只需要6个步骤,springboot集成shiro,并完成登录

小Hub领读:导入jar包,配置yml参数,编写ShiroConfig定义DefaultWebSecurityManager,重写Realm,编写controller,编写页面,一气呵成。搞定,是个高手~上面一篇文章中,我们已经知道了shiro的认证与授权过程,这也是shiro里面最核心常用的基础功能。现在我们把shiro集成到我们的项目中,开始搭建一个有认证和权限体系的项目,比如用户中...

weixin_39956558的博客 872

使用Power Apps实现SharePoint Online列表的下拉菜单的级联选择

在SharePoint列表中添加数据的时候,下拉菜单的级联选择一直是一个非常实用的功能,尤其是有很多数据的情况,级联选择可以根据上一层的选择,自动过滤下一层的选择,方便用户查找和选择准确的信息。一个最常用的情景是选择供应商的地区和国家,例如有三个列表,一个是供应商所在的大洲,一个是国家,一个是供应商。当用户选择州的时候,会自动列出属于这个州的国家。避免用户迷失在大量的数据中。 这里展示一下如何在...

shrenk的专栏 7812

shiro重写authc过滤器_只需要6个步骤,springboot集成shiro,并完成登录

小Hub领读:导入jar包,配置yml参数,编写ShiroConfig定义DefaultWebSecurityManager,重写Realm,编写controller,编写页面,一气呵成。搞定,是个高手~上面一篇文章中,我们已经知道了shiro的认证与授权过程,这也是shiro里面最核心常用的基础功能。现在我们把shiro集成到我们的项目中,开始搭建一个有认证和权限体系的项目,比如用户中...

weixin_32487647的博客 773

【STM32Cube_14】使用硬件I2C读写环境光强度传感器(BH1750)

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750)

Mculover666的博客(嵌入式) 7243

Android 15.0 app进程保活白名单功能实现

在15.0的系统rom产品开发中,在某些重要的app即使进入后台,产品需求要求也不想被系统杀掉进程,需要app长时间保活,就是app进程保活白名单功能的实现, 所以需要在系统杀进程的时候不杀掉白名单的进程,接下来就看怎么样来实现这些功能

安卓兼职framework和app工程师的博客 639

shiro 没有注销再登录_只需要6个步骤,springboot集成shiro,并完成登录

小Hub领读:导入jar包,配置yml参数,编写ShiroConfig定义DefaultWebSecurityManager,重写Realm,编写controller,编写页面,一气呵成。搞定,是个高手~上面一篇文章中,我们已经知道了shiro的认证与授权过程,这也是shiro里面最核心常用的基础功能。现在我们把shiro集成到我们的项目中,开始搭建一个有认证和权限体系的项目,比如用户中心需要登录...

weixin_39860166的博客 153

OpenHarmony WebView引擎:从Chromium魔改到分布式渲染的终极解析

ArkWeb框架提供了强大的Web应用开发能力,但同时也需要注意网络安全问题,尤其是跨域请求方面。

m0_67505153的博客 1198

SpringBoot集成Shiro安全框架

SpringBoot集成Shiro安全框架欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入...

qq_33922980的博客 5394

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

shiro讲解,以及SpringBoot微框架集成shiro完成登录拦截器功能。

一:shiro是什么? 1.shiro是什么 shiro是apache开源组织开发的一套开源的安全(权限)框架,跨语言跨平台,能在B/S架构上运行,也能在C/S架构上运行。 2.shiro与传统权限的区别 shiro是对传统的五表权限进行了封装,shiro把用户的认证(登录)和授权(用户赋权限)功能进行了封装处理,使权限操作更加简便,shiro需要传统五表权限来维护用户 角色 权限...

听风动的博客 1378

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

springboot集成shiro并利用jwt完成登录验证及权限验证

springboot集成shiro并利用jwt完成登录验证及权限验证 最近想在一个后台管理系统加上多角色多权限的功能,了解到了现有的安全框架后决定使用shiro,学习成本相对较低,而shiro默认使用session机制来实现用户的登录验证,而原先项目里面已使用jwt机制,并且前后端项目分离,所以对shiro加以改进。 数据库 首先在有用户表的前提下,需要有角色表和权限表,还有他们的关联表,在此简单的介绍下表结构,相信大家都会创建啦! user id,name role id,name user_ro

JEROCHAN的博客 1350

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SpringBoot集成shiro完成登录拦截器功能

一:shiro是什么? 1.shiro是什么 shiro是apache开源组织开发的一套开源的安全(权限)框架,跨语言跨平台,能在B/S架构上运行,也能在C/S架构上运行。 2.shiro与传统权限的区别 shiro是对传统的五表权限进行了封装,shiro把用户的认证(登录)和授权(用户赋权限)功能进行了封装处理,使权限操作更加简便,shiro需要传统五表权限来维护用户 角色 权限之间的关系。 3.shiro的原理(运行流程) securityManager 安全管理中心(shi...

鸠摩智 707

Springboot集成Shiro完成认证授权

&nbsp;&nbsp;&nbsp;&nbsp;Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 三个核心组件:Subject, SecurityManager 和 Realms. Subject: 即“当前操作用户”。但是,在Sh...

飞翔的宇宙 3441
上一篇: 老大批评我不要为了“分库分表”而“分库分表”
下一篇: 一行代码:你的纯文本秒变Markdown
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值