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. Day12_Java_作业

    1:需求:请设计一个方法,可以实现获取任意范围内的随机数. package student; import java.util.Random; import java.util.Scanner; /* ...

  2. 【原创】Ftrace使用及实现机制

    Ftrace使用及实现机制 版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100 如有错误,欢迎指正. 目录 Ftrace使用及实现机制 ...

  3. linux内核编译体验篇(一)

    文章目录 一. 准备环境 二. 获取内核源码 三. 交叉编译工具链的配置 1. 博友们常用安装方法链接 2. 公司常用的交叉工具链使用方法 四. 内核解压以及如何打补丁 五. 内核基本配置 1. 编译 ...

  4. python3 使用位图排序

    代码 from bitmap import BitMap a=[1,5,3,4,7,8,15,6,9] print(a) bm=BitMap(max(a)) #print(dir(bm)) print ...

  5. [prometheus]配置alertmanager和钉钉告警

    目录 prometheus发起告警的逻辑 节点 配置alertmanager 配置钉钉告警插件 配置supervisor守护进程 关联prometheus和alertmanager prometheu ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (73)-- 算法导论7.1 4题

    四.如何修改 QUICKSORT,使得它能够以非递增序进行排序? 文心一言: 快速排序(Quicksort)是一种常用的排序算法,基于分治策略进行设计.默认情况下,快速排序会以递增序进行排序.若想修改 ...

  7. Amiya 前端UI

    最近在使用一个基于Ant Design 二次封装的组件 Git文档地址 Index - Amiya (gitee.io)

  8. SpringBoot3集成RocketMq

    标签:RocketMq5.Dashboard: 一.简介 RocketMQ因其架构简单.业务功能丰富.具备极强可扩展性等特点被广泛应用,比如金融业务.互联网.大数据.物联网等领域的业务场景: 二.环境 ...

  9. 【Azure App Service】为部署在App Service上的PHP应用开启JIT编译器

    问题描述 在App Service for linux上创建一个PHP应用,通过 phpinfo() 查看PHP的扩展设置,发现JIT没有被开启, jit_buffer_size 大小为0. 那么,在 ...

  10. docker 搭建php环境(踩坑经验!!)

    本次安装的推荐配置: nginx 1.24.0 mysql 5.7.43 php 7.4.3-fpm redis 7.2.0   一.安装虚拟机 vm虚拟机需要4g内存,网络使用nat模式设置静态ip ...