五、综合练习——SSM整合案例【企业权限管理系统】

企业权限管理系统项目地址: https://gitee.com/wangren2020/kejizhentan-ssm.git

一、前端AdminLTE介绍

AdminLTE是一款建立在bootstrap和jquery之上的开源的模板主题工具,它提供了一系列响应的、 可重复使用的组件,并内置了多个模板页面;同时自适应多种屏幕分辨率,兼容PC和移动端。通 AdminLTE,我们可以快速的创建一个响应式的Html5网站。AdminLTE框架在网页架构与设计上,有很大的辅助作用,尤其是前端架构设计师,用好AdminLTE 不但美观,而且可以免去写很大 CSS与JS的工作量。
具体内容请查看github上面的代码:https://github.com/almasaeed2010/AdminLTE

二、SSM综合练习介绍

1. 功能介绍

主要讲解maven工程搭建,以及基于oracle数据库的商品表信息,并完成SSM整合。

1.2 商品查询

基于SSM整合基础上完成商品查询,要掌握主面页面main.jsp及商品显示页面product-list.jsp页面的创建。

1.3 商品添加

进一步巩固SSM整合,并完成商品添加功能,要注意事务操作以及product-add.jsp页面生成。

1.4 订单查询

订单的查询操作,它主要完成简单的多表查询操作,查询订单时,需要查询出与订单关联的其它表中信息,所以大家一定要了解订单及其它表关联关系

1.5 订单分页查询

订单分页查询,我们使用的是mybatis分页插件PageHelper,要掌握PageHelper的基本使用。

1.6 订单详情查询

订单详情是用于查询某一个订单的信息,这个知识点主要考核学生对复杂的多表查询操作的掌握。

1.7 Spring Security 概述

Spring Security是 Spring 项目组中用来提供安全认证服务的框架,它的使用很复杂,我们在课程中只介绍了spring Security的基本操作,大家要掌握spring Security框架的配置及基本的认证与授权操作。

1.8 用户管理

用户管理中我们会介绍基于spring Security的用户登录、退出操作。以及用户查询、添加、详情有等操作,这些功能的练习是对前期SSM知识点的进一步巩固。

1.9 角色管理

角色管理主要完成角色查询、角色添加

1.10 资源权限管理

资源权限管理主要完成查询、添加操作,它的操作与角色管理类似,角色管理以及资源权限管理都是对权限管理的补充。

1.11 权限关联与控制

主要会讲解用户角色关联、角色权限关联,这两个操作是为了后续我们完成授权操作的基础,关于授权操作我们会在服务器端及页面端分别讲解

1.12 AOP日志处理

AOP日志处理,我们使用spring AOP切面来完成系统级别的日志收集

2.数据库介绍

2.1 产品表

在这里插入图片描述
表结构:

CREATE TABLE product( 
  id varchar2(32) default SYS_GUID() PRIMARY KEY,
  productNum VARCHAR2(50) NOT NULL, 
  productName VARCHAR2(50), 
  cityName VARCHAR2(50),
  DepartureTime timestamp, 
  productPrice Number, 
  productDesc VARCHAR2(500),
  productStatus INT,
  CONSTRAINT product UNIQUE (id, productNum)
);
insert into PRODUCT
  (id,
   productnum,
   productname,
   cityname,
   departuretime,
   productprice,
   productdesc,
   productstatus)
values
  ('676C5BD1D35E429A8C2E114939C5685A',
   'itcast-002',
   '北京三日游',
   '北京',
   to_timestamp('10- 10-2018 10:10:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'),
   1200,
   '不错的旅行',
   1);
insert into PRODUCT
  (id,
   productnum,
   productname,
   cityname,
   departuretime,
   productprice,
   productdesc,
   productstatus)
values
  ('12B7ABF2A4C544568B0A7C69F36BF8B7',
   'itcast-003',
   '上海五日游',
   '上海',
   to_timestamp('25- 04-2018 14:30:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'),
   1800,
   '魔都我来了',
   0);
insert into PRODUCT
  (id,
   productnum,
   productname,
   cityname,
   departuretime,
   productprice,
   productdesc,
   productstatus)
values
  ('9F71F01CB448476DAFB309AA6DF9497F',
   'itcast-001',
   '北京三日游',
   '北京',
   to_timestamp('10- 10-2018 10:10:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'),
   1200,
   '不错的旅行',
   1);

