目录

基础环境:依赖

Realm:认证鉴权器

WebSecurityManager:安全管理器

Test:登录测试

备注


基础环境:依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.1.RELEASE</version><relativePath/> <!-- lookup parent from repository -->
</parent><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-starter</artifactId><version>1.4.0</version>
</dependency>

如果不是前后端分离,要实现页面级的权限控制,则加入以下依赖就可以使用shiro的权限标签了(记得在html头部加上相应约束:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="Thymeleaf" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"lang="en">

):

<dependency><groupId>com.github.theborakompanioni</groupId><artifactId>thymeleaf-extras-shiro</artifactId><version>2.0.0</version>
</dependency>

Realm:认证鉴权器

package com.rz.monomer.modules.shiro;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.rz.monomer.modules.user.entity.SysUserInfo;
import com.rz.monomer.modules.user.entity.SysUserRole;
import com.rz.monomer.modules.user.service.SysButtonInfoService;
import com.rz.monomer.modules.user.service.SysUserInfoService;
import com.rz.monomer.modules.user.service.SysUserRoleService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
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 java.util.Set;
import java.util.stream.Collectors;/*** 认证、鉴权类(必须)** @author sunziwen* @version 1.0* @date 2019/11/14 14:06**/
@Slf4j
public class ShiroRealm extends AuthorizingRealm {//以下三个服务是普通Dao查询,从数据库查询用户及其角色权限信息(这个类没有自动注入,需要在下个文件中手动注入)private SysUserInfoService userInfoService;private SysButtonInfoService buttonInfoService;private SysUserRoleService userRoleService;public ShiroRealm(SysUserInfoService userInfoService, SysButtonInfoService buttonInfoService, SysUserRoleService userRoleService) {this.userInfoService = userInfoService;this.buttonInfoService = buttonInfoService;this.userRoleService = userRoleService;}@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {log.info("check authorization info");SimpleAuthorizationInfo authInfo = new SimpleAuthorizationInfo();// 获取当前用户SysUserInfo userInfo = (SysUserInfo) principals.getPrimaryPrincipal();// 查询角色信息Set<Long> userRoles = userRoleService.list(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userInfo.getId())).stream().map(SysUserRole::getRoleId).collect(Collectors.toSet());//角色所有权限Set<String> perms = buttonInfoService.getPermsByRoles(userRoles);authInfo.addStringPermissions(perms);return authInfo;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {log.info("check authentication info");String username = (String) token.getPrincipal();// 获取用户信息SysUserInfo user = userInfoService.getOne(new LambdaQueryWrapper<SysUserInfo>().eq(SysUserInfo::getUsername, username));if (user == null) {return null;}/*SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, user.getPassword(),ByteSource.Util.bytes(654321), getName());*/SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, user.getPassword(), getName());return authenticationInfo;}
}

WebSecurityManager:安全管理器

package com.rz.monomer.modules.shiro;import com.rz.monomer.modules.user.service.SysButtonInfoService;
import com.rz.monomer.modules.user.service.SysUserInfoService;
import com.rz.monomer.modules.user.service.SysUserRoleService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.filter.authc.LogoutFilter;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.servlet.Filter;
import java.util.LinkedHashMap;
import java.util.Map;/*** Shiro配置类(必须)** @author sunziwen* @version 1.0* @date 2019/11/14 14:08**/
@Configuration
@Slf4j
@AllArgsConstructor
public class WebSecurityManager {private SysUserInfoService userInfoService;private SysButtonInfoService buttonInfoService;private SysUserRoleService userRoleService;/*** 安全管理器*/@Beanpublic DefaultWebSecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(realm());return securityManager;}/*** 认证鉴权器(安全管理器的依赖)*/@Beanpublic ShiroRealm realm() {return new ShiroRealm(userInfoService, buttonInfoService, userRoleService);}/*** 配置拦截规则*/@Beanpublic ShiroFilterFactoryBean filter(org.apache.shiro.mgt.SecurityManager securityManager) {log.info("config shiro filter");ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);// 定义URL拦截链Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();// 允许匿名用户访问首页filterChainDefinitionMap.put("/shiro/index", "anon");// 定义注销路径filterChainDefinitionMap.put("/shiro/logout", "logout");// 所有用户界面都需要身份验证,否则会跳转到loginurl,由FormAuthenticationFilter处理filterChainDefinitionMap.put("/shiro/user/**", "authc");// 为login路径定义拦截,由FormAuthenticationFilter处理filterChainDefinitionMap.put("/shiro/login", "authc");// 所有vip路径要求具备vip角色权限filterChainDefinitionMap.put("/shiro/vip/**", "roles[vip]");// 指定loginurl 路径shiroFilterFactoryBean.setLoginUrl("/shiro/login");// 登录成功后跳转路径shiroFilterFactoryBean.setSuccessUrl("/shiro/user/");// for un authenticatedshiroFilterFactoryBean.setUnauthorizedUrl("/shiro/unauth");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);// 自定义filters,可覆盖默认的Filter列表,参考 DefaultFilterMap<String, Filter> filters = new LinkedHashMap<String, Filter>();// 定制logout 过滤,指定注销后跳转到登录页(默认为根路径)LogoutFilter logoutFilter = new LogoutFilter();logoutFilter.setRedirectUrl("/shiro/login");filters.put("logout", logoutFilter);// 定制authc 过滤,指定登录表单参数FormAuthenticationFilter authFilter = new FormAuthenticationFilter();authFilter.setUsernameParam("username");authFilter.setPasswordParam("password");filters.put("authc", authFilter);shiroFilterFactoryBean.setFilters(filters);return shiroFilterFactoryBean;}
}

