资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
spring securityspring security filter的介绍,在网上有很多关于spring security的说明但是总是零碎的,都 是对部分的说明,或者就是从官网的例子中摘出来的小片段,没有一个真正企业级的应用 方案,下面就把一个企业级的介绍给大家,这里没有配置文件只是对源码的说明,随后会 提供源码和配置文件SecurityContextPersistenceFilter通过 SecurityContextRepository (默认实现类是 HttpSessionSecurityContextRepository )将 SecurityContext 保存到 SecurityContextHolder 中,SecurityContextRepository 接口方法是包括SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder);void saveContext(SecurityContext context, HttpServletRequest request, HttpServletResponse response);boolean containsContext(HttpServletRequest request);loadContext发现在过滤是调用,saveContext在一次请求结束后调用;SecurityContextHolder 通过策略模式静态的实现了 SecurityContextHolderStrategy 接 口 SecurityContextHolderStrategy 接口 clearContext(),getContext(),setContext(SecurityContext context);SecurityContext createEmptyContext();只要工作:1. 设置 SecurityContextHolder 的 SecurityContext (通过创建或者获取 SecurityContext (contextBeforeChainExecution)方式,过滤结束后清空 SecurityContextHolder 的SecurityContextHolder,保存 SecurityContextHolder (contextAfterChainExecution)ConcurrentSessionFilter通过注入的SessionRegistry还判断session的异常是否要退出登录doLogout和更新session 的时间 refreshLastRequest。SessionRegistry 的默认实现是 SessionRegistryImpl, SessionRegistry包含方法 ListvObject getAllPrincipals(),ListvSessionInformation getAllSessions(Object principal, boolean includeExpiredSessions);Sessioninformation getSessionInformation(String sessionld);void refreshLastRequest(String sessionld);registerNewSession(String sessionld, Object principal); removeSessionInformation(String sessionld);Sessioninformation 是包含 principal, sessionld, expired, lastRequest, Spring Security 用次 来判断和处理session状态和信息。注:我们在这里扩展了 ConcurrentSessionFilter 1.添加了 timeout的判断和处理,2,在获取 Sessioninformation 为 null 的情况下添加的 session 属性 SESSION_LAST_UPDATED。3.些 URI的跳过处理LogoutFilter判断是否为通过requiresLogout ()判断请求的URL是否为filterProcessesUrl(退出的URL), 如果是则调用 LogoutHandler 的 logout 方法和 LogoutSuccessHandler 的 onLogoutSuccess 方法 AbstractPreAuthenticatedProcessingFilter。说明在好的filter中都会发现有requires* ()方法来判断是否做相应的过滤处理。AbstractPreAuthenticatedProcessingFilter认证步骤1. 使用了做预认证的,首先会通过requiresAuthentication ()判断是否进行认证,requiresAuthentication ()从 SecurityContextHolder 获取权 限信息(上面介绍过) SecurityContextHolder.getContext().getAuthentication(等没有 Authentication 会去做认证, 如果已经有认证过了但是checkForPrincipalChanges=true的时候还是回去做认证的,checkForPrincipalChanges属性的配置名字可以理解就是每次Principal改变的是就重新做认 证。2. 仓 U 建一个 authentication 实 例 PreAuthenticatedAuthenticationToken , PreAuthenticatedAuthenticationToken 继 承 AbstractAuthenticationToken , AbstractAuthenticationToken 实现了 Authentication 接口 的方法Collectionv? extends GrantedAuthority getAuthorities(), Object getCredentials();Object getDetails();Object getPrincipal(); boolean isAuthenticated(); void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;3. 认证,providerManager.authenticate()这里是认证 的地方,ProviderManager 实现了 ProviderManager 接口该接口只有一个方法 authenticate, ProvideManager,可以配置多个 AuthenticationProvider, AuthenticationProvider 会被顺序认证Security 提供了 9 中认证,我只用过 DaoAuthenticationProvider 和 PreAuthenticatedAuthenticationProvider认证,这里也只介绍这两种,这里就是加入自定义认 证的地方,介绍两种我用到的这里只讲 PreAuthenticatedAuthenticationProvider,DaoAuthenticationProvider在后面的 filter 中 用到的,PreAuthenticatedAuthenticationProvider 实现了 AuthenticationProvider 接 口 authenticate,这里提到必须提到 UserDetails, UserDetails 是一个接口方法 Collection getAuthorities(); String getPassword();String getUsername();boolean isAccountNonExpired();boolean isAccountNonLocked();boolean isCredentialsNonExpired();boolean isEnabled();这些都是判断登录用户的信息的实现了此接口的类就是可以获得登录用户的信息,在PreAuthenticatedAuthenticationProvider 自 定 义 preAuthenticatedUserDetailsService 实 现 接 口 AuthenticationUserDetailsServicevPreAuthenticatedAuthenticationToken通过 loadUserDetails 获取UserDetails,成功获取后,马上通过 UserDetailsChecker 类检测 UserDetails,检测的接口是 UserDetailsChecker,接 口只有一个方法check,这里默认用的是AccountStatusUserDetailsChecker ()来做检测的, check通过后创建PreAuthenticatedAuthenticationToken,到此惊心动魄的认证就结束了! 如果认证通过了就不会做其他的认证了,如果没有通过会依次把你提供的认证都进行下去。 但是自己这个filter中认证没有通过不代表认证全部失败,因为在以后的filter中还认证,这 也是没有讲DaoAuthenticationProvider认证的原因认 证 失 败 会 调 用 unsuccessfulAuthentication () 清 空 SecurityContext,SecurityContextHolder.clearContext(),在 request 添力口 属性保存 AUTHENTICATION_EXCEPTION,UsernamePasswordAuthenticationFilter这个 filter 继承 AbstractAuthenticationProcessingFilter 是为 browser-based HTTP-based 提供的, 在这个 filter 必须提供一个 AuthenticationManager,通过 providerManager 认证。我们 自 定义了 这个 filter , 继承 UsernamePasswordAuthenticationFilter, 重写的了 attemptAuthentication发现,这个方法就是认证的方法认证过程如下1. 通过requiresAuthentication ()判断是否是要认证的 URL。是就会用 AbstractAuthenticationProcessingFilter 做认证。2. 在 UsernamePasswordAuthenticationFilter 的 attemptAuthentication 方法通过用户名和密码仓U 建了 一个 UsernamePasswordAuthenticationToken ( UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password),也是继承自 AbstractAuthenticationToken3. 接下来就是认证管理其来了做认证了 this.getAuthenticati
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号