springboot整合shiro框架做用户认证与授权

springboot整合shiro框架的流程主要分为:

  1. 导入shiro依赖

    <dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.7.1</version>
    </dependency>
  2. 编写shiro配置类,其中shiroconfig类主要用于配置过滤器,管理器和自定义的认证鉴权类。userRealm类是自定义的认证鉴权类继承自AuthorizingRealm类。
    package com.codeyoung.shirodemo.config;/**
    * @author: ouououou
    * @date: 2021/11/3 14:17
    * @description:
    */ import org.apache.shiro.realm.Realm;
    import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
    import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration; import java.util.LinkedHashMap;
    import java.util.Map; /**
    * @ClassName ShiroConfig
    * @Description TODO
    * @Author ouououou
    * @Date 2021/11/3 14:17
    * @Version 1.0
    **/
    @Configuration
    public class ShiroConfig {
    //ShiroFilterFactoryBean DefaultWebSecurityManager Realm
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Autowired DefaultWebSecurityManager defaultWebSecurityManager){
    ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
    //设置管理器
    shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
    //设置拦截器
    Map<String, String> map=new LinkedHashMap<>();
    //设置需要拦截的请求和内置的过滤器 anon:无需认证 authc:必须认证了才能通过 user:必须拥有记住我功能 perms:拥有某个资源的权限 role:拥有某个角色权限
    map.put("/user/**","authc");
    //可以在map中进行权限过滤 添加的过滤器类型为perms 表示拥有user:add权限的用户才可以访问/user/add页面
    map.put("/user/add","perms[user:add]");
    //设置未授权跳转页面
    shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");
    shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
    shiroFilterFactoryBean.setLoginUrl("/toLogin");
    return shiroFilterFactoryBean;
    } @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Autowired UserRealm userRealm){
    DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
    defaultWebSecurityManager.setRealm(userRealm);
    return defaultWebSecurityManager;
    } @Bean
    public UserRealm getUserRealm(){
    return new UserRealm();
    }
    }
    package com.codeyoung.shirodemo.config;/**
    * @author: ouououou
    * @date: 2021/11/3 14:17
    * @description:
    */ import com.sun.crypto.provider.PBEWithMD5AndDESCipher;
    import org.apache.catalina.User;
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.*;
    import org.apache.shiro.authc.credential.Md5CredentialsMatcher;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.apache.shiro.subject.Subject; /**
    * @ClassName UserRealm
    * @Description TODO
    * @Author ouououou
    * @Date 2021/11/3 14:17
    * @Version 1.0
    **/
    public class UserRealm extends AuthorizingRealm {
    /**
    * @description 授权 用户认证后经过授权过滤会进入此方法,可在此方法中进行授权
    * @param principalCollection
    * @date 2021/11/3 14:25
    * @return org.apache.shiro.authz.AuthorizationInfo
    */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
    //获取当前登录的用户为其授权
    Subject subject = SecurityUtils.getSubject();
    //用户经过认证后将其用户信息放入subject的principal中获取出来
    //User principal = (User) subject.getPrincipal();
    //通过用户的信息查询数据库中的权限为其授权
    simpleAuthorizationInfo.addStringPermission("");
    return simpleAuthorizationInfo;
    } /**
    * @description 认证 控制层调用login方法会进入此方法执行
    * @param authenticationToken
    * @date 2021/11/3 14:25
    * @return org.apache.shiro.authc.AuthenticationInfo
    */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    //将token转为保存用户名密码的token
    UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;
    //获取用户名
    String username = userToken.getUsername();
    //查询数据库获取用户信息
    //User user=userService.findUserByName(username);
    //通过用户名查询出对应的密码进行认证 模拟查询回来的密码
    String password="132";
    Md5CredentialsMatcher md5CredentialsMatcher = new Md5CredentialsMatcher(); return new SimpleAuthenticationInfo("", "password", "");
    }
    }
  3. 当访问任意页面时会进入ShiroConfig类中的过滤器,验证访问该页面需要的认证要求。如果需要登录则会跳转到登录页面。
  4. 当前端发起登录请求,通过SecurityUtils获取到当前登录的用户,将用户的数据封装到一个UsernamePasswordToken中,执行subject的login方法会进入到自定义认证鉴权类的认证方法doGetAuthenticationInfo(),将方法参数的token转为配置了用户登录参数的token,取出用户名在数据库查询出用户信息后,通过shiro框架的SimpleAuthenticationInfo对象传入密码,shiro框架会对密码进行验证。
    @RequestMapping("/login")
    public String login(@RequestParam("username") String username,@RequestParam("password") String password,Model model){
    //获取当前登录用户
    Subject subject = SecurityUtils.getSubject();
    //封装用户登录数据
    UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username,password);
    //登录请求会进到认证方法中
    try {
    subject.login(usernamePasswordToken);
    return "index";
    }catch (UnknownAccountException e){
    model.addAttribute("msg","用户名错误");
    return "login";
    }catch (IncorrectCredentialsException e){
    model.addAttribute("msg","密码错误");
    return "login";
    }catch (AuthenticationException e) {
    e.printStackTrace();
    return "login";
    }
    }
  5. 登陆成功后访问页面,如果页面需要授权则会经过shiroConfig的过滤器跳转到授权的页面,并对用户进行授权。UserRealm类的doGetAuthorizationInfo方法可以对用户进行授权,通过SecurityUtils获取出当前登录的用户,查询数据库获得当前登录的用户的权限列表,再通过simpleAuthorizationInfo对象将用户的权限设置后返回。
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
    //获取当前登录的用户为其授权
    Subject subject = SecurityUtils.getSubject();
    //用户经过认证后将其用户信息放入subject的principal中获取出来
    //User principal = (User) subject.getPrincipal();
    //通过用户的信息查询数据库中的权限为其授权
    simpleAuthorizationInfo.addStringPermission("");
    simpleAuthorizationInfo.setObjectPermissions(new HashSet<>());
    return simpleAuthorizationInfo;
    }

