SpringBoot与Shiro整合权限管理实战
SpringBoot与Shiro整合权限管理实战
作者 : Stanley 罗昊
【转载请注明出处和署名,谢谢!】
*观看本文章需要有一定SpringBoot整合经验*
Shiro框架简介
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,可以快速、轻松地获得任何应用程序,
从最小的移动应用程序到最大的网络和企业应用程序。
分析Shiro的核心API
其实,Shiro的核心类有三个,分别是:
1.Subject:这个类呢,我们称之当前用户的主体,这个用户的主体包含了登陆、注销等等的一些方法,还有一些判断授权的一些方法;
2.SecurityManager:这个名称翻译过来就是,安全管理器的意思;
3.Realm:这个Realm呢其实我们Shiro去链接数据库的一个桥梁,因为,我们的程序需要去操作数据库去获取一些用户的信息,这些操作都需要Realm去完成;
这个三个API呢,都存在一些关系,比如.SecurityManager是需要去关联我们的Realm,Subject是需要把操作交给我们的SecurityManager,总结下来就是,Subject是需要去管理我们的SecurityManager,而SecurityManager去关联我们的Realm;
以上就是对Shiro的核心API进行的一些分析;
分析完之后,我们接下来就直接用SpringBoot与Shiro的整合,我们来看下它整合的关键步骤
SpringBoot整合Shiro
那么这个整合首先第一步需要导入Shiro的依赖;
【因为我用的是Gradle,所以仅展示Gradle用法】
1.修改.gradle文件,添加以下依赖
//Thymeleaf模板引擎,因为我用模板引擎所以我添加了此依赖
compile group: 'org.thymeleaf', name: 'thymeleaf', version: '3.0.11.RELEASE'
//Shiro
compile group: 'org.apache.shiro', name: 'shiro-web', version: '1.4.0'
compile group: 'org.apache.shiro', name: 'shiro-core', version: '1.4.0'
// https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring
compile group: 'org.apache.shiro', name: 'shiro-spring', version: '1.4.0'
2.编写Shiro的配置类
配置类需要三样API,分别是:
/**
* 创建ShiroFilterFactoryBean
* shiro过滤bean
*/ /**
* 创建DefaultWebSecurityManager
*/ /**
* 创建Realm
*/
如图:

3.自定义Realm类
因为我们需要在配置类中创建出Realm对象,所以我们需要建一个名为Realm的类:
创建后,需要继承一个方法,这个方法是Shiro提供的:
/**
* 自定义Realm
*/
public class UserRealm extends AuthorizingRealm {
//执行授权逻辑
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null;
} //执行认证逻辑
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException { return null; }
4.在配置类中new出Realm

