ssm权限管理系统2

news2025/1/13 11:55:15

PageHelper

 

 直接使用maven在pom.xml中添加依赖就行

 在我们这个ssm管理项目中,已经添加了依赖包

 在Springp配置文件中配置拦截器插件

 

 正式使用

 我们只需要在调用dao的方法之前插入如下语句就行,也就是说在service层里面进行插入

当然了上面的pageNum与pageSize是我们从前端传过来的,我们需要通过这个fandAll方法传入

 

 然后去处理一下Controller控制器里面的代码

 这里我们去看一下PageInfo这个对象

 

 然后我们去处理一下前端页面

前端页面需要修改两个页面,一个是导航栏,订单查询的地方,需要传入页码与每一页显示的条路,否则会报错

 

然后去修改订单展示页面,也就是order-list.jsp页面

先来看数据展示的部分,之前传过来的是一个ordersList的属性,然后去访问,但是现在传过来的是一个PageInfo对象

改动位置:

 

 每页显示几条数据也需要改动

 在这个页面下面有一个js函数,我们可以去看一下

 根据这个页面记性修改

 下面把分页的代码做一些改动

其实,分页数据的改动,主要就是拿到PageInfo里面的属性信息

先来看首页,就是第一页 

 

 

 

中间展示页面

 

肯定采用的是jstl标签的形式获取,因为这部分不是固定的

 

 

 然后是尾页

这里直接贴上所有代码

 刚刚做下拉框页面展示的时候发现有点问题

这样修改一下,就可以获取了 

 下面说一下权限操作

表的结构分析与创建

下面直接上sql语句

CREATE TABLE users(
id varchar2(32) default SYS_GUID() PRIMARY KEY,
email VARCHAR2(50) UNIQUE NOT NULL,
username VARCHAR2(50),
PASSWORD VARCHAR2(50),
phoneNum VARCHAR2(20),
STATUS INT
)


CREATE TABLE role(
id varchar2(32) default SYS_GUID() PRIMARY KEY,
roleName VARCHAR2(50) ,
roleDesc VARCHAR2(50)
)

CREATE TABLE users_role(
userId varchar2(32),
roleId varchar2(32),
PRIMARY KEY(userId,roleId),
FOREIGN KEY (userId) REFERENCES users(id),
FOREIGN KEY (roleId) REFERENCES role(id)
)


CREATE TABLE permission(
id varchar2(32) default SYS_GUID() PRIMARY KEY,
permissionName VARCHAR2(50) ,
url VARCHAR2(50)
)


CREATE TABLE role_permission(
permissionId varchar2(32),
roleId varchar2(32),
PRIMARY KEY(permissionId,roleId),
FOREIGN KEY (permissionId) REFERENCES permission(id),
FOREIGN KEY (roleId) REFERENCES role(id)
)

 下面分别把上面表对应的实体类创建好

UserInfo

Role

 

Permission 

 

 Spring Security介绍

Spring提供的安全认证服务框架 

 

Spring Security快速入门

1.在pom.xml导入相关依赖

   

2.web.xml文件中创建filter

 加载spring-security.xml的核心配置文件

3.spring security核心配置文件配置

通过核心配置文件 

 spring-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:security="http://www.springframework.org/schema/security"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
    <!-- 配置不过滤的资源(静态资源及登录相关) -->
    <security:http security="none" pattern="/login.html" />
    <security:http security="none" pattern="/failer.html" />
    <security:http auto-config="true" use-expressions="false" >
        <!-- 配置资料连接,表示任意路径都需要ROLE_USER权限 -->
        <security:intercept-url pattern="/**" access="ROLE_USER" />
        <!-- 自定义登陆页面,login-page 自定义登陆页面 authentication-failure-url 用户权限校验失败之后才会跳转到这个页面,如果数据库中没有这个用户则不会跳转到这个页面。
            default-target-url 登陆成功后跳转的页面。 注:登陆页面用户名固定 username,密码 password,action:login -->
        <security:form-login login-page="/login.html"
                             login-processing-url="/login" username-parameter="username"
                             password-parameter="password" authentication-failure-url="/failer.html"
                             default-target-url="/success.html" authentication-success-forward-url="/success.html"
        />

        <!-- 关闭CSRF,默认是开启的 -->
        <security:csrf disabled="true" />
    </security:http>
    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user name="user" password="{noop}user"
                               authorities="ROLE_USER" />
                <security:user name="admin" password="{noop}admin"
                               authorities="ROLE_ADMIN" />
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>
</beans>

 Spring Security使用数据库认证

 

 

 

 

