代码延续地址:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01


1.创建t_role角色表(比如管理员admin,普通用户user等),创建t_pers权限表(比如add,update,delete等),t_user_role与t_role_pers作为三个表的中间表(因为这三个表之间是多对多的关系)


2.UserMapper.xml新增sql查询

    <select id="findByRolesUserName" parameterType="String" resultMap="userMap">
select u.id uid,u.username,r.id rid,r.name
from t_user u
left join t_user_role ur
on u.id=ur.userId
left join t_role r
on ur.roleId=r.id
where u.username=#{username};
</select> <select id="findPermsByRoleId" parameterType="String" resultType="com.hao.springboot.entity.Pers">
select p.id,p.name,p.url,r.name
from t_role r
left join t_role_pers rp
on r.id=rp.roleId
left join t_pers p
on p.id=rp.persId
where r.id=#{id}
</select>

3.UserDao新增方法

    //根据用户名查询所有角色
User findByRolesUserName(String username); //根据角色id查询权限集合
List<Pers> findPermsByRoleId(String id);

4.Service层新增方法(接口代码省略)

    @Override
public User findByRolesUserName(String username) {
return userDao.findByRolesUserName(username);
} @Override
public List<Pers> findPermsByRoleId(String id) {
return userDao.findPermsByRoleId(id);
}

5.改变自定义realm