springboot整合shiro框架学习的更多相关文章

  1. SpringBoot整合Shiro权限框架实战

    什么是ACL和RBAC ACL Access Control list:访问控制列表 优点:简单易用,开发便捷 缺点:用户和权限直接挂钩,导致在授予时的复杂性,比较分散,不便于管理 例子:常见的文件系 ...

  2. springboot整合Shiro功能案例

    Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...

  3. SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理|前后端分离(下)----筑基后期

    写在前面 在上一篇文章<SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理(上)----筑基中期>当中,我们初步实现了SpringBoot整合Shiro ...

  4. 补习系列(6)- springboot 整合 shiro 一指禅

    目标 了解ApacheShiro是什么,能做什么: 通过QuickStart 代码领会 Shiro的关键概念: 能基于SpringBoot 整合Shiro 实现URL安全访问: 掌握基于注解的方法,以 ...

  5. 转:30分钟了解Springboot整合Shiro

    引自:30分钟了解Springboot整合Shiro 前言:06年7月的某日,不才创作了一篇题为<30分钟学会如何使用Shiro>的文章.不在意之间居然斩获了22万的阅读量,许多人因此加了 ...

  6. SpringBoot 整合Shiro 一指禅

    目标 了解ApacheShiro是什么,能做什么: 通过QuickStart 代码领会 Shiro的关键概念: 能基于SpringBoot 整合Shiro 实现URL安全访问: 掌握基于注解的方法,以 ...

  7. SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理(上)----筑基中期

    写在前面 通过前几篇文章的学习,我们从大体上了解了shiro关于认证和授权方面的应用.在接下来的文章当中,我将通过一个demo,带领大家搭建一个SpringBoot整合Shiro的一个项目开发脚手架, ...

  8. (十二)整合 Shiro 框架,实现用户权限管理

    整合 Shiro 框架,实现用户权限管理 1.Shiro简介 1.1 基础概念 1.2 核心角色 1.3 核心理念 2.SpringBoot整合Shiro 2.1 核心依赖 2.2 Shiro核心配置 ...

  9. SpringBoot 整合 Shiro 密码登录与邮件验证码登录(多 Realm 认证)

    导入依赖(pom.xml)  <!--整合Shiro安全框架--> <dependency> <groupId>org.apache.shiro</group ...

  10. SpringBoot整合Shiro实现权限控制

    目录 1.SpringBoot整合Shiro 1.1.shiro简介 1.2.代码的具体实现 1.2.1.Maven的配置 1.2.2.整合需要实现的类 1.2.3.项目结构 1.2.4.ShiroC ...

随机推荐

  1. 深度解读AIGC存储解决方案

    5月26日,2023数据基础设施技术峰会在苏州举办,腾讯云首席存储技术专家温涛受邀出席并分享了腾讯云领先的存储技术在AIGC场景中的应用,通过对AIGC业务流程和场景的提炼,从内容生成.内容审核和内容 ...

  2. vscode中react组件

    通过使用这个插件我们可以很方便的进行组件/方法/文件的导入 本篇博客仅对插件进行介绍翻译,便于自己以后使用 常用片段列表 imr: 引入 React import React from 'react' ...

  3. Typecho左右侧广告区域展示恋爱线时间

    该教程适用typecho动态博客框架,handsome主题,展示恋爱线时间,效果立于博客网页左侧右侧等区域,展示如下: 教程 typecho动态博客框架,handsome主题下,将下面代码粘贴到后台设 ...

  4. [HUBUCTF 2022 新生赛]simple_RE

    [HUBUCTF 2022 新生赛]simple_RE 查壳,64位 找main函数,F5查看伪代码,简单分析一下 int __cdecl main(int argc, const char **ar ...

  5. NSSCTF-[羊城杯 2021]签到题

    (脑洞题 gif放在stegsolve,分离gif 大胆猜测! 图一 28准则 图二 太极八卦阵 8 图三 三十而立 30 图四 北斗七星 7 图五 四个人 4大才子 图六 这个是歼-20 图七 两只 ...

  6. Int64针对32位架构是按照4字节还是8字节对齐?

    作为构建.NET的标准,CLI Spec(ECMA-335)针对基元类型的对齐规则具有如下的描述.按照这个标准,我们是这么理解的:8字节的数据类型(int64.unsigned int64和float ...

  7. Cilium系列-9-主机路由切换为基于 BPF 的模式

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...

  8. 从Element日期组件源码中学到的两个工具方法

    最近翻到 ElementUI 的日期组件源码,看到一些处理日期的工具方法,挺有意思,平常没有注意到,特此记录下来. 获取当前日期的前一天,后一天 export const prevDate = fun ...

  9. 浅析三维模型OBJ格式轻量化处理常见问题与处理措施

    浅析三维模型OBJ格式轻量化处理常见问题与处理措施 在三维模型OBJ格式轻量化处理过程中,可能会遇到一些问题.以下是一些常见问题以及相应的解决方法: 1.文件大小过大: OBJ格式的三维模型文件通常包 ...

  10. Linux查看磁盘空间,文件系统、挂载

    Linux磁盘空间,文件系统.挂载 概述 在使用以下命令查看磁盘使用情况时 df -h du -sh 目标路径 作为初级开发者,Linux入门级选手,可能不禁要问Linux系统的文件系统跟window ...