Shiro安全框架(Shiro与SpringBoot整合开发)授权部分(二)连接数据库

学习SpringBoot使用SpringSecurity(一)_表单登录、角色认证以及SpringSecurity导致CSS样式丢失问题 文章目录一、 环境准备导入依赖创建数据库准备页面index.htmlhome.htmlyml配置文件实体类数据访问层业务层业务层实现类二、UserDetailsService三、WebSecurityConfigBug CSS样式丢失 一、 环境准备 用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。 用户授权指的是验证某个用户是否有权限执行某个操作。 spring security的主要核心功能为 认证和授权,所有的权限架构也是基于这两个核心功能去实现的。  “认证”,是为 阅读详情

一、思路设计整合

我们之前已经为大家展示了一下shiro授权数据在Realm中的简单实现,那这时我们就要将shiro的授权数据持久化至数据库中去,因为我们将来一个系统一定是有很多用户,并且也是拥有很多角色的,我们的授权数据不可能总是在Realm中写,所以这时,我们就要将授权数据持久化进数据库中去。接下来就简单分析一下思路。

首先,我们要实现从数据库中获取权限信息,那么第一件事就是要设计表结构,我们有这样几种设计思路:

第一种模式: 用户  ---------->  角色  ---------->  权限  --------->  资源url

第二种模式:用户  ----------->  角色

第三种模式:用户  ----------->  权限

 

这里我们就以第一种模式来实现权限控制,首先是权限控制的思维导图:

这里我们的思路就是,一个用户可以拥有多个角色,那反过来一个角色也可以被多个用户拥有,同样的一个角色可以有多个权限,那一个权限也会被多个角色持有,也就是说用户和角色之间的关系是多对多的,角色和权限也是多对多的,为了将来我们从数据库取用户的权限(也就是说要将多对多处理为两个一对多),我们还需要两张用户和角色之间的中间关系表,也需要角色和权限字符串之间的角色权限表。所以说其实在权限的数据库表设计方面,我们一定是要站在多个角度来设计数据库表的。

二、数据库表设计

1.表设计

那么我们就开始设计表了,首先是角色表:

表名:t_role

id,角色名称

接着是权限表:

表名:t_perms

id,权限名称

然后再来创建用户与角色的中间表:
       表名:t_user_role

再之后是角色权限的中间表:

表名:t_role_perms

五张表总览:

2.表中角色初始化

好了,那么我们接下来为角色表:t_role 初始化几个角色信息:

这里我们设计一共三种角色,第一个是admin,是最大的权限,然后分别再设计两个user和product角色。

然后我们再来填充t_user和t_role两张表的中间表t_user_role:

id是中间表自己的id,user_id是user表中的id,role_id是role表中的id。

由上面的中间表可以看出来,一号用户拥有一号权限,二号用户拥有二号和三号权限

我们再回头来看一下t_user表中的数据;

通过表中的数据可以看出来,日后我们如果根据admin用户查的话他是一号权限,也就是admin权限,如果根据zhangsan查的话就是二号和三号权限。

数据和表都搞好之后,我们就可以来搞一下代码了:

三、代码中的实现

首先是实体类:

权限字符串:Perms:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Perms {
    private String id;
    private String name;
}

角色Role:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Role {
    private String id;
    private String name;
}

在User实体类中我们再定义一个角色的集合:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class User implements Serializable {
    private String id;
    private String username;
    private String password;
    private String salt;

    //定义角色集合
    private List<Role> roles;
}

在DAO接口中再新定义一个方法(findRolesByUsername):

@Mapper
public interface UserDao {
    /**
     * 用户注册接口
     *
     * @param user
     */
    void save(User user);

    /**
     * 根据用户名查询用户信息
     *
     * @param username
     * @return
     */
    User findByUsername(String username);

    /**
     * 根据用户名查询角色信息
     * @param username
     * @return
     */
    User findRolesByUsername(String username);

}

