SpringSecurity对权限的校验主要有注解和路径校验。本文主要解释基于路径校验。
SpringSecurity对权限的校验主要通过FilterSecurityInterceptor这个过滤链实现的。
FilterSecurityInterceptor实现权限校验主要流程
FilterSecurityInterceptor源码
FilterSecurityInterceptor主要通过doFilter()中的invoke()方法。
在调用父类的beforeInvocation()方法。
Collection<ConfigAttribute> attributes = this.obtainSecurityMetadataSource().getAttributes(object);
这个过程主要是获取访问当前路径所需要的权限集合attributes ,所以我们可以定义个类,继承FilterInvocationSecurityMetadataSource接口,重写里面的getAttributes()方法,这样就可以实现根据数据库动态获取路径对应的权限信息集合。
attemptAuthorization(object, attributes, authenticated);
这个方法调用的主要为
this.accessDecisionManager.decide(authenticated, object, attributes);
这个方法的主要作用是对权限的判断,是否有权限。所有可以实现AccessDecisionManager接口里面的decide()方法,自定义判断该用户是否有权限。
总结:综上所述,我们可以实现FilterInvocationSecurityMetadataSource,AccessDecisionManager这两个接口,在配置到SecurityConfig的配置类型,就可以实现自定义权限。