2.2 会员表

在这里插入图片描述
表结构:

CREATE TABLE member( 
  id varchar2(32) default SYS_GUID() PRIMARY KEY, 
  NAME VARCHAR2(20), 
  nickname VARCHAR2(20), 
  phoneNum VARCHAR2(20), 
  email VARCHAR2(20) 
)
insert into MEMBER
  (id, name, nickname, phonenum, email)
values
  ('E61D65F673D54F68B0861025C69773DB',
   '张三',
   '小三',
   '18888888888',
   'zs@163.com');

2.3 订单表

在这里插入图片描述
表结构:

CREATE TABLE orders( 
  id varchar2(32) default SYS_GUID() PRIMARY KEY,
  orderNum VARCHAR2(20) NOT NULL UNIQUE, orderTime timestamp, 
  peopleCount INT, 
  orderDesc VARCHAR2(500), 
  payType INT, 
  orderStatus INT, 
  productId varchar2(32), 
  memberId varchar2(32), 
  FOREIGN KEY (productId) REFERENCES product(id), 
  FOREIGN KEY (memberId) REFERENCES member(id) 
);
insert into ORDERS
  (id,
   ordernum,
   ordertime,
   peoplecount,
   orderdesc,
   paytype,
   orderstatus,
   productid,
   memberid)
values
  ('0E7231DC797C486290E8713CA3C6ECCC',
   '12345',
   to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'),
   2,
   '没什么',
   0,
   1,
   '676C5BD1D35E429A8C2E114939C5685A',
   'E61D65F673D54F68B0861025C69773DB');
insert into ORDERS
  (id,
   ordernum,
   ordertime,
   peoplecount,
   orderdesc,
   paytype,
   orderstatus,
   productid,
   memberid)
values
  ('5DC6A48DD4E94592AE904930EA866AFA',
   '54321',
   to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'),
   2,
   '没什么',
   0,
   1,
   '676C5BD1D35E429A8C2E114939C5685A',
   'E61D65F673D54F68B0861025C69773DB');
insert into ORDERS
  (id,
   ordernum,
   ordertime,
   peoplecount,
   orderdesc,
   paytype,
   orderstatus,
   productid,
   memberid)
values
  ('2FF351C4AC744E2092DCF08CFD314420',
   '67890',
   to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'),
   2,
   '没什么',
   0,
   1,
   '12B7ABF2A4C544568B0A7C69F36BF8B7',
   'E61D65F673D54F68B0861025C69773DB');
insert into ORDERS
  (id,
   ordernum,
   ordertime,
   peoplecount,
   orderdesc,
   paytype,
   orderstatus,
   productid,
   memberid)
values
  ('A0657832D93E4B10AE88A2D4B70B1A28',
   '98765',
   to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'),
   2,
   '没什么',
   0,
   1,
   '12B7ABF2A4C544568B0A7C69F36BF8B7',
   'E61D65F673D54F68B0861025C69773DB');
insert into ORDERS
  (id,
   ordernum,
   ordertime,
   peoplecount,
   orderdesc,
   paytype,
   orderstatus,
   productid,
   memberid)
values
  ('E4DD4C45EED84870ABA83574A801083E',
   '11111',
   to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'),
   2,
   '没什么',
   0,
   1,
   '12B7ABF2A4C544568B0A7C69F36BF8B7',
   'E61D65F673D54F68B0861025C69773DB');
insert into ORDERS
  (id,
   ordernum,
   ordertime,
   peoplecount,
   orderdesc,
   paytype,
   orderstatus,
   productid,
   memberid)
values
  ('96CC8BD43C734CC2ACBFF09501B4DD5D',
   '22222',
   to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'),
   2,
   '没什么',
   0,
   1,
   '12B7ABF2A4C544568B0A7C69F36BF8B7',
   'E61D65F673D54F68B0861025C69773DB');
insert into ORDERS
  (id,
   ordernum,
   ordertime,
   peoplecount,
   orderdesc,
   paytype,
   orderstatus,
   productid,
   memberid)
values
  ('55F9AF582D5A4DB28FB4EC3199385762',
   '33333',
   to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'),
   2,
   '没什么',
   0,
   1,
   '9F71F01CB448476DAFB309AA6DF9497F',
   'E61D65F673D54F68B0861025C69773DB');
