梳理权限管理的流程: -------登录权限验证 登录之后通过userInfoProvider这个类, 拿到用户信息中: 这个类负责的是只是获取登陆用户的详细信息(包括密码、角色、权限等)具体信息为: User对象,dataLevel,GrantedAuthority 不负责和前端传过来的密码对比,只需返回User对象,后会有其他类根据User对象对比密码的正确性(框架帮我们做)。 拿到用户信息后, authenticationManager对比用户的密码(即验证用户) 然后这个AuthenticationProcessingFilter拦截器就过咯。 登录成功之后通过security的xml文件的默认成功跳转页面/home进入首页(/home需要判断权限) -------请求权限验证 1.AbstractSecurityInterceptor:请求拦截器 每访问一个url都会被拦截器AbstractSecurityInterceptor拦截 * 首先,登陆后,每次访问资源都会被这个拦截器拦截,会执行doFilter这个方法, * 这个方法调用了invoke方法,其中fi断点显示是一个url(可能重写了toString方法吧,但是里面还有一些方法的), * 最重要的是beforeInvocation这个方法,它首先会调用MyInvocationSecurityMetadataSource类的getAttributes方法 * 获取被拦截url所需的权限,在调用MyAccessDecisionManager类decide方法判断用户是否够权限。弄完这一切就会执行下一个拦截器。 2.MySecurityMetadataSource:资源管理器 将所有的资源和权限对应关系建立起来,即定义某一资源可以被哪些角色访问 URL-Collection<ConfigAttribute>某个url对应的所需权限集合,其实url对应一个权限代码 * 上面的拦截器会首先调用这个类来,这个类是负责的是获取角色与url资源的所有对应关系,并根据url查询对应的所有角色。 * 然后getAttributes根据参数(被拦截url)返回权限集合。 * 返回url对应的所需权限集合Collection<ConfigAttribute> 通过以上步骤我们获得了user的全部权限和某个url的所需要的权限,下面的工作就简单了 3.MyAccessDesisionmanager:访问决策器 决定某个用户具有的角色,是否有足够的权限去访问某个资源 ,做最终的访问控制决定 * decide方法里面写的就是授权策略了,笔者的实现是,没有明说需要权限的(即没有对应的权限的资源), * 可以访问,用户具有其中一个或多个以上的权限的可以访问。这个就看需求了,需要什么策略,读者可以自己写其中的策略逻辑。 * 通过就返回,不通过抛异常就行了,spring security会自动跳到权限不足页面(配置文件上配的)。
Spring权限管理系统流程梳理
最新推荐文章于 2024-04-20 02:58:45 发布