话不多说,进入正题。一个简单的权限控制系统需要考虑的问题如下:
- 权限如何加载
- 权限匹配规则
- 登录
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 * 角色