SpringBoot安全认证Security的实现方法

 

以上省略了创建对象及DAO等基本操作

五 、权限控制

以上内容我们只解决了用户登录问题,但是实际开发中仅仅完成用户登录是不够的,我们还需要用户授权及授权验证。由于我们已经将用户信息存储到数据库里了,那么姑且我们也将权限信息存储在数据库吧。

1. 准备数据库表及测试数据

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

drop table if exists test.role;

create table test.role (

 id int auto_increment primary key,

 role varchar(50)

);

 

drop table if exists test.permission;

create table test.permission (

 id int auto_increment primary key,

 permission varchar(50)

);

 

drop table if exists test.user_r_role;

create table test.user_r_role (

 userid int,

 roleid int

);

 

drop table if exists test.role_r_permission;

create table test.role_r_permission (

 roleid int,

 permissionid int

);

 

drop table if exists test.user_r_permission;

create table test.user_r_permission (

 userid int,

 permissionid int

);

 

insert into test.role(id, role) values (1, 'adminRole');

insert into test.role(id, role) values (2, 'guestRole');

 

insert into test.permission(id, permission) values (1, 'permission1');

insert into test.permission(id, permission) values (2, 'permission2');

insert into test.permission(id, permission) values (3, 'permission3');

insert into test.permission(id, permission) values (4, 'permission4');

 

insert into test.user_r_role(userid, roleid) values (1, 1);

insert into test.user_r_role(userid, roleid) values (2, 2);

 

insert into test.role_r_permission(roleid, permissionid) values (1, 1);

insert into test.role_r_permission(roleid, permissionid) values (1, 2);

 

insert into test.user_r_permission(userid, permissionid) values (1, 3);

insert into test.user_r_permission(userid, permissionid) values (1, 4);

insert into test.user_r_permission(userid, permissionid) values (2, 3);

insert into test.user_r_permission(userid, permissionid) values (2, 4);

  1. role:角色信息表,permission权限信息表,user_r_role用户所属角色表,role_r_permission角色拥有权限表,user_r_permission用户拥有权限表。
  2. 由于用户有所属角色且角色是有权限的,用户同时又单独拥有权限,所以用户最终拥有的权限取并集。
  3. 用户admin最终拥有角色adminRole以及权限:permission1、permission2、permission3、permission4
  4. 用户guest最终拥有角色guestRole以及权限:permission3、permission4

2. Dao、Service

dao增加方法:根据用户名查角色以及根据用户名查权限

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

public List<String> getPermissionsByUsername(String username) {

  String sql =

      "select d.permission\n" +

      "from user a\n" +

      "    join user_r_role b on a.id = b.userid\n" +

      "    join role_r_permission c on b.roleid = c.roleid\n" +

      "    join permission d on c.permissionid = d.id\n" +

      "where a.username = ?\n" +

      "union\n" +

      "select c.permission\n" +

      "from user a\n" +

      "    join user_r_permission b on a.id = b.userid\n" +

      "    join permission c on b.permissionid = c.id\n" +

      "where a.username = ?";

  return jdbcTemplate.queryForList(sql, new String[]{username, username}, String.class);

}

 

public List<String> getRoleByUsername(String username) {

  String sql =

      "select c.role\n" +

      "from user a\n" +

      "    join user_r_role b on a.id = b.userid\n" +

      "    join role c on b.roleid = c.id\n" +

      "where a.username = ?";

  return jdbcTemplate.queryForList(sql, new String[]{username}, String.class);

}

service增加方法:根据用户名查角色以及根据用户名查权限

?

1

2

3

4

5

6

7

public List<String> getPermissionsByUsername(String username) {

  return loginDao.getPermissionsByUsername(username);

}

 

public List<String> getRoleByUsername(String username) {

  return loginDao.getRoleByUsername(username);

}

3. WebSecurityConfig

(1)调整public UserDetailsService userDetailsService()方法,在构建用户信息的时候把用户所属角色和用户所拥有的权限也填充上(最后return的时候)。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值