Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02
代码延续地址: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的更多相关文章
- Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01
这个小项目包含了注册与登录,使用了springboot+mybatis+shiro的技术栈:当用户在浏览器登录时发起请求时,首先这一系列的请求会被拦截器进行拦截(ShiroFilter),然后拦截器根 ...
- Shiro+springboot+mybatis+EhCache(md5+salt+散列)认证与授权-03
从上文:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02 当每次进行刷新时,都会从数据库重新查询数据进行授权操作,这样无疑给数据库造成很大的压力,所以需要引入 ...
- SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理(上)----筑基中期
写在前面 通过前几篇文章的学习,我们从大体上了解了shiro关于认证和授权方面的应用.在接下来的文章当中,我将通过一个demo,带领大家搭建一个SpringBoot整合Shiro的一个项目开发脚手架, ...
- SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理|前后端分离(下)----筑基后期
写在前面 在上一篇文章<SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理(上)----筑基中期>当中,我们初步实现了SpringBoot整合Shiro ...
- MD5随机散列加密算法
项目中需要在登录验证用户名.密码的时候对密码进行加密处理,由于是比较商业化的软件,所以安全方面还是必须要考虑的.而使用MD5随机散列加密算法使得密码加密后不可逆,很大程度上提升了安全性.废话不多说,看 ...
- 加密算法和MD5等散列算法的区别(转)
本文转自http://www.cnblogs.com/eternalwt/archive/2013/03/21/2973807.html 感谢作者 1.在软件开发的用户注册功能中常出现MD5加密这个概 ...
- SpringBoot + SpringSecurity + Mybatis-Plus + JWT实现分布式系统认证和授权
1. 简介 Spring Security是一个功能强大且易于扩展的安全框架,主要用于为Java程序提供用户认证(Authentication)和用户授权(Authorization)功能. ...
- shiro+springboot分析思路
文章目录 前言 一.为什么要使用shiro 二.使用步骤 1.如何认证和授权 2.如何获取数据 总结 前言 shiro和spring security等安全框架可以用户管理和权限认证 一.为什么要使用 ...
- SpringBoot + SpringSecurity + Mybatis-Plus + JWT + Redis 实现分布式系统认证和授权(刷新Token和Token黑名单)
1. 前提 本文在基于SpringBoot整合SpringSecurity实现JWT的前提中添加刷新Token以及添加Token黑名单.在浏览之前,请查看博客: SpringBoot + Sp ...
随机推荐
- 比较 Java 静态工厂方法与构造函数
1 什么是静态工厂方法 Java 静态工厂方法是在方法前加上 public static,让这个方法变为公开.静态的方法.该方法返回该类的一个实例,就好像一个工厂生产出一个产品.所以称之为静态工厂方法 ...
- jdbc action 接口示例
package com.gylhaut.action; import java.sql.SQLException;import java.util.ArrayList;import java.util ...
- 装饰器property的简单运用
property函数:在类中使用,将类中的方法伪装成一个属性 使用方法:在函数,方法,类的上面一行直接@装饰器的名字 装饰器的分类: 装饰器函数 装饰器方法:property 装饰类 class St ...
- Adobe AIR 应用程序图标详细描述
官方PDF文档: http://help.adobe.com/zh_CN/air/build/WS901d38e593cd1bac1e63e3d129907d2886-8000.html#WS901d ...
- Vue 项目中常遇到的问题
刷新页面,传的参数类型变了 问题描述 vue-router通过query传参,比如:?fromWork=true&extraType=1,传过去的fromWork是boolean型,extra ...
- Linux 的目录结构是怎样的?
这个问题,一般不会问.更多是实际使用时,需要知道.Linux 文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录:Linux的目录结构常见目录说明: /bin:存放二进制可执行文件(ls,ca ...
- 数组有没有 length()方法?String 有没有 length()方法?
数组没有 length()方法,有 length 的属性. String 有 length()方法.JavaScript中,获得字符串的长度是通过 length 属性得到的,这一点容易和 Java 混 ...
- spring-boot-learning- Elasticsearch
索引==数据库 类型==表 文档==表里面的记录 属性==表里面的列 使用RestFul风格elasticSearch进行操作 添加一个索引为megacorp,类型为employee,--id为1的文 ...
- git-learningmeiy
什么是版本控制-版本迭代: 版本控制(Revision control)是一种在开发的过程中用于管理我们对文件.目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术. ...
- SpringBoot集成SpringBootDataElasticSearch
先放出依赖: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri ...