2023年6月20日发(作者:)
SpringSecurity怎样使⽤注解控制权限⼀般的系统在权限设计上,都会分为⾓⾊、权限(RDBC),复杂⼀点的可能会有⽤户组、组织之类的概念。⽤户的权限是写死的,对应于后台的接⼝或者资源,是没办法改变的,⼀般不对⽤户开放修改权限。管理员⽤户可以通过给⾓⾊分配权限的⽅式,来实现访问控制。所以当我们写过滤器,或者⽤⼀些安全框架时(⽐如Shiro,Spring Security),也需要将可变的“⾓⾊”,转化为不可变的“权限”,注⼊到框架中。具体的可以看我之前写的⼀篇()注⼊当前⽤户的权限后,就需要进⾏访问控制了。常见的做法有1、路径⽐对之前有个项⽬⽤过⼀次,定义⼀个过滤器,添加到security的过滤链中,在这个过滤器中做这么⼀件事:分析当前访问路径所需要的权限,检查当前⽤户是否具有该权限,做⼀个对⽐,根据对⽐结果来决定当前⽤户是否可以访问该资源。这种做法的好处是代码的⼊侵性不⾼,不需要再每个接⼝上加注解。但相对来说,显得不那么直观,可读性⽐较差,所以这次换个⽅法。2、使⽤注解的⽅式SpringSecurity使⽤注解来控制访问时,需要提前开启这个功能。在配置类上加上注解@Configuration@EnableWebSecurity@EnableGlobalMethodSecurity(prePostEnabled = true)public class SecurityConfig extends WebSecurityConfigurerAdapter {在接⼝中如此使⽤ /** * 条件查询 */ @PreAuthorize("hasAuthority('IMPORT:SELECT')") @ApiOperation(value = "查询") @GetMapping("/list") public R
//todo int i = t(4); if(i == 2) { ShelveTask(); } Page
import tion;import ;import ist;import tion;import tions;import tionUtils;import Attribute;import ctMethodSecurityMetadataSource;import tils;
public class PrePostAnnotationSecurityMetadataSource extends AbstractMethodSecurityMetadataSource { private final PrePostInvocationAttributeFactory attributeFactory; public PrePostAnnotationSecurityMetadataSource(PrePostInvocationAttributeFactory attributeFactory) { uteFactory = attributeFactory; }
public Collection
PostInvocationAttribute post = PostInvocationAttribute(postFilterAttribute, postAuthorizeAttribute); if (post != null) { (post); }
Size(); return attrs; } } }
public Collection
private A findAnnotation(Method method, Class> targetClass, Class annotationClass) { Method specificMethod = tSpecificMethod(method, targetClass); A annotation = notation(specificMethod, annotationClass); if (annotation != null) { (annotation + " found on specific method: " + specificMethod); return annotation; } else { if (specificMethod != method) { annotation = notation(method, annotationClass); if (annotation != null) { (annotation + " found on: " + method); return annotation; } }
annotation = notation(laringClass(), annotationClass); if (annotation != null) { (annotation + " found on: " + laringClass().getName()); return annotation; } else { return null; } } }}//注解开启权限@EnableResourceServer@EnableGlobalMethodSecuritySecurityContextHolder作为全局缓存,从上下⽂获取授权信息Authentication authentication = text().getAuthentication();Collection extends GrantedAuthority> authorities = horities();上⾯权限列表初始化由具体实现类实现:public class User implements UserDetails, CredentialsContainer { ... private final Set
2023年6月20日发(作者:)
SpringSecurity怎样使⽤注解控制权限⼀般的系统在权限设计上,都会分为⾓⾊、权限(RDBC),复杂⼀点的可能会有⽤户组、组织之类的概念。⽤户的权限是写死的,对应于后台的接⼝或者资源,是没办法改变的,⼀般不对⽤户开放修改权限。管理员⽤户可以通过给⾓⾊分配权限的⽅式,来实现访问控制。所以当我们写过滤器,或者⽤⼀些安全框架时(⽐如Shiro,Spring Security),也需要将可变的“⾓⾊”,转化为不可变的“权限”,注⼊到框架中。具体的可以看我之前写的⼀篇()注⼊当前⽤户的权限后,就需要进⾏访问控制了。常见的做法有1、路径⽐对之前有个项⽬⽤过⼀次,定义⼀个过滤器,添加到security的过滤链中,在这个过滤器中做这么⼀件事:分析当前访问路径所需要的权限,检查当前⽤户是否具有该权限,做⼀个对⽐,根据对⽐结果来决定当前⽤户是否可以访问该资源。这种做法的好处是代码的⼊侵性不⾼,不需要再每个接⼝上加注解。但相对来说,显得不那么直观,可读性⽐较差,所以这次换个⽅法。2、使⽤注解的⽅式SpringSecurity使⽤注解来控制访问时,需要提前开启这个功能。在配置类上加上注解@Configuration@EnableWebSecurity@EnableGlobalMethodSecurity(prePostEnabled = true)public class SecurityConfig extends WebSecurityConfigurerAdapter {在接⼝中如此使⽤ /** * 条件查询 */ @PreAuthorize("hasAuthority('IMPORT:SELECT')") @ApiOperation(value = "查询") @GetMapping("/list") public R
//todo int i = t(4); if(i == 2) { ShelveTask(); } Page
import tion;import ;import ist;import tion;import tions;import tionUtils;import Attribute;import ctMethodSecurityMetadataSource;import tils;
public class PrePostAnnotationSecurityMetadataSource extends AbstractMethodSecurityMetadataSource { private final PrePostInvocationAttributeFactory attributeFactory; public PrePostAnnotationSecurityMetadataSource(PrePostInvocationAttributeFactory attributeFactory) { uteFactory = attributeFactory; }
public Collection
PostInvocationAttribute post = PostInvocationAttribute(postFilterAttribute, postAuthorizeAttribute); if (post != null) { (post); }
Size(); return attrs; } } }
public Collection
private A findAnnotation(Method method, Class> targetClass, Class annotationClass) { Method specificMethod = tSpecificMethod(method, targetClass); A annotation = notation(specificMethod, annotationClass); if (annotation != null) { (annotation + " found on specific method: " + specificMethod); return annotation; } else { if (specificMethod != method) { annotation = notation(method, annotationClass); if (annotation != null) { (annotation + " found on: " + method); return annotation; } }
annotation = notation(laringClass(), annotationClass); if (annotation != null) { (annotation + " found on: " + laringClass().getName()); return annotation; } else { return null; } } }}//注解开启权限@EnableResourceServer@EnableGlobalMethodSecuritySecurityContextHolder作为全局缓存,从上下⽂获取授权信息Authentication authentication = text().getAuthentication();Collection extends GrantedAuthority> authorities = horities();上⾯权限列表初始化由具体实现类实现:public class User implements UserDetails, CredentialsContainer { ... private final Set
发布评论