之五 2流高手速成记:Springboot整合Shiro实现安全管理

废话不多说 , 咱们直接接上回
上一篇我们讲了如何使用Springboot框架整合Nosql,并于文章最后部分引入了服务端Session的概念
而早在上上一篇中 , 我们则已经讲到了如何使用Springboot框架整合Mybatis/MybatisPlus实现业务数据的持久化(写入数据库)
本篇我们把关注点放在一个于这两部分有共同交集的内容——安全管理,并且引入我们今天的主角——Shiro框架

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理 。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序 。
—— 来自百度百科
Shiro框架包含三个核心组件:
Subject —— 泛指当前与Shiro交互中的实体,可以是用户或者某后台进程
SecurityManager —— Shiro的核心组件,对内管理各种组件实例,对外提供各种安全服务
Realm —— Shiro与安全数据之间的桥接器
【之五 2流高手速成记:Springboot整合Shiro实现安全管理】Shiro框架还包含有其他诸多概念 , 为降低大家的心智负担,这些我们暂且不谈 , 文末会给大家推荐延展阅读的相关文章
还是老规矩直接上干货,以完整的实例让大家对【如何基于Shiro实现权限的细粒度控制】有一个整体上的认知
之五 2流高手速成记:Springboot整合Shiro实现安全管理

文章插图
 
之五 2流高手速成记:Springboot整合Shiro实现安全管理

文章插图
不知道大家会不会觉得项目结构突然变复杂?别担心,接下来我会给大家逐一拆解
1. 创建数据表首先是角色表——role
之五 2流高手速成记:Springboot整合Shiro实现安全管理

文章插图

之五 2流高手速成记:Springboot整合Shiro实现安全管理

文章插图
然后是用户表——user
之五 2流高手速成记:Springboot整合Shiro实现安全管理

文章插图

之五 2流高手速成记:Springboot整合Shiro实现安全管理

文章插图
最后是权限表——permission
之五 2流高手速成记:Springboot整合Shiro实现安全管理

文章插图

之五 2流高手速成记:Springboot整合Shiro实现安全管理

文章插图
2. 创建三个对应的Mapperpackage com.example.hellospringboot.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.example.hellospringboot.model.Role;import org.apache.ibatis.annotations.Mapper;import org.springframework.stereotype.Repository;@Mapper@Repositorypublic interface RoleMapper extends BaseMapper<Role> {}package com.example.hellospringboot.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.example.hellospringboot.model.User;import org.apache.ibatis.annotations.Mapper;import org.springframework.stereotype.Repository;@Mapper@Repositorypublic interface UserMapper extends BaseMapper<User> {}package com.example.hellospringboot.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.example.hellospringboot.model.Permission;import org.apache.ibatis.annotations.Mapper;import org.springframework.stereotype.Repository;@Mapper@Repositorypublic interface PermissionMapper extends BaseMapper<Permission> {}
这里我们用到了上上一节讲到的内容
这里的Mapper会辅助于后续的安全数据读取
3. 接下来是Service及其实现类package com.example.hellospringboot.service;import com.example.hellospringboot.model.Role;public interface RoleService {Role findRoleById(int id);}package com.example.hellospringboot.service.impl;import com.example.hellospringboot.mapper.RoleMapper;import com.example.hellospringboot.model.Role;import com.example.hellospringboot.service.RoleService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class RoleServiceImpl implements RoleService {@AutowiredRoleMapper mapper;public Role findRoleById(int id){Role role = mapper.selectById(id);return role;}}package com.example.hellospringboot.service;import com.example.hellospringboot.model.User;public interface UserService {boolean checkUserByUsernameAndPassword(String userName, String passWord);User findUserByUserName(String userName);}package com.example.hellospringboot.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.example.hellospringboot.mapper.UserMapper;import com.example.hellospringboot.model.User;import com.example.hellospringboot.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;@Servicepublic class UserServiceImpl implements UserService {@AutowiredUserMapper mapper;public boolean checkUserByUsernameAndPassword(String userName, String passWord){QueryWrapper<User> wrapper = new QueryWrapper<User>();wrapper = wrapper.eq("user_name", userName).eq("pass_word",passWord);List<User> userList = mapper.selectList(wrapper);return userList.size() > 0;}public User findUserByUserName(String userName){QueryWrapper<User> wrapper = new QueryWrapper<User>();wrapper = wrapper.eq("user_name", userName);User user = mapper.selectOne(wrapper);return user;}}

推荐阅读