前言:利用security实现权限控制
一,准备数据库MySql
1,创建五张表,user表、role表、uer_role表、menu表、menu_role表
user表:用来存放用户信息,字段id、name、username、password、enabled等
说明:必要的字段username和password,这两个字段表示登陆时需要验证的内容。
在登陆页面输入的用户名和密码即为这两个字段,name字段表示该用户的角色,
是管理员还是其他角色等,可自定义。enabled字段表示该用户是否启用。
role表:字段id、name和nameZh
说明:name表示角色英文名称,nameZh表示中文名称,记住,name字段必须得以
ROLE_开头;如下图:
user_role表:用户角色关联表,字段id、uid和rid,uid和rid分别设置两个外键对应user表和role表的id。
说明:该表的意义在于在用户登陆时可以通过该表查找到此用户的角色。
menu表:菜单表,其实是将后端的接口地址保存在数据库,如下图:
其中url为后端接口地址,接口地址采取ant风格,和spring security的要求统一。
说明:该表非必需,但是为了好动态的控制权限,设置该表为角色动态添加功能。
menu_role表:菜单角色关联表,字段id、mid和rid
说明:该表用于通过角色查找对应的菜单,表示该角色能够访问哪些菜单项。实现权限控制,mid和rid分别设置外键和menu表id、role表id关联。
二,编写代码
1,创建实体类User、Role、Menu;根据字段创建,生成get和set方法。
其中Role和Menu正常创建即可。重点在User类
User类:创建完User类后,需要实现spring 中UserDetails类,并且实现里面的七个方法
如下源码图
实现里面的方法后,这里需要注意的是,这里面已经有了getPassword、getUsername和isEnabled,你在自动生成get和set时会和实现UserDetails时重复,需要把自动生成的删掉,不然就有两个对应的get方法。
接下来就是UserService类了,该类需要实现UserDetailsService类,该类的源码:
其中只有一个方法需要实现,loadUserByUsername(String usernam),见名知意,通过用户名查找用户信息。
在UserService中实现该方法后,需要注入UserMapper类
我这里的Hr其实就是User,loadUserByUsername该方法返回的是UserDetails对象,因为,你的User类实现了UserDetails类,所以这里需要返回User,接下来就是配置securityConfig配置类
标号1,注入你的UserService,我这里的Hr其实就是User,
标号2,返回spring security的密码加密实例,注意@bean注解,告诉spring这里使用的是
BCryptPasswordEncoder加密方式,这个加密方式生成的密文每次都不一样,比喻123加密后
生成的密文每次不一致,可能你会问那登陆怎么匹配呢?其实,它在生成密文时会加上一个
随机数,并且把随机数保存,登陆匹配时,再次提取即可。源码如下:
// Seed Generator
private static volatile SecureRandom seedGenerator = null;
/**
* Constructs a secure random number generator (RNG) implementing the
* default random number algorithm.
*
* <p> This constructor traverses the list of registered security Providers,
* starting with the