insert into ORDERS
  (id,
   ordernum,
   ordertime,
   peoplecount,
   orderdesc,
   paytype,
   orderstatus,
   productid,
   memberid)
values
  ('CA005CF1BE3C4EF68F88ABC7DF30E976',
   '44444',
   to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'),
   2,
   '没什么',
   0,
   1,
   '9F71F01CB448476DAFB309AA6DF9497F',
   'E61D65F673D54F68B0861025C69773DB');
insert into ORDERS
  (id,
   ordernum,
   ordertime,
   peoplecount,
   orderdesc,
   paytype,
   orderstatus,
   productid,
   memberid)
values
  ('3081770BC3984EF092D9E99760FDABDE',
   '55555',
   to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'),
   2,
   '没什么',
   0,
   1,
   '9F71F01CB448476DAFB309AA6DF9497F',
   'E61D65F673D54F68B0861025C69773DB');

2.4 旅客表

在这里插入图片描述
表结构:

CREATE TABLE traveller( 
  id varchar2(32) default SYS_GUID() PRIMARY KEY, NAME VARCHAR2(20), 
  sex VARCHAR2(20), 
  phoneNum VARCHAR2(20), 
  credentialsType INT, 
  credentialsNum VARCHAR2(50), 
  travellerType INT 
)

insert into TRAVELLER
  (id, name, sex, phonenum, credentialstype, credentialsnum, travellertype)
values
  ('3FE27DF2A4E44A6DBC5D0FE4651D3D3E',
   '张龙',
   '男',
   '13333333333',
   0,
   '123456789009876543',
   0);
insert into TRAVELLER
  (id, name, sex, phonenum, credentialstype, credentialsnum, travellertype)
values
  ('EE7A71FB6945483FBF91543DBE851960',
   '张小龙',
   '男',
   '15555555555',
   0,
   '987654321123456789',
   1)

2.5 旅客和订单的中间表

在这里插入图片描述
表结构:

CREATE TABLE order_traveller( 
  orderId varchar2(32), 
  travellerId varchar2(32),
  PRIMARY KEY (orderId,travellerId), 
  FOREIGN KEY (orderId) REFERENCES orders(id), 
  FOREIGN KEY (travellerId) REFERENCES traveller(id) 
)
insert into ORDER_TRAVELLER
  (orderid, travellerid)
