一个权限控制系统基于Spring Security实现前后端分离

本文介绍了如何使用Spring Security构建一个权限控制系统,涉及内容包括:引入依赖、配置文件、实体类定义、自定义UserDetails和UserDetailsService、登录成功和失败处理、Token处理、访问控制策略、WebSecurity配置以及扩展的手机号+短信验证码登录方式。
摘要由CSDN通过智能技术生成

话不多说,进入正题。一个简单的权限控制系统需要考虑的问题如下:

  1. 权限如何加载
  2. 权限匹配规则
  3. 登录

1. 引入maven依赖

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <parent>
 6         <groupId>org.springframework.boot</groupId>
 7         <artifactId>spring-boot-starter-parent</artifactId>
 8         <version>2.5.1</version>
 9         <relativePath/> <!-- lookup parent from repository -->
10     </parent>
11     <groupId>com.example</groupId>
12     <artifactId>demo5</artifactId>
13     <version>0.0.1-SNAPSHOT</version>
14     <name>demo5</name>
15 
16     <properties>
17         <java.version>1.8</java.version>
18     </properties>
19 
20     <dependencies>
21         <dependency>
22             <groupId>org.springframework.boot</groupId>
23             <artifactId>spring-boot-starter-data-jpa</artifactId>
24         </dependency>
25         <dependency>
26             <groupId>org.springframework.boot</groupId>
27             <artifactId>spring-boot-starter-data-redis</artifactId>
28         </dependency>
29         <dependency>
30             <groupId>org.springframework.boot</groupId>
31             <artifactId>spring-boot-starter-security</artifactId>
32         </dependency>
33         <dependency>
34             <groupId>org.springframework.boot</groupId>
35             <artifactId>spring-boot-starter-web</artifactId>
36         </dependency>
37 
38         <dependency>
39             <groupId>io.jsonwebtoken</groupId>
40             <artifactId>jjwt</artifactId>
41             <version>0.9.1</version>
42         </dependency>
43 
44         <dependency>
45             <groupId>com.alibaba</groupId>
46             <artifactId>fastjson</artifactId>
47             <version>1.2.76</version>
48         </dependency>
49         <dependency>
50             <groupId>org.apache.commons</groupId>
51             <artifactId>commons-lang3</artifactId>
52             <version>3.12.0</version>
53         </dependency>
54         <dependency>
55             <groupId>commons-codec</groupId>
56             <artifactId>commons-codec</artifactId>
57             <version>1.15</version>
58         </dependency>
59 
60         <dependency>
61             <groupId>mysql</groupId>
62             <artifactId>mysql-connector-java</artifactId>
63             <scope>runtime</scope>
64         </dependency>
65         <dependency>
66             <groupId>org.projectlombok</groupId>
67             <artifactId>lombok</artifactId>
68             <optional>true</optional>
69         </dependency>
70     </dependencies>
71 
72     <build>
73         <plugins>
74             <plugin>
75                 <groupId>org.springframework.boot</groupId>
76                 <artifactId>spring-boot-maven-plugin</artifactId>
77                 <configuration>
78                     <excludes>
79                         <exclude>
80                             <groupId>org.projectlombok</groupId>
81                             <artifactId>lombok</artifactId>
82                         </exclude>
83                     </excludes>
84                 </configuration>
85             </plugin>
86         </plugins>
87     </build>
88 
89 </project>

application.properties配置

 1 server.port=8080
 2 server.servlet.context-path=/demo
 3 
 4 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 5 spring.datasource.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8
 6 spring.datasource.username=root
 7 spring.datasource.password=123456
 8 
 9 spring.jpa.database=mysql
10 spring.jpa.open-in-view=true
11 spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
12 spring.jpa.show-sql=true
13 
14 spring.redis.host=192.168.28.31
15 spring.redis.port=6379
16 spring.redis.password=123456

2. 建表并生成相应的实体类

SysUser.java

 1 package com.example.demo5.entity;
 2 
 3 import lombok.Getter;
 4 import lombok.Setter;
 5 
 6 import javax.persistence.*;
 7 import java.io.Serializable;
 8 import java.time.LocalDate;
 9 import java.util.Set;
