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整合权限管理实战的更多相关文章

  1. SpringBoot&Shiro实现权限管理

    SpringBoot&Shiro实现权限管理 引言 相信大家前来看这篇文章的时候,是有SpringBoot和Shiro基础的,所以本文只介绍整合的步骤,如果哪里写的不好,恳请大家能指出错误,谢 ...

  2. springboot 与 shiro 整合 (简洁版)

    前言: 网上有很多springboot 与 shiro 整合的资料,有些确实写得很好, 对学习shiro和springboot 都有很大的帮助. 有些朋友比较省事, 直接转发或者复制粘贴.但是没有经过 ...

  3. Dubbo学习系列之九(Shiro+JWT权限管理)

    村长让小王给村里各系统来一套SSO方案做整合,隔壁的陈家村流行使用Session+认证中心方法,但小王想尝试点新鲜的,于是想到了JWT方案,那JWT是啥呢?JavaWebToken简称JWT,就是一个 ...

  4. 【shiro】(5)---基于Shiro的权限管理

    基于Shiro的权限管理项目搭建 前面写了四篇有关权限的文章,算是这篇文章的铺垫了.这篇文章采用 开发环境           JDK1.8          Eclipse          Mav ...

  5. spring-boot-plus集成Shiro+JWT权限管理

    SpringBoot+Shiro+JWT权限管理 Shiro Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理. 使用Shiro的易于理解的API,您可以 ...

  6. 10.spring-boot基于角色的权限管理页面实现

    10.spring-boot基于角色的权限管理页面实现

  7. springBoot2.0 配置shiro实现权限管理

    一.前言 基于上一篇springBoot2.0 配置 mybatis+mybatisPlus+redis 这一篇加入shiro实现权限管理 二.shiro介绍 2.1 功能特点 Shiro 包含 10 ...

  8. MySQL权限管理实战

    前言: 不清楚各位同学对数据库用户权限管理是否了解,作为一名 DBA ,用户权限管理是绕不开的一项工作内容.特别是生产库,数据库用户权限更应该规范管理.本篇文章将会介绍下 MySQL 用户权限管理相关 ...

  9. SpringBoot搭建基于Apache Shiro的权限管理功能

    Shiro 是什么 Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户“登录”: 授权 - 访问控制: 密码加密 ...

随机推荐

  1. 个人永久性免费-Excel催化剂插件功能修复与更新汇总篇之九

    第11波-快速批量插入图片并保护纵横比不变 原文链接:https://www.jianshu.com/p/9a3d9aa7ba7e 修复了插入图片有纵向的图片时,插入后还是显示横向的情况. 第83波- ...

  2. 【MySQL】(二)InnoDB存储引擎

    InnoDB是事务安全的MySQL存储引擎,设计上采用了类似于Oracel数据库的架构.通常来说,InnoDB存储引擎是OLTP应用中核心表的首选存储引擎.同时,也正是因为InnoDB的存在,才使My ...

  3. Java EE API

    百度云:链接:http://pan.baidu.com/s/1nvTlMLb     密码:vulq 官方下载网址:http://www.oracle.com/technetwork/java/jav ...

  4. 1.4.2python网站地图爬虫(每天一更)

    # -*- coding: utf-8 -*- ''' Created on 2019年5月6日 @author: 薛卫卫 ''' import urllib.request import re de ...

  5. $.ajax()在IE9下的兼容性问题

    最近在主导一个项目,遇到了一点问题,跟大家分享一下. 最终bug解决方案的链接地址:http://stackoverflow.com/questions/5241088/jquery-call-to- ...

  6. oracle一条语句插入多个值的方法

    今天在实践过程中遇到一个问题, 我想往数据库插入多条数据时,使用了如下语句: insert into 表1 (字段1,字段2) values (1,2),(2,3),(3,4); 这条语句在mysql ...

  7. 从CNI到OVN

    kubernetes各版本离线安装包 诸如calico flannel等CNI实现,通过牺牲一些功能让网络复杂度得以大幅度降低是我极其推崇的,在云原生时代应用不再关心基础设施的场景下是一个明智之举,给 ...

  8. Qtech 暑假未讲到的算法(不完全)

    一.数据结构:    优先队列.堆.RMQ问题(区间最值问题,可以用线段树解决,还有一个Sparse-Table算法).排序二叉树.划分树.归并树.....   字符串处理:    KMP.字典树.后 ...

  9. tab切换echarts无法正常显示问题

    项目中使用到了Echarts来在展示图表,两个tab切换页面中都存在图表,页面加载完成后 对所有图表进行了初始化和绘制,然后切换查看时,发现图表的宽度不正确.,第一个tab显示是很正常的,但是第二个t ...

  10. 从js 讲解时间复杂度和空间复杂度

    1. 博客背景 今天有同事在检查代码的时候,由于函数写的性能不是很好,被打回去重构了,细思极恐,今天和大家分享一篇用js讲解的时间复杂度和空间复杂度的博客 2. 复杂度的表示方式 之前有看过的,你可能 ...