利用spring security实现动态权限控制

本文介绍了如何利用Spring Security实现动态权限控制。首先讲解了准备数据库,包括user、role、user_role、menu和menu_role五张表的创建,然后详细阐述了在代码层面如何创建实体类、UserService以及配置securityConfig,最后讨论了动态权限管理的实现,包括MyFilter和MyDecisionManager类的作用以及如何将它们加入权限控制链。
摘要由CSDN通过智能技术生成

前言:利用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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值