权限学习 -- Spring Security拦截器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34871626/article/details/78650112

Spring Security权限拦截:

Spring Security提供很多的过滤器,它们拦截servlet请求,并将这些请求转交给认证处理过滤器和访问角色过滤器进行处理,并强制安全性,认证用户身份和权限以达到保护web资源的目的。

SecurityContextPersistenceFileter,,改过滤器位于所有过滤器的顶端,是第一个起作用的过滤器,它的第一个用途是在执行其他过滤器之前,率先判断用户的session是否已经存在Spring Security的上下文的 Spring SecurityContext,如果存在就把Spring SecurityContext拿出来放到SecurityContextHolder中,供Spring Security的其他部分使用,如果不存在就创建一个SecurityContext出来放到SecurityContextHolder中。它的第二个用途是在所有过滤器执行完毕后清空SecurityContextHolder的内容,因为SecurityContextHolder是基于ThreadLocal,如果在操作完后没有清空ThreadLocal,会受到服务器线程池机制的影响。

ThreadLocal存放的值实在线程内共享的,线程间互斥,主要用于线程间共享数据,避免通过参数来传递,这样处理后能够优雅的解决实际中的一些并发问题。ThreadLocal中有有个set方法,其下有ThreadLocalMapThreadLocalMapThreadLocal底下的内部类。当使用ThreadLocalMap存值时,首先获取当前的线程对象,然后获取到线程当前本地的对象,本地变量map,最后将当前使用的所有ThreadLocal和传入的值放入到map中,也就是说所有的ThreadLocalMap中存储值得key是所有的ThreadLocal对象。这样做的好处是,所有的ThreadLocal都对应一个本地变量的map,所以一个线程可以存在多个本地变量。如果之前没有对ThreadLocalMap进行getset操作,那么从ThreadLocalMap中拿到的值就为空,这是get方法会返回初始值。当我们有需要第一次get就返回一个值时,是可以继承ThreadLocal并且覆盖初始值方法。ThreadLocal是解决线程安全很好的思路,他通过对每个线程提供一个独立的变量副本解决变量并发访问的冲突问题。在很多情况下ThreadLocal它的同步机制解决线程安全会变得非常简单。当我们使用ThreadLocal时,需要注意,当一个线程结束时,要把当前ThreadLocal里面的信息移除掉。

LogoutFileter,这个Fileter只处理注销请求j_spring_security_logout。它是在用户发送注销请求时,销毁用户的session,清空SecurityContextHolder,然后重定向到注销成功页面,可以与rememberme之类的功能机制结合,在注销的同时,清空用户的cookie

AbstractAuthnticationProcessingFilter:这个Filter是处理form登录的过滤器。与form有关的所有操作都在此进行。默认情况下它处理j_spring_security_check这个请求。这个请求是用户form登陆的提交地址,此过滤器执行的基本操作是通过用户名及密码判断用户是否有效,如果登录成功就跳转到登录成功页面。它可以是登录之前受保护的页面也可以是默认的成功页面。如果登录失败则跳转到登录失败页面。

DefaultLoginPageGeneratingFilter:这个过滤器是用来生成一个默认的登录界面。默认的登录地址为spring_security_login,这个登录页面虽然支持用户输入用户名密码,也支持rememberme等功能,但基本不会用在实际项目上。

BascieAuthenticationFilter,该过滤器主要用于Bascie验证的。功能与AbstractAuthnticationProcessingFilter很类似,只是验证的方式不同。

SecurityContextHolderAwareRequestFilter,该过滤器是用来包装用户的请求,目的实在原来请求的基础之上对后续的程序提供额外的数据。

RememberMeAuthenticationFilter,该过滤器实现的是RememberMe功能,当用户cookie中存在RememberMe标识时,他会根据标记自动识验用户登录,并创建SecurityContext,授予对应的权限Spring SecurityRememberMe功能是基于cookie实现的,当用户登录的时候使用RememberMe时,系统就会在登录成功后,将为用户生成一个唯一的标识,并将这个标识保存进cookie中。我们可以通过浏览器查看用户电脑中的cookie

AnonymousAuthenticationFilter,这个Filter是为了保证我们操作的统一性,当用户未登录时,默认为用户分配匿名用户的权限。

ExceptionTranslationFilter:该过滤器的作用是为了处理FilterSecurityInterceptor中抛出的异常,然后将请求重定向到对应的页面或返回对应的响应错误代码。

SessionMManagementFilter:该过滤器主要是为了防御会话伪造攻击,这个主要实在用户登录之后销毁用户的当前session并重新生成一个session

FilterSecurityInterceptor:用户的权限控制都包含在这个过滤器上。它的第一个功能是如果用户尚未登录,那么抛出尚未认证的异常,它的的第二个功能是如果用户已登录,但是没有访问当前资源的权限,它会抛出拒绝访问的异常,它的第三个功能是如果用户已登录也具有访问当前资源的权限那么则放行。

FilterChainProxyFilterChainProxy会按照顺序来调用一组Filter,使这些Filter既能完成验证授权的本质工作又能享用Spring IOC的功能,来很方便的得到其他依赖的资源。

展开阅读全文

没有更多推荐了,返回首页