Test:登录测试

package com.rz.monomer.modules.user.controller;import com.rz.monomer.commons.utils.Md5Encrypt;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@RestController
@Slf4j
public class LoginController {@PostMapping("/login")public String login(@RequestParam("username") String username, @RequestParam("password") String password) {Subject subject = SecurityUtils.getSubject();AuthenticationToken token = new UsernamePasswordToken(username, Md5Encrypt.md5(password));try {// 执行登录subject.login(token);} catch (UnknownAccountException e) {// 未知用户log.warn("the account {}  is not found", username);return "account not found";} catch (IncorrectCredentialsException e) {// 用户或密码不正确log.warn("the account or password is not correct");return "account or password not correct";}return "login success";}}

备注

有问题加威型:sunziwen3366。备注CSDN

SpringBoot2的Shiro最简配置(两个文件)相关推荐

  1. 【SpringBoot】2021终极版shiro+jwt整合策略,包含shiro1.5+新特性,极简配置,全网独家。

    2021终极版shiro+jwt整合策略,包含shiro1.5+新特性,极简配置,全网独家. 前言:shiro1.4的配置之繁琐业内闻名,其实它自1.5之后就有了不小的改进,能够大大精简我们前期的整合 ...

  2. ssm框架mysql配置_ssm框架使用详解配置两个数据源

    学习ssm框架已经快一年了,今天把这个框架总结一下. SSM 就是指 spring.SpringMVC和Mybatis.先说一下基本概念(百度上搜的) 1.基本概念 1.1.Spring Spring ...

  3. centos5.6 (64bit)编译安装vsftpd-2.3.4的配置(两种用户登录)[连载之电子商务系统架构]...

    centos5.6 (64bit)编译安装vsftpd-2.3.4的配置(两种用户登录) 出处:http://jimmyli.blog.51cto.com/我站在巨人肩膀上Jimmy Li 作者:Ji ...

  4. phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php)

    phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php) 一.总结 一句话总结:把原生php的网站直接放到thinkphp5的public目录下可以解决以stem.aaaa. ...

  5. Huawei交换机配置两台交换机堆叠示例

    ****配置两台交换机堆叠示例(先配置后连线方式,推荐) 组网图形 图1 配置两台交换机堆叠组网图 组网需求 在一个新建的企业网络中,要求接入设备具有充足的端口数目,并且希望网络结构简单,易于配置和管 ...

  6. Spring+Shiro+CAS整合配置笔记

    一.前言 Apache Shiro与Spring Security一样是Java的一个安全框架.那为什么与Spring整合却用Shiro?不要问为什么,任性!开个玩笑:D 其实我个人是认为Spring ...

  7. 我的简书两月记:数据可视化

    一.前言 "你无法衡量的东西,你也无法管理." 这是<精益数据分析>里提到的管理学大师彼得·德鲁克的一句话.我很认同. 很多人来简书写作,或长或久,可能无法准确量化自己 ...

  8. 聊聊springboot2的embeded container的配置改动

    本文主要研究下springboot2的embeded container的配置改动 springboot 1.x import org.apache.catalina.connector.Connec ...

  9. spring 配置只读事务_只读副本和Spring Data第3部分:配置两个实体管理器

    spring 配置只读事务 我们之前的设置可以正常工作. 我们现在要做的是进一步发展,并配置两个单独的实体管理器,而不会影响我们之前实现的功能. 第一步是将默认实体管理器配置设置为主要配置. 这是第一 ...

最新文章

  1. 程序员的光荣与梦想——论侠客梦的延续与幻灭
  2. 【2018.3.31】模拟赛之三-ssl2408 比萨【搜索,dfs】
  3. 简单封装kafka相关的api
  4. Java的这个强大功能,很多人都不知道
  5. 2017.9.4 斜堆 失败总结
  6. 第九届蓝桥杯C++B组
  7. github 【第三章】Github综合
  8. 成都大数据等新经济代表行业在全国城市位居前列
  9. 多重背包单调队列优化思路_单调队列优化多重背包问题
  10. 最齐全的射灯ies光域网素材,速来收藏
  11. 【重要】股票收益互换
  12. 为什么创业者要假装读过《从0到1》和《创业维艰》?
  13. rotation应用和vector3向量
  14. win7 使用扫描仪扫描照片
  15. JAE触摸屏维修JAE人机界面维修UT3-TS5-B
  16. HDU - 4622 Reincarnation
  17. 敏捷概念.Stacey矩阵
  18. Datawhale打卡活动 Kaggle Spaceship Titanic Day3
  19. 做一个好看的个人网站
  20. 什么是 CI/CD?(翻译)

热门文章

  1. python安装路径,pip安装的包以及pip的安装路径在哪?
  2. 原型图 线框图_16个原型设计和线框图设计工具
  3. 数据分类分级是什么?分类与分级区别又在哪?
  4. 语音助手——QU——query纠错与改写
  5. 中国文化概论名词解释题
  6. 深度学习大图切成小块图片代码---针对图像分割而言
  7. 五大创新技术成就秦淮“绿色翘楚”
  8. 计算机设置鼠标关灯,鼠标灯怎么关?通过BIOS设置即可解决!
  9. CC00042.CloudKubernetes——|KuberNetes二进制部署.V20|5台Server|——|kubernetes配置|生产环境关键性配置|
  10. 大虾说工具 -- 横展开