对应DAO层的方法在XML中写SQL语句(findRolesByUsername):

    <resultMap id="userMap" type="com.csdn.springboot_shiro_jsp_demo_1.login.pojo.User">
        <id column="uid" property="id"/>
        <result column="username" property="username"/>
        <!--角色信息-->
        <collection property="roles" javaType="list" ofType="com.csdn.springboot_shiro_jsp_demo_1.login.pojo.Role">
            <id column="id" property="id"/>
            <result column="rolename" property="name"/>
        </collection>
    </resultMap>
    <select id="findRolesByUsername" parameterType="String" resultMap="userMap">
        SELECT u.id uid,u.username,r.id,r.rolename FROM t_user u
        LEFT JOIN t_user_role ur
        ON u.id = ur.user_id
        LEFT JOIN t_role r
        ON r.id = ur.role_id
        WHERE u.username = #{username}
    </select>

接着是业务层Service:

    /**
     * 根据用户名查询角色信息
     * @param username
     * @return
     */
    User findRolesByUsername(String username);

业务层实现类Impl:

/**
     * 根据用户名查询角色信息
     * @param username
     * @return
     */
    @Override
    public User findRolesByUsername(String username) {
        User rolesByUsername = userDao.findRolesByUsername(username);
        return rolesByUsername;
    }

业务层写完之后,我们就要来自定义Realm来完成授权的实现:

/**
 * 自定义Realm
 */