使用Spring security来完成认证的流程

 登录代码实现1

 第一步:在pom.xml里面导入依赖

这里面的依赖基本上已经导入了

第二步:在web.xml 配置一下过滤器

服务器启动,加载配置文件

配置Spring的安全过滤器 

 

第三步:在resources里面引入spring-security.xml的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:security="http://www.springframework.org/schema/security"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security.xsd">

    <!-- 配置不拦截的资源 -->
    <security:http pattern="/login.jsp" security="none"/>
    <security:http pattern="/failer.jsp" security="none"/>
    <security:http pattern="/css/**" security="none"/>
    <security:http pattern="/img/**" security="none"/>
    <security:http pattern="/plugins/**" security="none"/>

    <security:http auto-config="true" use-expressions="false">
    <!-- 配置具体的拦截的规则 pattern="请求路径的规则" access="访问系统的人,必须有ROLE_USER的角色" -->
    <security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>

    <!-- 定义跳转的具体的页面 -->
    <security:form-login
            login-page="/login.jsp"
            login-processing-url="/login.do"
            default-target-url="/index.jsp"
            authentication-failure-url="/failer.jsp"
            authentication-success-forward-url="/pages/main.jsp"
    />
    </security:http>

    <!-- 切换成数据库中的用户名和密码 -->
    <security:authentication-manager>
        <!--因为我们要去用service,表示用哪一个service-->
        <security:authentication-provider user-service-ref="userService">
            <!-- 配置加密的方式
            <security:password-encoder ref="passwordEncoder"/>-->
        </security:authentication-provider>
    </security:authentication-manager>



</beans>

 下面去把Spring-security需要访问的service给做了

说白了这个认证器会去调用它默认的一个service对象

内部存在一个固定的方法

 

我们这个时候指明了这个UserServiceImpl对象的名字

 

但是现在dao层还没有对象存在,因为service还是通过dao来调用方法进行查询的,那我们去做一个关于User的dao接口

 下面重新修改一下service层里面的方法

来说一下,查看某个类的结构

 这个UserDetails类里面有一个User实现类

 因为Spring-security框架返回的对象是去找UserDetails,也就是它的接口实现对象

 

 

下面我们来运行一下代码

现在先在前端引入两个页面login.jsp与failer.jsp页面

 当服务器一启动,就会进入到我们登录页面,因为Spring-Security已经做了控制

 

下面说一下面对提交路径的问题

本来该去访问控制器的,然后这里控制器被Spring-security所替代了,所以就是去找之前配置的一个service 

 如果就按照以上配置去访问这个页面,会出现一个问题,我们在数据库里面插入几条用户信息

这里说一个小问题,就是字符串数据在插入的时候,要用单引号

我们在登录页面进行登录一下

 不管输入什么,都会提示一个403的forbidden,也就是说,权限错误

其实这里的问题,就是权限不够

去看一下配置文件

 

也就是用户名密码对了也没用 

 

我们追一下这个权限集合

 集合内部存储的数据就是如下,必须是它的子类

 我们看一下类的关系图就能找到这个类

现在去追一下这个类SimpleGrantedAuthority

 

 我们就在UserServiceImpl里面重写写了一个函数

 这个时候,我们要去

数据库里面存几个角色信息,再存之前我们再来分析一把

 

去修改一下dao层的查询方法

 

 现在去完善IRoleDao里面的方法

在做这个sql语句之前,先到数据库里面插入一些数据

 

 向用户表与角色表里面添加相应的信息

下面是角色表 

下面是用户表

 

 然后在插入关联表

 现在再去处理一下IRoleDao里面的查询语句

 然后再去处理Spring-security里面需要处理的service里面的代码

 同时,我们还要对密码进行一个加密处理

同时我们还必须清楚一点,就是用户有一个状态信息

 

那么怎么通过这个状态限制用户不被登录,我们还是去看一下User这个封装的用户对象,其实想一下都要去找这个User,因为spring-security这个安装框架去访问的用户对象的时候,就是去找UserDetails的实现类

现在去追一下User 这个类

这个类的内部也是给我们调用了一个相同的构造方法

 

 所以我们在service里面我们换一种构造方法来生成我们的User对象

也就是用上面这个,只不过enabled不在默认为true

 

然后现在来重新运行整个代码

 

package com.pxx.ssm.service.impl;