/**
* @author:抱着鱼睡觉的喵喵
* @date:2020/12/29
* @description: 自定义realm完成用户认证和授权
*/
public class CustomerRealm extends AuthorizingRealm {
/**
* 用户授权
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("调用权限认证:"+principalCollection);
String primaryPrincipal = (String) principalCollection.getPrimaryPrincipal();
//调用身份信息获取角色和权限信息
UserService userService = (UserService) ApplicationContextUtils.getBean("userService");
//根据主身份获取角色和权限信息
User users = userService.findByRolesUserName(primaryPrincipal);
//授权角色信息
if (!CollectionUtils.isEmpty(users.getRoles())){
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
users.getRoles().forEach(role -> {
simpleAuthorizationInfo.addRole(role.getName());
List<Pers> perms = userService.findPermsByRoleId(role.getId());
if (!CollectionUtils.isEmpty(perms)){
perms.forEach(pers -> {
simpleAuthorizationInfo.addStringPermission(pers.getName());
});
}
});
return simpleAuthorizationInfo;
}
return null;
}
/**
* 用户认证
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
String principal = (String) authenticationToken.getPrincipal(); //在工厂中获取业务对象
UserService userService = (UserService) ApplicationContextUtils.getBean("userService");
User user = userService.findByUserName(principal);
if (!ObjectUtils.isEmpty(user)){
return new SimpleAuthenticationInfo(user.getUsername(),user.getPassword(), ByteSource.Util.bytes(user.getSalt()),this.getName());
}
return null;
}
}

6.index.jsp

<%@page contentType="text/html; utf-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>系统主页,欢迎你的到来</h1>
<a href="${pageContext.request.contextPath}/user/outLogin">退出</a> <ul>
<shiro:hasAnyRoles name="user">
<li><a href="">用户管理</a>
<ul>
<shiro:hasPermission name="user:add:*">
<li><a href="">添加用户</a></li>
</shiro:hasPermission>
<li><a href="">删除用户</a></li>
<li><a href="">修改用户</a></li>
<li><a href="">查询用户</a></li>
</ul>
</li>
</shiro:hasAnyRoles>
<shiro:hasRole name="product">
<li><a href="">部分格式化</a> </li>
</shiro:hasRole>
<shiro:hasRole name="admin">
<li><a href="">商品管理</a> </li>
<li><a href="">订单管理</a> </li>
<li><a href="">物流管理</a> </li>
</shiro:hasRole>
<shiro:hasRole name="shper">
<li><a href="">终极格式化</a> </li>
</shiro:hasRole>
</ul>
</body>
</html>

7.访问http://localhost:8080/shiro/login.jsp


退出

Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02的更多相关文章

  1. Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01

    这个小项目包含了注册与登录,使用了springboot+mybatis+shiro的技术栈:当用户在浏览器登录时发起请求时,首先这一系列的请求会被拦截器进行拦截(ShiroFilter),然后拦截器根 ...

  2. Shiro+springboot+mybatis+EhCache(md5+salt+散列)认证与授权-03

    从上文:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02 当每次进行刷新时,都会从数据库重新查询数据进行授权操作,这样无疑给数据库造成很大的压力,所以需要引入 ...

  3. SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理(上)----筑基中期

    写在前面 通过前几篇文章的学习,我们从大体上了解了shiro关于认证和授权方面的应用.在接下来的文章当中,我将通过一个demo,带领大家搭建一个SpringBoot整合Shiro的一个项目开发脚手架, ...

  4. SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理|前后端分离(下)----筑基后期

    写在前面 在上一篇文章<SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理(上)----筑基中期>当中,我们初步实现了SpringBoot整合Shiro ...

  5. MD5随机散列加密算法

    项目中需要在登录验证用户名.密码的时候对密码进行加密处理,由于是比较商业化的软件,所以安全方面还是必须要考虑的.而使用MD5随机散列加密算法使得密码加密后不可逆,很大程度上提升了安全性.废话不多说,看 ...

  6. 加密算法和MD5等散列算法的区别(转)

    本文转自http://www.cnblogs.com/eternalwt/archive/2013/03/21/2973807.html 感谢作者 1.在软件开发的用户注册功能中常出现MD5加密这个概 ...

  7. SpringBoot + SpringSecurity + Mybatis-Plus + JWT实现分布式系统认证和授权

    1. 简介   Spring Security是一个功能强大且易于扩展的安全框架,主要用于为Java程序提供用户认证(Authentication)和用户授权(Authorization)功能.    ...

  8. shiro+springboot分析思路

    文章目录 前言 一.为什么要使用shiro 二.使用步骤 1.如何认证和授权 2.如何获取数据 总结 前言 shiro和spring security等安全框架可以用户管理和权限认证 一.为什么要使用 ...

  9. SpringBoot + SpringSecurity + Mybatis-Plus + JWT + Redis 实现分布式系统认证和授权(刷新Token和Token黑名单)

    1. 前提   本文在基于SpringBoot整合SpringSecurity实现JWT的前提中添加刷新Token以及添加Token黑名单.在浏览之前,请查看博客:   SpringBoot + Sp ...

随机推荐

  1. vue 组件间的几种通信方式

    Props配置 原理:通过props配置,进行父子组件间的通信,跨父子通信需要其他组件进行过渡. 使用: 传递方在标签中添加传递内容 <Son :newName="name" ...

  2. map, reduce和filter(函数式编程)

    # map可以用于对可遍历结构的每个元素执行同样的操作,批量操作: map(lambda x: x**2, [1, 2, 3, 4]) # [1, 4, 9, 16] map(lambda x, y: ...

  3. ArcMap操作随记(12)

    1.[取色器]工具 [自定义]|[自定义模式]|[命令] 2.批量修改符号 [符号系统]→右键,[所有符号的属性] 3.将地图元素转换为图形 转换工具 4.好看的地图边框 [布局视图]→数据框上右键→ ...

  4. 6月6日 python学习总结 jQuery (三)

    1. 常用事件 1. hover #鼠标悬停监听 2. keydown和keyup #键盘按键 按下/抬起 3. change #监听值的改变 全部输入完失去焦点后 4. focus和blur # 获 ...

  5. SQL注入常用命令

    1. 数据库查询版本 Mssql select @@version Mysql select vresion()/select @@version oracle select banner from ...

  6. minouche

    靶机准备 先将靶机导入虚拟机,并将网络模式改为NAT 扫描不到ip,改VirtualBox,使用桥接,并将kali也改为桥接模式 扫描ip:192.168.0.102 netdiscover -r 1 ...

  7. 机械学习笔记1 -> Solidworks三维产品设计与建模1 | 建模基础入门

    学习之余,课余了解一点点,作为爱好,妄想以后能够设计机甲出来. 学习来源是Solidworks三维产品设计与建模 00 工作界面介绍 00-1 概览 有时菜单栏和工具栏会重叠在一起,只有点击左侧三角才 ...

  8. 哪些浏览器支持HTML 5?

    几乎所有的浏览器都支持HTML 5,例如Safari,Chrome,火狐,Opera,IE等.

  9. 学习k8s(二)

    kubernetes-国内拉取gcr.io\quay.io镜像方法 方法1: https://hub.docker.com/r/ibmcom/ 例如: gcr.io/google_containers ...

  10. 学习MFS(二)

    MooseFS,是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理server或单独disk或partition上,确保一份数据有多个备份副本,对于访问MFS的client或use ...