public class MyRealm extends AuthorizingRealm {
    /**
     * 授权
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //首先拿到用户的主身份信息
        String primaryPrincipal = (String) principalCollection.getPrimaryPrincipal();
        //用获取容器中对象的工具类拿到userService对象
        UserService userService = (UserService) ApplicationContextUtils.getBean("userService");
        //拿到一个用户对象
        User user = userService.findRolesByUsername(primaryPrincipal);
        //使用CollectionUtils方法判空,如果roles集合非空说明有角色信息
        if (!CollectionUtils.isEmpty(user.getRoles())){
            SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
            //遍历角色集合之后添加角色字符串
            user.getRoles().forEach(role -> simpleAuthorizationInfo.addRole(role.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 = (UserService) ApplicationContextUtils.getBean("userService");
        //调用方法拿到user对象
        User user = userService.findByUsername(principal);
        //如果user对象不为空
        if (!StringUtils.isEmpty(user)){
            SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(user.getUsername(),user.getPassword(), ByteSource.Util.bytes(user.getSalt()),this.getName());
            return simpleAuthenticationInfo;
        }
        return null;
    }
}

来看一下这段代码,上面的方法就是授权的实现,那么我们来分析一下,同样的,我们再授权的方法中也需要去用到我们在工厂中的业务对象,所以首先是拿到工厂的业务对象,然后拿业务对象去调用我们的业务层的方法,拿到角色信息,拿到这个角色信息集合之后,首先要判断这个集合不为空,表明是有角色信息,然后我们用Java8的新特性Stream流来遍历这个集合并且在遍历的时候拿到角色信息之后添加角色信息。

好了这一步也完成了之后,为了避免大家忘记我们的页面角色是怎么定义的,我再将页面粘贴出来:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<html>
<head>
    <title>后台管理系统</title>
</head>
<body>
    <h1>系统主页V1.0</h1>
    <ul>
        <shiro:hasRole name="admin">
        <li>物流管理</li>
        <ul>
            <li><a href="">发货时间</a></li>
            <li><a href="">预计送达</a></li>
            <li><a href="">承运单位</a></li>
        </ul>
        <li>订单管理</li>
        <ul>
            <li><a href="">订单新增</a></li>
            <li><a href="">订单删除</a></li>
            <li><a href="">订单修改</a></li>
        </ul>
        <li>商品管理</li>
        <ul>
            <li><a href="">商品新增</a></li>
            <li><a href="">商品删除</a></li>
            <li><a href="">商品修改</a></li>
        </ul>
        </shiro:hasRole>
        <shiro:hasAnyRoles name="user,admin">
        <li>用户管理</li>
        <ul>
            <shiro:hasPermission name="user:add:*">
            <li><a href="">用户新增</a></li>
            </shiro:hasPermission>
            <shiro:hasPermission name="user:delete:*">
            <li><a href="">用户删除</a></li>
            </shiro:hasPermission>
            <shiro:hasPermission name="user:update:*">
            <li><a href="">用户修改</a></li>
            </shiro:hasPermission>
        </ul>
        </shiro:hasAnyRoles>
    </ul>
    <a href="${pageContext.request.contextPath}/user/logout">用户登出</a>
</body>
</html>

可以看到我们的页面是admin和user权限是可以看到用户管理,只有admin能看到其他模块。然后我们再来看一下数据库我们的角色和用户的对应关系:

首先我们来看一下zhangsan用户的角色信息:

可以看到zhangsan拥有的权限为user和product角色

然后是admin用户的角色信息:

通过关联查询我们可以看到,zhangsan的角色信息是user和product,admin的角色信息为admin

然后我们来测试一下:

ok首先是admin登录,它的角色也是admin:

好的,然后是zhangsan用户登录:

好的,和我们预想的效果一样,这就是我们预期的,从数据库中获取角色信息的简单实现。

SpringbootSecurity登陆验证(前后端分离) 从前端页面输入账号向后端发送跨域请求,后端接受参数验证是否在数据库中存在,如果存在就去把用户在数据库中的角色权限和资源权限查出来,保存在Security中.登陆成功后就把用户的信息用JWTUtil.createToken()方法生成token,返回给前端,前端拿到token,前端再次向后端发起请求时携带token,后端识别,如果正确的话就放行,不正确就访问失败。 阅读详情

相关推荐

springboot整合spring security安全框架-简单验证账号密码

springboot整合spring security安全框架-简单验证账号密码 常用于简单的快速配置登录账号密码。例如swagger登录等 1.pom文件引入依赖 <!--spring security 权限框架 配置登录账户密码--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security&

闲走天涯的博客 1194

springboot3整合SpringSecurity实现登录校验与权限认证(万字超详细讲解)

用户提交登录请求Spring Security 将请求交给 UsernamePasswordAuthenticationFilter 过滤器处理。UsernamePasswordAuthenticationFilter 获取请求中的用户名和密码,并生成一个 AuthenticationToken 对象,将其交给 AuthenticationManager 进行认证。

2301_78646673的博客 3万+

SpringBoot整合Shiro

Shiro是一个开源的Java安全框架,它提供了身份认证、授权、加密和会话管理等功能,可以帮助我们快速地构建安全可靠的应用程序。

whs_8792的博客 1224

springboot+springSecurity+thymleaf 实现页面登录拦截案例

登录页面 登录成功,角色为role1,可以设计不同的角色,能够显示不同的角色信息。 springSecurity执行原理 security流程主要由过滤器链组成,其中比较要的过滤器由AbstractAuthenticationProcessingFilter,它的作用是帮助我们验证用户权限和密码的正确。 UsernamePasswordAuthenticationFilter是其的子类,用户验证流程如下所示。 部分源码 public abstract class Abs..

qq_17236715的博客 947

Springboot整合Shiro之授权

  本文我们来介绍SpringBoot整合Shiro来实现授权的操作 一、注解的使用方式 1.配置类修改   在权限校验的时候,我们一般在控制中通过注解来实现权限的校验,但我们需要放开注解的使用,在配置文件中的使用方式如下: 对应的在配置类中的设置如下: /** * 开启授权注解使用方式 * @param manager * @return */ @Bean public Authori...

波波烤鸭的博客 1万+

Spring Boot与Shiro整合全面指南

本文还有配套的精品资源,点击获取 简介:本指南详细介绍了如何将Apache Shiro安全框架与Spring Boot相结合,实现完整的权限管理和用户认证授权功能。通过整合步骤的详细说明,包括依赖引入、配置、编码实现认证授权逻辑、安全管理器配置以及前端集成等,旨在帮助开发者快速构建安全且高效的应用程序。文章还涵盖了认证流程、授权流程、异常处理、会话管理以及数据库设计等关键点...

weixin_35755640的博客 1543

Shiro安全框架——【快速入门、登录拦截、用户认证、请求授权】

一、Shiro简介: Apache Shiro是一个Java的安全(权限)框架。 Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。Shiro可以完成,认证,授权,加密,会话管理,Web集成,缓存等。 官网地址:Apache Shiro | Simple. Java. Security. shiro功能: Authentication:身份认证、登录,验证用户是不是拥有相应的身份; Authorization:授权,即权限验证,验证.

龍弟-idea的博客 6841

YOLOv11 改进策略 | HWD:引入 Haar 小波变换,减少信息丢失

在卷积神经网络(CNN)中,下采样(Downsampling)是降低特征图分辨率、扩大感受野的关键操作,通常通过最大池化(MaxPool)或步长为 2 的卷积(Strided Convolution)实现。然而,这些方法在降低分辨率的同时,往往会丢失图像中的高频细节信息(如边缘、纹理)和精确的空间位置信息,这可能对后续特征提取和目标检测精度产生不利影响,尤其是对于小目标和需要精细定位的任务。

走向CTO的路上... 1788

SpringBoot与Shiro整合

本文章介绍了Spring boot下shiro与thymeleaf、mybatis的整合过程,Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理

fangliangke的博客 6521

HCIA重点知识

华为认证ICT工程师,是华为认证体系中用于标识个人能力在某一技术领域达到工程师级别的证明,表示通过认证的人员具备安装、配置、运行 ICT 设备,并进行基础故障排除的能力。抽象语言 -----> 编码 -----> 二进制 -----> 电信号 -----> 处理电信号信号的转换标准:协议,是一种允许电子设备相互交流的一系列标准的规则。即开放系统参考模型OSI/RM,简称“OSI”。OSI参考模型将计算机网络分为七个层次,自上而下依次为:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。1、应用层:

Awen0201的博客 2542

历年CSP-J(NOIP普及组)考点分析与分类汇总(纯干货)

noip/csp-j历年真题考点分类

weixin_42358969的博客 1万+

SpringBoot集成Shiro安全框架

SpringBoot集成Shiro安全框架欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入...

qq_33922980的博客 5393

ANSYS MAXWELL内置式永磁同步电机(IPMSM)转矩最大时输入电流相位的确定

1.在转子转速为零时看一个周期内的转矩变化

qq_41752507的博客 6516

SpringBoot 整合 Shiro 安全框架完成用户认证和授权功能

SpringBoot 整合 Shiro 安全框架完成用户认证和授权功能1. Apache Shiro1.1 Shiro 简介1.2 Shiro 功能结构图1.3 Shiro 外部结构1.4 Shiro 内部结构2. 案例实现2.1 sql 文件代码2.2 maven 工程 pom 文件配置2.3 domain 包下的实体对象2.3.1 用户对象 User2.3.2 角色对象 Role2.3.3 权限对象 Permission2.4 dao 包下的接口2.4.1 用户接口 UserDao2.5 service

华仔仔的博客 2704

星网锐捷语音网关密码重置恢复出厂设置

星网锐捷语音网关---密码重置 第一种星网锐捷SVX网关恢复出厂设置的方法 eth1口 任意口插网线,连接电脑并设置电脑固定ip为: 一, 二 网页输入: 192.168.88.86 admin 默认密码 admin 登陆。 忘记密码 可通过以下方法重置: 三: 通过crt或者 shell工具 ,连接 root@192.168.88.86 连续输入两次 passwd a12345678 reboot重启后。通过账号 密码 a12345678 即可登陆系...

cibazhanji2176的博客 1万+

哈工大2021年秋季学期数据结构期末试题

因为考完试没有收演草纸,所以题中数据与考试差距不大。选项顺序可能略有差异;选择第5题希尔排序的序列数据是后编的;简答第3题B-树的插入序列顺序可能不同,但是考察的点是一样的。其他题的数据基本可以保证和原题一样。 一、选择题 111.以下代码的时间复杂度是 for(int k=1;k<=n;k++) for(int j=1;j<=n;j++) count++; A.O(n)       B.O(nlogn) &

Castria的博客 4271

SpringBoot从零整合轻量安全框架Shiro

Apache Shiro是一个简单、灵活且强大的Java安全框架,用于提供身份验证、授权、加密和会话管理等安全功能。它的设计理念是无侵入性,使得它可以轻松地与任何Java应用程序集成。Shiro提供了一系列内建的安全组件,如Subject(表示当前用户)、SecurityManager(管理所有安全操作)、Realm(与安全数据交互)等。通过这些组件,开发者可以快速实现用户身份验证、授权和会话管理。Shiro还提供了灵活的插件机制和可扩展的API,支持自定义功能和数据源集成。

Alaiks的博客 2860

DTI-ALPS 指标计算(附代码),评估脑类淋巴系统功能

DTI-ALPS 指标计算(附代码),评估脑类淋巴系统功能

xxx 1046

Shiro安全框架(Shiro与SpringBoot整合开发)

一、整合的思路 继上次说完了Shiro中的授权之后,Shiro中的认证和授权就全部为大家讲解完了,相信大家是跟着前两篇文章看过来的对Shiro在程序中进行认证和授权的操作都已经略知一二了,下面就为大家讲解一下Shiro在SpringBoot中的应用整合,同时在之前我们做的认证授权都是在代码中硬编码直接写死的,而在我们这次与SpringBoot的整合开发中,将会使用数据库中的数据来替代代码中的数据,更加真实的模拟我们日常在工作中对权限控制开发。 首先我们不论是开发任何功能,都是要对需求和思路进...

JavaJieRui的博客 2178

SWC_RTE01-AutoSAR架构【AutoSAR架构设计概述】

1 基于AutoSAR架构的概述 1.1架构层面:功能可以细分子功能,各个子功能需要交互。 -大功能可以通过Autosar组件Composition去表示; -各个子功能一般具有不可分割性,可以通过Autosar原子组件Component去表示; -各个子功能的交互可以通过接口去通信和交互; -各个子功能的行为可以通过内部行为去表示;具体表现为Runnable的设计;架构设计的时候不考虑具体的逻辑实现;只会关注Ruannble的触发事件或周期;数据访问的一致性问题;具体逻辑设计可通过模版c文件实现或通过基于

8450

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【SpringBoot整合系列】SpringBoot整合Shiro——权限控制

SpringBoot整合Shiro权限控制

低调做人,低调编码,神码都是浮云 2452

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

springboot整合shiro

/认证@OverrideSystem.out.println("执行了-->认证");

abfwaaf的博客 1219

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Shiro安全框架(Shiro与SpringBoot整合开发)授权部分(一)编码

对于shiro框架我们之前已经分别叙述了shiro在.ini文件中的认证,shiro代码中硬编码的认证实现,以及我们将shiro与springboot整合的认证实现,还有我们将shiro与springboot整合之后,连接数据库的认证实现,接下来我们继续为大家展开来研究一下shiro与springboot整合之后连接数据库的授权方面的实现,其实与之前shiro连接数据库做认证的实现思路相似,我们也首先来理一下思路。 一、关于shiro与springboot整合的授权实现思路 首先,shiro这个安全框架

JavaJieRui的博客 408

SpringBoot整合Shiro框架

目录 1、Shiro简介 1.1、Shiro是什么? 1.2、有哪些功能? 1.3、Shiro架构(外部) 2、快速入门(QuickStartShiro) 2.1、项目结构 2.2、导入shiro依赖,这是我的pom所有依赖。(pom.xml) 2.3、相关配置文件 (1)log4j.properties——官网 (2)shiro.ini——官网 (3)启动类 Quickstart——官网 3、SpringBoot集成Shiro框架 3.1SpringBoot整合Shir...

koko创作 8906

Springboot整合shiro

是一款主流的Java安全框架,不依赖任何容器,可以运行在Java SE和Java EE项目中,它的主要作用是对访问系统的用户进行身份认证、授权、会话管理、加密等操作。Shiro 就是用来解决安全管理的系统化框架。Shiro是基于session的身份认证和访问控制框架。RBAC是Role-Based Access Control(基于角色的访问控制)的缩写。它是一种广泛应用于安全管理中的访问控制模型。RBAC模型通过授予用户不同的角色,并将角色与权限进行关联,来管理对资源的访问。

chao的博客 2797
上一篇: Shiro安全框架(Shiro与SpringBoot整合开发)授权部分(一)编码
下一篇: Shiro安全框架(Shiro与SpringBoot整合开发)授权部分(三)权限实现
JavaJieRui
博客等级 码龄7年 10粉丝 19原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值