ssm权限管理系统2

本文详细介绍了如何在SSM项目中集成PageHelper进行分页处理,包括添加依赖、配置拦截器和在Service层的使用。接着讨论了SpringSecurity的配置和使用,包括数据库认证的流程,以及在登录、权限控制方面遇到的问题和解决方案。
摘要由CSDN通过智能技术生成

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;
    }
}

简单说一下退出 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值