如何进行个性化认证以及RememberMe实现


如何进行个性化认证以及RememberMe实现,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把Spring Security 、Spring Security Oauth 香港云主机3 等权限、认证相关的内容、原理及设计学习并整理一遍。本系列文章就是在学习的过程中加强印象和理解所撰写的,如有侵权请告知。项目环境: > – JDK1.8 > – Spring boot 2.x > – Spring Security 5.x   在 授权过程 和 认证过程 中我们都是使用的 Security 默认的一个登录页面(/login),那么如果我们想自定义一个登录页面该如何实现呢?其实很简单,我们新建 FormAuthenticationConfig 配置类,然后在configure(HttpSecurity http) 方法中实现以下设置:  最后在 SpringSecurityConfig 的 configure(HttpSecurity http) 方法中 调用 formAuthenticationConfig.configure(http) 即可;   正如看到的一样,我们通过 loginPage()设置 登录页面接口, 通过 loginProcessingUrl() 设置 UsernamePasswordAuthenticationFilter 要匹配的 接口地址(一定是Post)(看过授权过程的同学应该都知道其默认的是/login)。 这里有以下几点值得注意:> – loginPage() 这里配置的 地址(不管是接口url还是登录页面)一定要配置成无权限访问,否则将出现 一直重定向问题(因为无权限后又会重定向到这里配置的登录页url > – loginPage() 一般来说不直接设置成(登录)接口,因为设置了接口会配置成无权限即可访问(当然设置成登录页面也需要配置无权限访问),所以会走匿名filter, 也就意味着不会走认证过程了,所以我们一般不直接设置成接口地址 > – loginProcessingUrl() 这里修改后的 url 会意味着 UsernamePasswordAuthenticationFilter 将 验证此处的 url > – loginProcessingUrl() 这里设置的 Url 是有默认无权限访问的,与 loginPage设置的接口地址是有 区别, 一但 loginPage 设置了的是接口url,那么此处配置将无任何意义 > – successHandler() 和 failureHandler 分别 设置认证成功处理器 和 认证失败处理器 (如果对这2个处理器没印象的话,建议回顾下授权过程)   在授权过程中,我们增简单提及到过这2个处理器,在Security中默认的处理器分别是SavedRequestAwareAuthenticationSuccessHandler 和 SimpleUrlAuthenticationFailureHandler ,这次我们自定义这2个处理器,分别为 CustomAuthenticationSuccessHandler ( extends SavedRequestAwareAuthenticationSuccessHandler ) 重写 onAuthenticationSuccess() 方法 :和 CustomAuthenticationFailureHandler( extends SimpleUrlAuthenticationFailureHandler) 重写 onAuthenticationFailure() 方法 :这里就不再描述,直接贴代码:  注意这里请求的地址是 loginProcessingUrl() 配置的地址  这里就不在贴结果图了,只要我们明白结果流程就行是这样的就可以: localhost:8080 ——> 点击 测试验证Security 权限控制 ————> 跳转到 我们自定义的 /loginUp.html 登录页,登录后 ————> 有配置loginSuccessUrl,则跳转到 loginSuccess.html;反之则直接跳转到 /get_user/test 接口返回结果。 整个流程就全面涉及到了我们自定义的登录页面、自定义的登录成功/失败处理器。1、 创建 persistent_logins 表,用于存储token和用户的关联信息:2 、 添加rememberMe配置 信息这里解释下配置:rememberMe() 开启 记住我功能,意味着 RememberMeAuthenticationFilter 将会 从Cookie 中获取token信息tokenRepository() 配置 token的获取策略,这里配置成从数据库中读取userDetailsService() 配置 UserDetaisService (如果不熟悉该对象,建议回顾认证过程)tokenValiditySeconds() 设置 rememberMe 的有效时间,这里通过 配置来设置另一个重要的配置在登录页面,这里的 必须是 name=”remember-me” ,rememberMe就是通过验证这个配置来开启remermberMe功能的。  实操结果应该为:进入登陆页面 ——> 勾选记住我后登录 ——> 成功后,查看persistent_logins 表发现有一条数据——> 重启项目 ——> 重新访问需要登录才能访问的页面,发现无需登录即可访问——> 删除 persistent_logins 表数据,等待token设置的有效时间过期,然后重新刷新页面发现跳转到登陆页面。   首先我们查看UsernamePasswordAuthenticationFiler(AbstractAuthenticationProcessingFilter) 的 successfulAuthentication() 方法内部源码:其中我们发现我们本次重点关注的一行代码: rememberMeServices.loginSuccess(request, response, authResult) , 查看这个方法内部源码:通过 rememberMeRequested() 判断是否勾选了记住我。 onLoginSuccess() 方法 最终会调用到 PersistentTokenBasedRememberMeServices 的 onLoginSuccess() 方法,贴出其方法源码如下:分析下源码步骤:获取 账户信息 username传入 username 创建 PersistentRememberMeToken 对象通过 tokenRepository 存储 persistentRememberMeToken信息将 persistentRememberMeToken 信息添加到Cookie中  这里的 tokenRepository 就是我们配置 rememberMe功能所设置的。经过上面的解析我们看到了rememberServices 将 创建一个 token 信息,并存储到数据库(因为我们配置的是数据库存储方式 JdbcTokenRepositoryImpl )中,并将token信息添加到Cookie中了。到这里,我们看到了RememberMe实现前的一些业务处理,那么后面如何实现RememberMe,我想大家心里大概都有个底了。这里直接抛出之前授权过程中我们没有提及到的 filter 类 RememberMeAuthenticationFilter,它是介于 UsernamePasswordAuthenticationFilter 和 AnonymousAuthenticationFilter 之间的一个filter,它主要负责的就是前面的filter都没有认证成功后从Cookie中获取token信息然后再通过tokenRepository 获取 登录用户名,然后UserDetailsServcie 加载 UserDetails 信息 ,最后创建 Authticaton(RememberMeAuthenticationToken) 信息再调用 AuthenticationManager.authenticate() 进行认证过程。RememberMeAuthenticationFilter  我们来看下 RememberMeAuthenticationFilter 的dofiler方法源码:我们主要关注 rememberMeServices.autoLogin(request,response) 方法实现,查看器源码:内部实现步骤:从Cookie中获取 token 信息并解析通过 解析的token 生成 UserDetails (processAutoLoginCookie() 方法实现 )通过 UserDetails 生成 Authentication ( createSuccessfulAuthentication() 创建 RememberMeAuthenticationToken )其中最关键的一部是 processAutoLoginCookie() 方法是如何生成UserDetails 对象的,我们查看这个方法源码实现:我们看下其内部步骤:通过 tokenRepository 加载数据库token信息判断 用户传入token和数据中的token是否一致,不一致可能存在安全问题更新 token 并添加到Cookie中通过 UserDetailsService().loadUserByUsername() 方法加载UserDetails 信息并返回   看到这里相信大家以下就明白了,当初为啥在启用rememberMe功能时要配置 tokenRepository 和 UserDetailsService了。这里我就不再演示整个实现的流程了,老规矩,上流程图:看完上述内容,你们掌握如何进行个性化认证以及RememberMe实现的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注开发云行业资讯频道,感谢各位的阅读!

相关推荐: MySQL数据库中怎么避免重复插入数据

这期内容当中小编将会给大家带来有关MySQL数据库中怎么避免重复插入数据,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。上述就是小编为大家分享的MySQL数据库中怎么避免重复插入数据了,如果刚好 香港云主机有类似的疑惑,不妨参…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 08/12 20:20
Next 08/12 20:21

相关推荐