10 
11 /**
12  * 用户表
13  * @Author ChengJianSheng
14  * @Date 2021/6/12
15  */
16 @Setter
17 @Getter
18 @Entity
19 @Table(name = "sys_user")
20 public class SysUserEntity implements Serializable {
21 
22     @Id
23     @GeneratedValue(strategy = GenerationType.AUTO)
24     @Column(name = "id")
25     private Integer id;
26 
27     @Column(name = "username")
28     private String username;
29 
30     @Column(name = "password")
31     private String password;
32 
33     @Column(name = "mobile")
34     private String mobile;
35 
36     @Column(name = "enabled")
37     private Integer enabled;
38 
39     @Column(name = "create_time")
40     private LocalDate createTime;
41 
42     @Column(name = "update_time")
43     private LocalDate updateTime;
44 
45     @OneToOne
46     @JoinColumn(name = "dept_id")
47     private SysDeptEntity dept;
48 
49     @ManyToMany
50     @JoinTable(name = "sys_user_role",
51             joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
52             inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")})
53     private Set<SysRoleEntity> roles;
54 
55 }

SysDept.java

部门相当于用户组,这里简化了一下,用户组没有跟角色管理

 1 package com.example.demo5.entity;
 2 
 3 import lombok.Data;
 4 
 5 import javax.persistence.*;
 6 import java.io.Serializable;
 7 import java.util.Set;
 8 
 9 /**
10  * 部门表
11  * @Author ChengJianSheng
12  * @Date 2021/6/12
13  */
14 @Data
15 @Entity
16 @Table(name = "sys_dept")
17 public class SysDeptEntity implements Serializable {
18 
19     @Id
20     @GeneratedValue(strategy = GenerationType.AUTO)
21     @Column(name = "id")
22     private Integer id;
23 
24     /**
25      * 部门名称
26      */
27     @Column(name = "name")
28     private String name;
29 
30     /**
31      * 父级部门ID
32      */
33     @Column(name = "pid")
34     private Integer pid;
35 
36 //    @ManyToMany(mappedBy = "depts")
37 //    private Set<SysRoleEntity> roles;
38 }

SysMenu.java

菜单相当于权限

 1 package com.example.demo5.entity;
 2 
 3 import lombok.Data;
 4 import lombok.Getter;
 5 import lombok.Setter;
 6 
 7 import javax.persistence.*;
 8 import java.io.Serializable;
 9 import java.util.Set;
10 
11 /**
12  * 菜单表
13  * @Author ChengJianSheng
14  * @Date 2021/6/12
15  */
16 @Setter
17 @Getter
18 @Entity
19 @Table(name = "sys_menu")
20 public class SysMenuEntity implements Serializable {
21 
22     @Id
23     @GeneratedValue(strategy = GenerationType.AUTO)
24     @Column(name = "id")
25     private Integer id;
26 
27     /**
28      * 资源编码
29      */
30     @Column(name = "code")
31     private String code;
32 
33     /**
34      * 资源名称
35      */
36     @Column(name = "name")
37     private String name;
38 
39     /**
40      * 菜单/按钮URL
41      */
42     @Column(name = "url")
43     private String url;
44 
45     /**
46      * 资源类型(1:菜单,2:按钮)
47      */
48     @Column(name = "type")
49     private Integer type;
50 
51     /**
52      * 父级菜单ID
53      */
54     @Column(name = "pid")
55     private Integer pid;
56 
57     /**
58      * 排序号
59      */
60     @Column(name = "sort")
61     private Integer sort;
62 
63     @ManyToMany(mappedBy = "menus")
64     private Set<SysRoleEntity> roles;
65 
66 }

SysRole.java

 1 package com.example.demo5.entity;
 2 
 3 import lombok.Data;
 4 import lombok.Getter;
 5 import lombok.Setter;
 6 
 7 import javax.persistence.*;
 8 import java.io.Serializable;
 9 import java.util.Set;
10 
11 /**
12  * 角色表
13  * @Author ChengJianSheng
14  * @Date 2021/6/12
15  */
16 @Setter
17 @Getter
18 @Entity
19 @Table(name = "sys_role")
20 public class SysRoleEntity implements Serializable {
21 
22     @Id
23     @GeneratedValue(strategy = GenerationType.AUTO)
24     @Column(name = "id")
25     private Integer id;
26 
27     /**
28      * 角色
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值