import com.pxx.ssm.dao.IUserDao;
import com.pxx.ssm.domain.Role;
import com.pxx.ssm.domain.UserInfo;
import com.pxx.ssm.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService {

    @Autowired
    private IUserDao userDao;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserInfo userInfo = null;
        try {
            userInfo = userDao.findByUsername(username);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //处理自己的用户对象封装成UserDetails
        //  User user=new User(userInfo.getUsername(),"{noop}"+userInfo.getPassword(),getAuthority(userInfo.getRoles()));
        User user = new User(userInfo.getUsername(), "{noop}" + userInfo.getPassword(), userInfo.getStatus() == 0 ? false : true, true, true, true, getAuthority(userInfo.getRoles()));
        return user;
    }

    //作用就是返回一个List集合,集合中装入的是角色描述
    public List<SimpleGrantedAuthority> getAuthority(List<Role> roles) {

        List<SimpleGrantedAuthority> list = new ArrayList<>();
        for (Role role : roles) {
            list.add(new SimpleGrantedAuthority("ROLE_" + role.getRoleName()));
        }
        return list;
    }
}

简单说一下退出 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ssh公钥配置,使用git从github上拉取、上传项目

一、ssh公钥配置若在以下某个步骤出现问题&#xff1a;Please make sure you have the correct access rights and the repository exists 则按本节方法重新配置ssh。删除C:\Users\Administrator\.ssh下的所有文件在桌面右击&#xff0c;选择Git Bash Here# 1.设置用户名 git c…

万字讲解Linux常用指令

目录 前言&#xff1a; 一、Linux界面问题 二、什么是操作系统 三、为什么学习Linux基本指令 四、Linux基础指令 pwd命令 ls指令 认识一下ls -a&#xff1a; 认识一下ls -d&#xff1a; 理解文件 cd指令 4.touch指令 5.mkdir指令 6.rmdir指令和rm指令 7.man指令 8.cp指令 9.mv指…

自动驾驶中3D目标检测综述

1 背 景 1.1 3D目标检测 3D目标检测是通过输入传感器数据&#xff0c;预测3D目标的属性信息的任务。如何表示3D目标的属性信息是关键&#xff0c;因为后续的预测和规划需要这些信息。在大部分情况下&#xff0c;3D目标被定义为一个立方体&#xff0c;(x,y,z)是立方体的中心坐…

stm32mp1 uboot启动流程分析

stm32mp1 uboot启动流程分析 本节主要关注uboot启动linux的流程&#xff0c;首先关注下uboot的环境变量 uboot环境变量 进入uboot以后回车输入print即可看到uboot的所有环境变量&#xff1a; 这里很多变量嵌套了一些流程&#xff0c;整理一下格式&#xff1a; altbootcmdru…

实现系统调用

文章目录前言前置知识实验操作实现一实验二实验三实验四实验五前言 博客记录《操作系统真象还原》第十二章实验的操作~ 实验环境&#xff1a;ubuntu18.04VMware &#xff0c; Bochs下载安装 实验内容&#xff1a; 实现系统调用。实现write系统调用。实现printf。 3.1 仅支持…

Simulink 自动代码生成电机控制:关于无传感控制开环启动控制的仿真和开发板运行

目录 开环启动原理 开环启动建模实现 开环启动仿真 代码生成和验证 总结 开环启动原理 永磁同步电机开环三步启动是比较传统也是比较常用的启动方式&#xff0c;典型的启动有&#xff1a; 对齐&#xff1a;也说是说的转子预定位&#xff0c;就是通过手动给定一个初始角度…

mybatis 初始化加载xml解析

一、标题解析xml 的三大对象&#xff1a;XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder XMLConfigBuilder 会把mybatis-config.xml所有元素进行解析。当碰到mappers时&#xff0c;会进行遍历。mappers中有几个mapper&#xff0c;就会创建几个XMLMapperBuilder 去进…

【Day3】链表理论基础、203移除链表元素、707设计链表、206反转链表

【Day3】链表理论基础、203移除链表元素、707设计链表、206反转链表链表理论基础链表的类型链表的存储方式链表的定义链表的操作203 移除链表元素设置虚拟头节点无虚拟头节点707设计链表206反转链表双指针法递归法while和for链表理论基础 链表是一种通过指针串联在一起的线性结…

C++版Android实时投屏软件系统源码,安卓手机投屏软件源码,无需root权限

