郭艺宾 · 2019年09月30日

SpringBootSecurity学习(08)网页版登录整合MyBatis

创建数据库

前面介绍了springboot-security整合jdbc从数据库中查询用户的方式,适用性有限,下面介绍最常用的整合MyBatis,这种在开发和生产环境中是最常用,也是最实用的。首先需要创建数据库表,我们来创建三张表,分别是用户表,角色表,还有用户角色表,首先看用户表:

file

只有三个字段,具体业务中需要几个字段完全由我们自己设计。密码是admin,是加密的,后面的配置中会看到加密方式,与前面介绍的在内存中配置默认用户的方式类似。下面看角色表:

file

注意每个角色名字的前面都加了一个ROLE_前缀,最后来看用户角色表:

file

我们给用户只分配了一个角色。

创建实体类

我们从基本做起,来创建实体类,首先创建角色实体类 SysRole,

file

除了基本的id和role字段,SysRole还实现了GrantedAuthority接口,实现了getAuthority方法,这个方法返回的就是角色的名字,后面会看到专门实现这个接口的好处。下面来看用户实体类 SysUser:

file

用户名最好是username,密码最好是password,这样命名是security默认支持的命名。这个是原生的用户实体类,除了id和用户名密码,加入了一个角色列表属性,用以返回当前用户拥有哪些角色,不过为了配合security的使用,最好给用户实体类实现一个接口UserDetails:

file

然后实现接口的下面几个方法:

file

其中比较重要的是最后一个获取角色列表的方法,这是security默认的方法。由于我们角色实体类实现了GrantedAuthority接口,所以这里可以直接返回上面定义的角色列表。还有一些其它的属性都是security默认设计的用户属性,从字面意思可以看出是判断超时,锁定,能否登陆之类的,如果想用可以定义对应的字段,如果不想用直接返回true即可。

创建mapper

在springboot中整合mybatis就不再介绍了。下一步创建mapper接口,内容很简单,就是根据用户名查询用户:

file

来看sql语句,我们要一步到位,把用户和用户拥有的角色都查出来,这里使用一个一对多查询:

file

security配置类

配置类中把前面的jdbc配置可以删除了,我们来重写两个方法,配置用户名密码的验证和密码的加密:

file

这里我们查询到用户的时候直接返回的用户,是因为用户类实现了对应的接口,所以操作很方便,而且返回的内容中包含了角色信息。下面在auth中配置了登录验证方式和密码加密方式。

测试

上面的内容以及配置完了,我们重启项目就可以使用admin/admin登录:

file

file

访问/two和/three页面:

file

可以看到以非常个性化的自定义方式完成了用户的认证和授权。来查看当前用户信息:

file

在实际的开发中,用户表肯定会有更加丰富的字段,使用用户类实现UserDetails接口的形式能更好的获取用户信息。

注意,新增用户的时候,密码要使用 new BCryptPasswordEncoder().encode("admin") 的方式加密,新增角色的时候,前面要加上ROLE_前缀,这是默认的规则。

代码地址:https://gitee.com/blueses/spr... 08

推荐阅读
关注数
2
文章数
50
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息