SpringBoot2的Shiro最简配置(两个文件)
目录
基础环境:依赖
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最简配置(两个文件)相关推荐
- 【SpringBoot】2021终极版shiro+jwt整合策略,包含shiro1.5+新特性,极简配置,全网独家。
2021终极版shiro+jwt整合策略,包含shiro1.5+新特性,极简配置,全网独家. 前言:shiro1.4的配置之繁琐业内闻名,其实它自1.5之后就有了不小的改进,能够大大精简我们前期的整合 ...
- ssm框架mysql配置_ssm框架使用详解配置两个数据源
学习ssm框架已经快一年了,今天把这个框架总结一下. SSM 就是指 spring.SpringMVC和Mybatis.先说一下基本概念(百度上搜的) 1.基本概念 1.1.Spring Spring ...
- centos5.6 (64bit)编译安装vsftpd-2.3.4的配置(两种用户登录)[连载之电子商务系统架构]...
centos5.6 (64bit)编译安装vsftpd-2.3.4的配置(两种用户登录) 出处:http://jimmyli.blog.51cto.com/我站在巨人肩膀上Jimmy Li 作者:Ji ...
- phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php)
phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php) 一.总结 一句话总结:把原生php的网站直接放到thinkphp5的public目录下可以解决以stem.aaaa. ...
- Huawei交换机配置两台交换机堆叠示例
****配置两台交换机堆叠示例(先配置后连线方式,推荐) 组网图形 图1 配置两台交换机堆叠组网图 组网需求 在一个新建的企业网络中,要求接入设备具有充足的端口数目,并且希望网络结构简单,易于配置和管 ...
- Spring+Shiro+CAS整合配置笔记
一.前言 Apache Shiro与Spring Security一样是Java的一个安全框架.那为什么与Spring整合却用Shiro?不要问为什么,任性!开个玩笑:D 其实我个人是认为Spring ...
- 我的简书两月记:数据可视化
一.前言 "你无法衡量的东西,你也无法管理." 这是<精益数据分析>里提到的管理学大师彼得·德鲁克的一句话.我很认同. 很多人来简书写作,或长或久,可能无法准确量化自己 ...
- 聊聊springboot2的embeded container的配置改动
本文主要研究下springboot2的embeded container的配置改动 springboot 1.x import org.apache.catalina.connector.Connec ...
- spring 配置只读事务_只读副本和Spring Data第3部分:配置两个实体管理器
spring 配置只读事务 我们之前的设置可以正常工作. 我们现在要做的是进一步发展,并配置两个单独的实体管理器,而不会影响我们之前实现的功能. 第一步是将默认实体管理器配置设置为主要配置. 这是第一 ...
最新文章
- 程序员的光荣与梦想——论侠客梦的延续与幻灭
- 【2018.3.31】模拟赛之三-ssl2408 比萨【搜索,dfs】
- 简单封装kafka相关的api
- Java的这个强大功能,很多人都不知道
- 2017.9.4 斜堆 失败总结
- 第九届蓝桥杯C++B组
- github 【第三章】Github综合
- 成都大数据等新经济代表行业在全国城市位居前列
- 多重背包单调队列优化思路_单调队列优化多重背包问题
- 最齐全的射灯ies光域网素材,速来收藏
- 【重要】股票收益互换
- 为什么创业者要假装读过《从0到1》和《创业维艰》?
- rotation应用和vector3向量
- win7 使用扫描仪扫描照片
- JAE触摸屏维修JAE人机界面维修UT3-TS5-B
- HDU - 4622 Reincarnation
- 敏捷概念.Stacey矩阵
- Datawhale打卡活动 Kaggle Spaceship Titanic Day3
- 做一个好看的个人网站
- 什么是 CI/CD?(翻译)
热门文章
- python安装路径,pip安装的包以及pip的安装路径在哪?
- 原型图 线框图_16个原型设计和线框图设计工具
- 数据分类分级是什么?分类与分级区别又在哪?
- 语音助手——QU——query纠错与改写
- 中国文化概论名词解释题
- 深度学习大图切成小块图片代码---针对图像分割而言
- 五大创新技术成就秦淮“绿色翘楚”
- 计算机设置鼠标关灯,鼠标灯怎么关?通过BIOS设置即可解决!
- CC00042.CloudKubernetes——|KuberNetes二进制部署.V20|5台Server|——|kubernetes配置|生产环境关键性配置|
- 大虾说工具 -- 横展开