QtScrcpy QtScrcpy 可以通过 USB / 网络连接Android设备&#xff0c;并进行显示和控制。无需root权限。 同时支持 GNU/Linux &#xff0c;Windows 和 MacOS 三大主流桌面平台。 完整代码下载地址&#xff1a;C版Android实时投屏软件系统源码 它专注于: 精致 (仅显示设备屏幕…

sentence-transformers(SBert)中文文本相似度预测(附代码)

前言 训练文本相似度数据集并进行评估&#xff1a;sentence-transformers(SBert)预训练模型&#xff1a;chinese-roberta-wwm-ext数据集&#xff1a;蚂蚁金融文本相似度数据集前端&#xff1a;Vue2elementuiaxios后端&#xff1a;flask 训练模型 创建网络&#xff1a;使用Sb…

c语言公司考勤系统

1.要求 考勤系统是公司人事管理重要环节&#xff0c;用于记录员工迟到、早退、缺席、请假等出勤情况&#xff0c;并能提供数据统计功能。系统需求如下: 认证用户&#xff0c;如密码方式; 设置上下班时间&#xff0c;并能判断是否迟到、早退; 记录出勤状况&#xff0c;能记录每日…

基础IO(2)--文件描述符以及输入输出重定向

文件描述符fd 文件操作的本质是进程和被打开文件的关系。 进程可以打开多个文件&#xff0c;这些被打开的文件由OS管理&#xff0c;所以操作系统必定要为文件创建对应的内核数据结构标识文件–struct file{}【与C语言的FILE无关】 通过如下程序 #include <stdio.h> #…

uni-app在真机调试下兼容ethers的方法

目录 一、安装ethers 二、renderjs 三、注意事项 uni-app开发跨平台应用程序&#xff0c;项目搭建主要前端框是Uni-app Vue3 TS Vite&#xff0c;项目搭建参考文章Uni-app Vue3 TS Vite 创建项目 Hbuilderx版本是3.6.17 一、安装ethers yarn add ethers 如果像ether…

【Python】用xpath爬取2022热梗保存到txt中并生成词云

本文收录于《python学习笔记》专栏&#xff0c;这个专栏主要是我学习Python中遇到的问题&#xff0c;学习的新知识&#xff0c;或总结的一些知识点&#xff0c;我也是初学者&#xff0c;可能遇到的问题和大部分新人差不多&#xff0c;在这篇专栏里&#xff0c;我尽可能的分享出…

MySQL 索引 学习

索引 主键索引&#xff08;PRIMARY KEY&#xff09; 唯一标识&#xff0c;主键不可重复&#xff0c;只能有一个主键 唯一索引&#xff08;UNIQUE KEY&#xff09; 索引列 常规索引&#xff08;KEY/INDEX&#xff09;全文索引&#xff08;FullText&#xff09; 可以快速定位数据…

excel拆分技巧:如何快速对金额数字进行分列

金额数字分列&#xff0c;相信是做财务的小伙伴们经常遇到的问题。网上关于金额数字分列的方法很多&#xff0c;但用到的公式大都比较复杂。今天我们就来分享一个最简单的公式&#xff0c;仅用LEFT、RIGHT和COLUMN三个函数&#xff0c;就能达到效果&#xff01;在财务工作中&am…

Tapdata Cloud 场景通关系列:将数据导入阿里云 Tablestore,获得毫秒级在线查询和检索能力

【前言】作为中国的 “Fivetran/Airbyte”, Tapdata Cloud 自去年发布云版公测以来&#xff0c;吸引了近万名用户的注册使用。应社区用户上生产系统的要求&#xff0c;Tapdata Cloud 3.0 将正式推出商业版服务&#xff0c;提供对生产系统的 SLA 支撑。Tapdata 目前专注在实时数…

【论文阅读 CIKM2014】Extending Faceted Search to the General Web

文章目录ForewordMotivationMethodQuery facet generation:Facet feedbackEvaluationForeword This paper is from CIKM 2014, so we only consider the insightsI have read this paper last month and today i share this blogThere are many papers that have not been sha…

Docker网络原理详解

文章目录理解Docker0Docker 是如何处理容器网络访问的&#xff1f;Docker0网络模型图容器互联--Link自定义网络网络连通理解Docker0 查看本机IP ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00…

application.properties的作用

springboot这个配置文件可以配置哪些东西 官方配置过多了解原理 这个properties文件其实是可以删掉的&#xff0c;官方是不推荐使用这个文件的&#xff0c;可以将其换成安排application.yaml。名字不能变&#xff0c;因为SpringBoot使用的是一个全局的配置文件 application.…