快速开发平台 fast_security_admin(三):登录验证与动态权限管理
前言
原本是计划5.25完成,中间因为学习遇到了困境加上去做了一个微信小程序,这个项目就搁置到现在了,当然现在是确实有了重大突破,但是很惭愧这些突破只能算是学习的突破不能算是我自己的成果。
几乎完全是参考的 mall项目 的权限管理部分,可以说mall的权限管理部分非常好,讲解与非常细。
这篇博客介绍一下遇到的问题,以及思路。
库表设计
现在是完全更新了数据库。详情访问下面地址下载sql文件。
https://gitee.com/liugoodman/fast_security_admin
关于动态权限验证
实际是RBAC系统,就是把用户有哪些权限存起来,user——role——resource,用户根据角色获得资源(权限)。
可以在方法接口上写注解来实现,但是这不是动态,我们要求完全从数据库获得权限信息。
那么使用SpringSecurity要想实现动态的权限验证总体上分两步。
- 通用SpringSecurity的配置
- 具体资源的加载
在通用SpringSecurity的配置代码非常死!!!谁写都是这点代码,完全复制没有问题。
重点是加载数据。
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class FsAdminSecurityConfig extends SecurityConfig {
@Autowired
private FsUserAuthsService fsUserAuthsService;
@Autowired
private FsResourceService fsResourceService;
@Bean
public UserDetailsService userDetailsService() {
//获取登录用户信息
return username -> fsUserAuthsService.loadUserByUsername(username);
}
@Bean
public DynamicSecurityService dynamicSecurityService() {
return new DynamicSecurityService() {
@Override
public Map<String, ConfigAttribute> loadDataSource() {
Map<String, ConfigAttribute> map = new ConcurrentHashMap<>();
List<FsResource> resourceList = fsResourceService.list();
for (FsResource resource : resourceList) {
map.put(resource.getResourcePath(), new org.springframework.security.access.SecurityConfig(resource.getId() + ":" + resource.getResourcePath()));
}
return map;
}
};
}
}
实际上加载数据也是非常死,但是根据你设计的表不同会有区别,要加载两部分:用户信息(用户名、密码、权限资源),重点是loadUserByUsername(username),这个方法是SpringSecurity给我们让我们实现的接口,参数必须是username,这个用户名不一定是你登录时输入的,但必须是你可以根据登录时的输入获得的,并且它是唯一的!!!通过它我们要获得用户的信息SpringSecurity自动与输入的用户名密码对比。第二部分是所有权限的列表,SpringSecurity拿之前获得的用户权限和权限表里面的数据对比,有匹配上的说明是拥有此权限,权限表里面有而用户权限里面没有,说明用户不具备此权限。
我们看到了@Bean注解,数据被注入到了缓存之中,也就是被SpringSecurity获取了。
SpringSecurity的鉴权方法是配置在SpringSecurity之中的,具体如何实现请看mall的动态权限管理。
接下来要做的
彩色的部分要求全部是动态的从数据库获取,前端封装成通用组件。
menu——entity——list