SpringSecurity动态配置权限 注:该博客是对上一遍博客的进阶https://www.cnblogs.com/fernfei/p/12194828.html 一、创建项目并导入依赖 二、相关配置和代码
一、创建项目并导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.27</version>
</dependency>
注:maven默认不编译src/main/java下的xml文件,需要我们手动导入
二、相关配置和代码
1)application.properties
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/security
spring.datasource.username=root
spring.datasource.password=123
2)数据库脚本
3)数据库表结构
密码是123 springsecurity加密算法后的密文,可以让同样的密码每次生成的密文都不一样,从而不会重复,我们案列中的密文是我偷懒复制粘贴的所以一样
4)创建实体类User、Role、Menu
4.1)创建User实现UserDetails
这里要实现UserDetails接口,这个接口好比一个规范。防止开发者定义的密码变量名各不相同,从而导致springSecurity不知道哪个方法是你的密码
我给的数据库中user表没有UserDetails的几个方法,可以直接手动给它true
有的,就用数据库查出来的属性!
4.2)创建Role类
4.3)创建Menu类
5)创建UserMapper类&&UserMapper.xml和MenuMapper类&&MenuMapperxml
5.1)UserMapper.class
注:以前在SSM框架之所以不用加类似@Service和@controller的注解时因为我们在xml文件已经配置了,如今使用SpringBoot所以我们也要改变写法
一共两种写法
5.1.1)在类上直接加@Mapper
5.1.2)在SpringBoot启动类上配置全局的扫描
5.2)UserMapper.xml
5.3)MenuMapper类
5.4)MenuMapper.xml
sql语句是左外连接,主表menu_role连查menu和role
SELECTm. *,r.idasrid,r.nameasrname,r.nameZhasrnameZhfrommenu_rolemrLEFTJOINmenumONmr.mid=m.idLEFTJOINroleronmr.rid=r.id
6)创建UserService&&MenuService
6.1)创建UserService实现UserServiceDetails接口
6.2)创建MenuService
7)创建CustomFilterInvocationSecurityMetadataSource
7.1)实现接口FilterInvocationSecurityMetadataSource
注:加@comppent注解,把自定义类注册成spring组件
7.2)supports返回值设成true表示支持
7.3)重写getAttributes()方法
8)创建CustomAccessDecisionManager
8.1)实现AccessDecisionManager接口
注:加@comppent注解,把自定义类注册成spring组件
8.2)将两个supports()都设置成true
8.3)重写decide()方法
9)创建WebSecurityConfig配置类
9.1)WebSecurityConfig实现WebSecurityConfigurerAdapter
9.2)注入一会所需要的类
9.3)SpringSecurity5.0之后必须密码加密
9.4)将数据库查出的账户密码交给SpringSecurity去判断
9.5)配置HttpSecurity
这里只写了主要代码真正业务还需要判断登陆成功跳转页面和登陆失败跳转页面
可以访问我前面针对HttpSecurity比较详细的博客
https://www.cnblogs.com/fernfei/p/12185186.html
10)Controller