网站备案邮寄资料,嵌入式开发要学哪些,wordpress会员下载功能,wordpress 替换 插件权限控制#xff1a;不同的用户可以使用不同的功能。
我们不能在前端判断用户权限来控制显示哪些按钮#xff0c;因为这样#xff0c;有人会获取该功能对应的接口#xff0c;就不需要通过前端#xff0c;直接发送请求实现功能了。所以需要在后端进行权限判断。#xff0…权限控制不同的用户可以使用不同的功能。
我们不能在前端判断用户权限来控制显示哪些按钮因为这样有人会获取该功能对应的接口就不需要通过前端直接发送请求实现功能了。所以需要在后端进行权限判断。前端防君子后端防小人。
授权流程springSecurity会默认使用FilterSecurityInterceptor进行权限校验会从SecurityContextHolder中获取authentication获取权限信息进行判断。
所以需要我们做的就是把用户的权限信息存入authentication。
那么SecurityContextHolder中的权限信息是从哪里获取的呢前面SecurityContextHolder中的认证用户信息是从redis中获取的权限信息也一样。
我们先说说权限控制的方案1、springSecurity提供注解2、配置
注解权限控制是我们经常用的我就只说这个方案了。
使用权限控制注解需要在SecurityConfig配置类中开启配置
EnableGlobalMethodSecurity(prePostEnabled true)
Configuration
//开启权限控制注解
EnableGlobalMethodSecurity(prePostEnabled true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {.....
}
我们能用的权限控制注解有很多但真正经常用的只有PreAuthorize就是在访问之前进行权限判断。写在controller层的请求方法上。
PreAuthorize(hasAuthority(test))
这里其实是去调用hasAuthority方法去判读权限返回true即有权限。test为权限名
RestController
RequestMapping
public class HelloController {GetMapping(/hello)//这里其实是去调用hasAuthority方法去判读权限返回true即有权限.test为权限名,这里只能填一个权限PreAuthorize(hasAuthority(test))public String hello(){return hello;}
至于 权限名的定义和权限内容的定义 在后面定义。
注解类方法
PreAuthorize(hasAuthority(权限名))
除了前面用的hasAuthority方法外还有其他的校验方法当然我们也可以自定义校验方法。 hasAuthority(‘’)方法只能填一个权限。 hasAnyAuthority(‘’,’’,’’)方法可以传入多个权限其中用户有任意一个权限都可以访问。 hasRole(‘’)方法要求有对应角色才可以访问。它内部会把我们传入的角色参数拼接上 ROLE_ 后在去比较所以需要对用户的权限也要有 ROLE_ 这个前缀。 hasAnyRole(‘’,’’,’’)方法要求有对应任意角色才可以访问。它内部也会把我们传入的角色参数拼接上 ROLE_ 后在去比较所以需要对用户的权限也要有 ROLE_ 这个前缀。
同时权限是实体类User类的属性
Data
NoArgsConstructor
//AllArgsConstructor
public class LoginUser implements UserDetails {//需要定义User对象来封装用户信息。private User user;//该用户的权限信息private ListString permissions;public LoginUser(User user, ListString permissions) {this.user user;this.permissions permissions;}//问题当我们把logUser存入redis中时redis默认不会把SimpleGrantedAuthority对象序列化。//解决我们不需要把SimpleGrantedAuthority存入redis我们只需把权限信息permissions存入即可//通过permissions反序列化即可获取authorities所以需要忽略SimpleGrantedAuthority不要对它序列化JSONField(serialize false)private ListSimpleGrantedAuthority authorities;Override //实际springSecurity获取权限信息是调用的该方法重写该方法。public Collection? extends GrantedAuthority getAuthorities() {//优化如果每次获取权限都进行集合转换有点浪费。我们只第一次去集合转换后续获取直接返回之前转换好的//即把ListSimpleGrantedAuthority authorities定义为成员变量。if(authorities!null){return authorities;}authorities permissions.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList());return authorities;}
} 然后去数据库中查询用户权限
到数据库中查询权限信息
RBAC权限模型Role-Based Access Control基于角色的权限控制。这是目前最常被开发者使用也是相对易用、通用权限模型。
在数据库中我们会创建一个用户表一个权限表记录着权限功能说明和权限名一个用户可以有多个权限不好表达所以我们又引入了一个角色表里面有很多角色在创建个角色权限管理表每种角色对应不同的多种功能为角色赋予不同的权限。比如图书馆管理系统中的角色图书管理员权限添加、查询、删除等等借阅者权限查询、借阅。同时一个用户可能会有多种身份需要将用户与角色关联起来。
这就是RBAC模型最少都是5张表 5表联合查询用户权限role为角色表menu为菜单表可以理解为权限表
mapper namespaceorg.example.springSecurity.mapper.MenuMapperselect idselectPermsByUserId resultTypejava.lang.Stringselectdistinct m.permsfrom sys_user_role urLeft join sys_role r on ur.role_id r.idLeft join sys_role_menu rm on ur.role_id rm.role_idLeft join sys_menu m on m.id rm.menu_idwhereuser_id #{userId}and r.status 0and m.status 0/select
/mapper