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安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户“登录”: 授权 - 访问控制: 密码加密 ...
随机推荐
- 个人永久性免费-Excel催化剂功能第66波-数据快速录入,预定义引用数据逐字提示
在前面好几波的功能中,为数据录入的规范性做了很大的改进,数据录入乃是数据应用之根,没有完整.干净的数据源,再往下游的所有数据应用场景都是空话.在目前IT化进程推进了20多年的现状,是否还仍有必要在Ex ...
- Git远程版本库
目前为止,所有的Git操作都是在一个本地版本库中.现在是时候来体验Git分布式的特性了. 说到远程版本库,大家最为熟悉的就是GitHub了,它实际上就相当于一个远程版本库,托管着所有的本地版本库的提交 ...
- 万能RecyclerView的数据适配器BaseRecyclerViewAdapterHelper
今天楼主才发现github上有这么一个好用的开源代码,充满好奇心的楼主马上使用了,特地分享给大家. 此项目的github地址: https://github.com/CymChad/BaseRecyc ...
- InstantiationException:mybatis.spring.transaction.SpringManagedTransactionFactory
问题表现 Error creating bean with name 'sqlSessionFactory' Invocation of init method failed; nested exce ...
- Word公式显示为{EMBED Equation.DSMT4}
具体问题表现为: 添加了Mathtype公式后显示为{EMBED Equation.DSMT4}, 超链接显示为大花括号和描述文本, 页码显示为 page... 具体解决方法如下,(以Office2 ...
- cookbook_数据结构和算法
1.1将数据分解为单独的变量 list_a = [1,2,3,4,5,6,7,8,9] a,b,c,d,e,f,g,h,i = list_a print(a,b,c,d,e,f,g,h,i) #使用相 ...
- 学习LayUI时自研的表单参数校验框架
开发背景&痛点:每次写前端的表单的时候需要对表单里用户填写的内容进行校验,减少服务器压力,提前对已知错误对用户提示.每次会要写很多的if else等等对输入框中的内容进行判断,并对为空.格式不 ...
- 基于redis的消息订阅与发布
Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端. 作为例子, 下图展示了频道 channel1 ...
- 关于JS、JQ首行首列固定展示
当时遇见这个问题 是医院手麻系统大批量数据展示,由于是旧项目系统没有使用到前端的架构 只能使用JQ,JS, css完成 也谢谢给予我支持的同行们 固定首行数据: 采用函数的方式进行 JQ /** * ...
- 当面对会反制遭破解装置的App该如何顺利提取数据
在检测App的过程之中,总会遇到比较棘手的,以”侦测是否遭破解的装置”为例,便会是个不好处理的状况.当App具备侦测装置是否已遭Root时,一旦发现装置已遭破解,便会停止运行,等于是只准安装及运行在未 ...