Shiro配置配置类
package com.lh.shiroStudy.shiro; import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import java.util.LinkedHashMap;
import java.util.Map; /**
* Shiro配置类
*/
//@Configuration,声明本类是一个配置类
@Configuration
public class ShiroConfig { /**
* 创建ShiroFilterFactoryBean
* shiro过滤bean
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//设置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
//添加Shiro过滤器
/**
* Shiro内置过滤器,可以实现权限相关的拦截器
* 常用的过滤器:
* anon: 无需认证(登录)可以访问
* authc: 必须认证才可以访问
* user: 如果使用rememberMe功能可以直接访问
* perms: 该资源必须得到资源权限才可以访问
* role: 该资源必须得到角色权限才可以访问
*/ Map<String,String>filterMap = new LinkedHashMap<String, String>();
//左边编写拦截路径
filterMap.put("/add","authc");
filterMap.put("/update","authc");
filterMap.put("/testThymeleaf","authc");
//授权过滤器
//注意:当前授权拦截后,shiro会自动跳转未授权页面
filterMap.put("/add","perms[user:add]"); //修改跳转的登陆页面
shiroFilterFactoryBean.setLoginUrl("/toLogin"); //转跳至未授权页面【友好提示】
shiroFilterFactoryBean.setUnauthorizedUrl("/aaaaaa");//懒省事所以没有aaaa这个页面,如果需要,请在Contoller中添加 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
return shiroFilterFactoryBean;
} /**
* 创建DefaultWebSecurityManager
*/
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("UserRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(userRealm);
return securityManager;
} /**
* 创建Realm
*/
@Bean(name = "UserRealm")
public UserRealm getRealm(){
return new UserRealm();
} }
Realm类
package com.lh.shiroStudy.shiro; import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection; /**
* 自定义Realm
*/
public class UserRealm extends AuthorizingRealm {
//执行授权逻辑
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { //给资源进行授权
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //添加资源的授权字符串
//info.addStringPermission("user:add"); //到数据库查询当前登陆用户的授权字符串
/**
* <!-演示状态-!>
* 获取当前用户
* Subject subject = SecurityUtils.getSubject();
* User user = (User)subject.getPrincipal();
* User dbUser = userService.findById(id)
* info.addStringPermission(dbUser.getPerms());
* </!-演示状态-!>
*/
System.out.println("执行授权逻辑");
return null;
} //执行认证逻辑
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
System.out.println("执行认证逻辑");
//假设数据库账号与密码是如下
String username = "admin";
String password = "123456";
/**
* 编写Shiro判断逻辑,比对用户名和密码
*/
//1.判断用户名
UsernamePasswordToken token =(UsernamePasswordToken)arg0; //User user = userService.findByName(token.getUsername()); if (user == null){
//用户名不存在
return null;//如果返回null,Shiro底层会抛出UnknowAccountException
}
//2.判断密码
/**
* 有三个参数
* 1.需要返回给login
* 2.是数据库的密码,将数据库密码返回,Shiro会自动判断
* 3.是Shiro的名字
*/
return new SimpleAuthenticationInfo(user,password,""); }
}
SpringBoot与Shiro整合权限管理实战的更多相关文章
- SpringBoot&Shiro实现权限管理
SpringBoot&Shiro实现权限管理 引言 相信大家前来看这篇文章的时候,是有SpringBoot和Shiro基础的,所以本文只介绍整合的步骤,如果哪里写的不好,恳请大家能指出错误,谢 ...
- springboot 与 shiro 整合 (简洁版)
前言: 网上有很多springboot 与 shiro 整合的资料,有些确实写得很好, 对学习shiro和springboot 都有很大的帮助. 有些朋友比较省事, 直接转发或者复制粘贴.但是没有经过 ...
- Dubbo学习系列之九(Shiro+JWT权限管理)
村长让小王给村里各系统来一套SSO方案做整合,隔壁的陈家村流行使用Session+认证中心方法,但小王想尝试点新鲜的,于是想到了JWT方案,那JWT是啥呢?JavaWebToken简称JWT,就是一个 ...
- 【shiro】(5)---基于Shiro的权限管理
基于Shiro的权限管理项目搭建 前面写了四篇有关权限的文章,算是这篇文章的铺垫了.这篇文章采用 开发环境 JDK1.8 Eclipse Mav ...
- spring-boot-plus集成Shiro+JWT权限管理
SpringBoot+Shiro+JWT权限管理 Shiro Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理. 使用Shiro的易于理解的API,您可以 ...
- 10.spring-boot基于角色的权限管理页面实现
10.spring-boot基于角色的权限管理页面实现
- springBoot2.0 配置shiro实现权限管理
一.前言 基于上一篇springBoot2.0 配置 mybatis+mybatisPlus+redis 这一篇加入shiro实现权限管理 二.shiro介绍 2.1 功能特点 Shiro 包含 10 ...
- MySQL权限管理实战
前言: 不清楚各位同学对数据库用户权限管理是否了解,作为一名 DBA ,用户权限管理是绕不开的一项工作内容.特别是生产库,数据库用户权限更应该规范管理.本篇文章将会介绍下 MySQL 用户权限管理相关 ...
- SpringBoot搭建基于Apache Shiro的权限管理功能
Shiro 是什么 Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户“登录”: 授权 - 访问控制: 密码加密 ...
随机推荐
- 算法学习笔记,几个简单的Demo
算法初学的一些心得 前言:现在工作也快一年多了,有时间下班回家会学学算法,陆陆续续也接触了一些 貌似我知道的就冒泡排序其他的都不是很了解 最近买了一本书,边学边记录吧! 一些常用的方法 暴力破解 下面 ...
- mimalloc内存分配代码分析
这篇文章中我们会介绍一下mimalloc的实现,其中可能涉及上一篇文章提到的内容,如果不了解的可以先看下这篇mimalloc剖析.首先我们需要了解的是其整体结构,mimalloc的结构如下图所示 ...
- 前端三剑客之HTML
目录 what is html html基本格式 html常用标签及其属性 @() what is html (hypertext marked language)超文本标记语言,负责页面文本.图片内 ...
- Excel催化剂图表系列之品味IBCS瀑布图观察企业利润构成
IBCS图表,每个细节都值得反复琢磨参悟,此篇给大家送上详尽的瀑布图方式下的利润数据观察.请不要拿Excel2016版提供的瀑布图与IBCS版的瀑布图作对比,那完全不是一个级别的,可以类比为拿一辆经济 ...
- nl2br()处理字符串中的换行符
nl2br() 函数 在字符串中包含换行符时,需要对其进行转换,php 中有str_replace()函数,可以直接对字符串进行替换处理.但php中还有nl2br()函数可以直接处理. 1.在字符串中 ...
- linux初学者-磁盘拉伸缩减篇
linux初学者-磁盘拉伸缩减篇 在系统的使用过程中,往往会出现这样的问题,由于刚开始无法估计需要的磁盘空间,导致后期磁盘空间不够,使得数据没地方存储,又或者后期磁盘空间过大,造成资源的浪费.这种在使 ...
- 【MySQL】Unknown column 'column_name' in 'field list'
使用 INSERT INTO - SELECT FROM - ON DUPLICATE KEY UPDATE 时遇到了这个问题,百思不得其解
- 【iOS】Apple Mach-O Linker Error Linker command failed with exit code 1
又遇到了这个问题,貌似之前遇到过……如图所示: 解决方法寻找中………… 在 Stack Overflow 找到了解决方法,如下: 参考链接:Apple Mach-O Linker Error
- WPF控件截图
//截图 RenderTargetBitmap RenderVisaulToBitmap(Visual vsual, int width, int height) { ...
- java高并发系列 - 第23天:JUC中原子类,一篇就够了
这是java高并发系列第23篇文章,环境:jdk1.8. 本文主要内容 JUC中的原子类介绍 介绍基本类型原子类 介绍数组类型原子类 介绍引用类型原子类 介绍对象属性修改相关原子类 预备知识 JUC中 ...