values
  ('0E7231DC797C486290E8713CA3C6ECCC', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E');
insert into ORDER_TRAVELLER
  (orderid, travellerid)
values
  ('2FF351C4AC744E2092DCF08CFD314420', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E');
insert into ORDER_TRAVELLER
  (orderid, travellerid)
values
  ('3081770BC3984EF092D9E99760FDABDE', 'EE7A71FB6945483FBF91543DBE851960');
insert into ORDER_TRAVELLER
  (orderid, travellerid)
values
  ('55F9AF582D5A4DB28FB4EC3199385762', 'EE7A71FB6945483FBF91543DBE851960');
insert into ORDER_TRAVELLER
  (orderid, travellerid)
values
  ('5DC6A48DD4E94592AE904930EA866AFA', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E');
insert into ORDER_TRAVELLER
  (orderid, travellerid)
values
  ('96CC8BD43C734CC2ACBFF09501B4DD5D', 'EE7A71FB6945483FBF91543DBE851960');
insert into ORDER_TRAVELLER
  (orderid, travellerid)
values
  ('A0657832D93E4B10AE88A2D4B70B1A28', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E');
insert into ORDER_TRAVELLER
  (orderid, travellerid)
values
  ('CA005CF1BE3C4EF68F88ABC7DF30E976', 'EE7A71FB6945483FBF91543DBE851960');
insert into ORDER_TRAVELLER
  (orderid, travellerid)
values
  ('E4DD4C45EED84870ABA83574A801083E', 'EE7A71FB6945483FBF91543DBE851960');

2.6 用户表

在这里插入图片描述
表结构:

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

insert into USERS (ID, EMAIL, USERNAME, PASSWORD, PHONENUM, STATUS)
values ('123456789', '121@qq.com', 'Tom', '$2a$10$w.7VbznU3wm/uBuvYdG8yOzTDiBFdKlEYLn6tzsLkaG5MmQ.rx7tW', '1234567', 1);
insert into USERS (ID, EMAIL, USERNAME, PASSWORD, PHONENUM, STATUS)
values ('987654321', '6565@qq.com', 'Jack', '$2a$10$w.7VbznU3wm/uBuvYdG8yOzTDiBFdKlEYLn6tzsLkaG5MmQ.rx7tW', '9876543', 1);
insert into USERS (ID, EMAIL, USERNAME, PASSWORD, PHONENUM, STATUS)
values ('319AC1ACC04F429FB4CC01083B09A416', '1212@qq.com', 'xiaosi', '$2a$10$JYMF.T1nfhAd7YRBsLComuvSJRhskOkVWQAiFVhaDoc7h1QDOyIvq', '1234569781', 1);
insert into USERS (ID, EMAIL, USERNAME, PASSWORD, PHONENUM, STATUS)
values ('9C1B44126CD243D7B96D4D892838882A', 'ada@qq.com', 'kejizhentan', '$2a$10$w.7VbznU3wm/uBuvYdG8yOzTDiBFdKlEYLn6tzsLkaG5MmQ.rx7tW', '12345678910', 1);

2.7 角色表

在这里插入图片描述

CREATE TABLE role(
	id varchar2(32) default SYS_GUID() PRIMARY KEY,
	roleName VARCHAR2(50) ,
	roleDesc VARCHAR2(50)
)
insert into ROLE (ID, ROLENAME, ROLEDESC)
values ('123456', 'USER', 'vip');
insert into ROLE (ID, ROLENAME, ROLEDESC)
values ('654321', 'ADMIN', 'vip');
insert into ROLE (ID, ROLENAME, ROLEDESC)
values ('330D9962CF284A5793D0BBC8CBB72FC6', 'guest', '测试用户');

2.8 用户和角色关联表

序号字段名称字段类型字段描述
1userIdvarchar2用户id
2roleIdvarchar2角色id

表结构:

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)
)

insert into USERS_ROLE (USERID, ROLEID)
values ('123456789', '123456');
insert into USERS_ROLE (USERID, ROLEID)
values ('123456789', '654321');
insert into USERS_ROLE (USERID, ROLEID)
values ('319AC1ACC04F429FB4CC01083B09A416', '123456');
insert into USERS_ROLE (USERID, ROLEID)
values ('987654321', '123456');
insert into USERS_ROLE (USERID, ROLEID)
values ('9C1B44126CD243D7B96D4D892838882A', '123456');
insert into USERS_ROLE (USERID, ROLEID)
values ('9C1B44126CD243D7B96D4D892838882A', '654321');

2.9 资源权限表

在这里插入图片描述
表结构:

CREATE TABLE permission(
  id varchar2(32) default SYS_GUID() PRIMARY KEY,
  permissionName VARCHAR2(50) ,
  url VARCHAR2(50)
)
insert into PERMISSION (ID, PERMISSIONNAME, URL)
values ('F752F33224CC4B1A8BF509E21618AA52', 'role findAll', '/role/findAll.do');
insert into PERMISSION (ID, PERMISSIONNAME, URL)
values ('111111', 'user findAll', '/user/findAll.do');
insert into PERMISSION (ID, PERMISSIONNAME, URL)
values ('222222', 'user findById', '/user/findById.do');

3.1 权限资源与角色关联表

序号字段名称字段类型字段描述
1permissionIdvarchar2权限id
2roleIdvarchar2角色id

表结构:

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

insert into ROLE_PERMISSION (PERMISSIONID, ROLEID)
values ('111111', '123456');
insert into ROLE_PERMISSION (PERMISSIONID, ROLEID)
values ('F752F33224CC4B1A8BF509E21618AA52', '123456');
insert into ROLE_PERMISSION (PERMISSIONID, ROLEID)
values ('222222', '123456');
insert into ROLE_PERMISSION (PERMISSIONID, ROLEID)
values ('F752F33224CC4B1A8BF509E21618AA52', '654321');
insert into ROLE_PERMISSION (PERMISSIONID, ROLEID)
values ('222222', '654321');

3.2 日志表

在这里插入图片描述
表结构:

CREATE TABLE sysLog( 
 id VARCHAR2(32) default SYS_GUID() PRIMARY KEY, 
 visitTime timestamp, 
 username VARCHAR2(50), 
 ip VARCHAR2(30),
 url VARCHAR2(50), 
 executionTime int, method VARCHAR2(200)
);

三、 项目中的要点介绍

1. 项目整合的配置文件和项目启动配置介绍

⑴ 项目整合的配置文件

在这里插入图片描述

⑵ Module项目启动配置

添加tomcat插件的坐标:
在这里插入图片描述
配置启动的tomcat命令
在这里插入图片描述

2. 多表联查的写法

表关系如下:
在这里插入图片描述
订单实体:
在这里插入图片描述

多表操作使用注解的写法:
在这里插入图片描述

3. PageHelper分页工具介绍

在这里插入图片描述

⑴ PageHelper介绍

PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql、oracle、mariaDB、DB2、SQLite、Hsqldb等。
本项目在 github 的项目地址https://github.com/pagehelper/Mybatis-PageHelper
本项目在 gitosc 的项目地址http://git.oschina.net/free/Mybatis_PageHelper

⑵ PageHelper使用
① 集成

引入分页插件有下面2种方式,推荐使用 Maven 方式。

  1. 引入 Jar 包
    你可以从下面的地址中下载最新版本的 jar 包
    https://oss.sonatype.org/content/repositories/releases/com/github/pagehelper/pagehelper/
    http://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/
    由于使用了sql 解析工具,你还需要下载 jsqlparser.jar:
    http://repo1.maven.org/maven2/com/github/jsqlparser/jsqlparser/0.9.5/

  2. 使用 Maven
    在 pom.xml 中添加如下依赖:

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.2</version>
    </dependency>
    
② 配置

特别注意,新版拦截器是 com.github.pagehelper.PageInterceptorcom.github.pagehelper.PageHelper
在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。

  • 在 Spring 配置文件中配置拦截器插件

    <!-- 把交给IOC管理 SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 传入PageHelper的插件 -->
        <property name="plugins">
            <array>
                <!-- 传入插件的对象 -->
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <props>
                            <prop key="helperDialect">oracle</prop>
                            <prop key="reasonable">true</prop>
                        </props>
                    </property>
                </bean>
            </array>
        </property>
    </bean>
    
③ 使用分页插件
@Service
@Transactional
public class OrdersServiceImpl implements IOrdersService {

    @Autowired
    private IOrdersDao ordersDao;

    @Override
    public List<Orders> findAll(int page,int size) throws Exception{
        PageHelper.startPage(page,size);
        return ordersDao.findAll();
    }

    @Override
    public Orders findById(String orderId) throws Exception {
        return ordersDao.findById(orderId);
    }
}
⑶ 分页插件参数介绍
  1. helperDialect :分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。
    你可以配置helperDialect 属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:oracle , mysql , mariadb , sqlite , hsqldb , postgresql , db2 , sqlserver , informix , h2 , sqlserver2012 , derby
    特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
    你也可以实现AbstractHelperDialect ,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。

  2. offsetAsPageNum :默认值为 false ,该参数对使用 RowBounds作为分页参数时有效。 当该参数设置为true 时,会将RowBounds 中的offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。

  3. rowBoundsWithCount :默认值为 false ,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,使用 RowBounds 分页会进行 count 查询。

  4. pageSizeZero:默认值为false ,当该参数设置为true时,如果pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。

  5. reasonable :分页合理化参数,默认值为false 。当该参数设置为 true 时, pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认 false 时,直接根据参数进行查询。

  6. params :为了支持startPage(Object params) 方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable ,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero

  7. supportMethodsArguments :支持通过 Mapper 接口参数来传递分页参数,默认值false ,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的com.github.pagehelper.test.basic 包下的ArgumentsMapTestArgumentsObjTest

  8. closeConn :默认值为true 。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认 true关闭,设置为false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。

四、Spring Security权限管理框架简介

1. Spring Security快速入门

Spring Security依赖坐标:
在这里插入图片描述
Spring Security的配置文件
在这里插入图片描述
web.xml文件中的配置
在这里插入图片描述
用户登录的服务端配置:
在这里插入图片描述
退出登录只需要在Spring Security的配置文件和jsp上配置即可
在这里插入图片描述

2.用户密码加密后spring security的配置更改

将加密类注入到ioc容器中:
在这里插入图片描述
配置加密方式
在这里插入图片描述
给用户密码加密
在这里插入图片描述
在这里插入图片描述

3. 服务器端方法级权限控制

⑴ JSR-250注解

在这里插入图片描述

⑵ @Secured注解

在这里插入图片描述

⑶ 支持表达式的注解

在这里插入图片描述
相关文件
点击下载,下载密码为:ckaa

详细介绍请看后期模块介绍

五、AOP日志信息的获取类设计

在这里插入图片描述
核心代码如下:

/**
 * @Auther: kejizhentan
 * @Date 2022/3/12 11:27
 * @Description: 创建切面类处理日志
 */
@Component
@Aspect
public class LogAop {
    private Date startTime;//访问的开始时间
    private Class executionClass;//访问的类
    private Method executionMethod;//访问的方法
    @Autowired
    private HttpServletRequest request;//注入前需要在web.xml中配置RequestContextListener监听器
    @Autowired
    private ISysLogService sysLogService;
    /**
     * @descrition:前置通知的方法 拦截controller下所有的方法,主要获取访问的时间、访问的方法、访问的类
     * @auther: kejizhentan
     * @date: 2022/3/12 11:28
     */
    @Before("execution(* com.kejizhentan.controller.*.*(..))")
    public void doBefore(JoinPoint jp) throws NoSuchMethodException {
        startTime = new Date();//获取访问的开始时间
        executionClass = jp.getTarget().getClass();//获取访问的类
        String methodName = jp.getSignature().getName();//获取访问的方法名称

        Object[] args = jp.getArgs();//获取访问方法的参数
        if(args == null || args.length == 0 ){
            //表示当前方法没有参数
            executionMethod = executionClass.getMethod(methodName);//只能获取无参的方法
        }else {
            //表示有参,就将args中所有元素遍历,获取对应的Class,装入到一个Class[]
            Class[] classArgs = new Class[args.length];
            for (int i = 0; i <args.length ; i++) {
                classArgs[i] = args[i].getClass();
            }
            //获取有参数的方法
            executionMethod = executionClass.getMethod(methodName, classArgs);
        }
    }

    /**
     * @descrition:后置通知的方法 拦截controller下所有的方法,主要获取ip、时长、url...
     * @auther: kejizhentan
     * @date: 2022/3/12 11:28
     */
    @After("execution(* com.kejizhentan.controller.*.*(..))")
    public void doAfter(JoinPoint jp) throws Exception {
        //获取访问的时长
        Long executionTime = new Date().getTime() - startTime.getTime();
        //url 它的值应该是类上的@RequestMapping的value+方法上的 @RequestMapping的value
        String url = "";
        //获取url
        //先判断不是自身的切面类和查询日志信息的类,并且访问的类不为null,访问的方法不为null
        if(executionClass != LogAop.class&&executionClass != SysLogController.class  && executionClass != null && executionMethod != null){
            // 获取类上的@RequestMapping对象
            RequestMapping classAnnotation = (RequestMapping) executionClass.getAnnotation(RequestMapping.class);
            // 获取方法上的@RequestMapping对象
            RequestMapping methodAnnotation = executionMethod.getAnnotation(RequestMapping.class);
            if(classAnnotation != null && methodAnnotation != null){
                url = classAnnotation.value()[0] + methodAnnotation.value()[0];
            }
            // 获取ip
            String ip = request.getRemoteAddr();
            // 登录的用户信息可以通过securityContext获取,也可以从request.getSession中获取
            //User user = (User) request.getSession().getAttribute("SPRING_SECURITY_CONTEXT");
            SecurityContext context = SecurityContextHolder.getContext();
            User user = (User)context.getAuthentication().getPrincipal();
            String username = user.getUsername();//当前登录人姓名
            SysLog sysLog = new SysLog();
            sysLog.setIp(ip);
            sysLog.setUrl(url);
            sysLog.setUsername(username);
            sysLog.setExecutionTime(executionTime);
            sysLog.setVisitTime(startTime);
            sysLog.setMethod("[类名]" + executionClass.getName() + "[方法名]" + executionMethod.getName());
            sysLogService.save(sysLog);
        }
    }
}

注意:
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值