rememberme多久_使用Spring Security添加RememberMe身份验证

rememberme多久

我在“ 向Jiwhiz博客添加社交登录”一文中提到,RememberMe功能不适用于Spring Social Security。 好吧,这是因为该应用程序现在不通过用户名和密码对用户进行身份验证,并且完全依靠社交网站(例如Google,Facebook和Twitter)来完成此工作。 Spring Security的默认配置无法处理这种情况。 Spring Security可能是所有Spring Portfolio项目中最复杂的软件。 为了使一个非常简单的Web应用程序具有安全性,大约需要正确设置10个过滤器。 为了简化应用程序开发,Spring Security从2.0版开始提供名称空间配置,以自动将所有必需的组件一起设置,因此开发人员无需弄清楚细节。 除非您的应用程序与传统应用程序不同,否则它对大多数Web应用程序都非常有效。

将网站登录过程从用户名密码身份验证更改为没有密码的Spring Social Security之后 ,“记住我”的旧配置不再起作用。 Spring Security参考文档几乎没有关于Remember-Me Authentication的解释,所以我买了Spring Security项目负责人Rob Winch编写的书Spring Security 3.1 。 这本书整整一章都在讨论“记住我”服务,它对我在Spring Security中如何理解记住我的工作大有帮助。 读完本书后,我觉得阅读Spring Security源代码要容易得多,并且阅读源代码总是很有趣的。

由于我没有存储用户帐户的密码,因此默认的TokenBasedRememberMeServices无法与我的应用程序一起使用,并且我也不想创建自己的RememberMeServices-太多的工作。 幸运的是,还有另一种持久令牌方法 ,即将令牌存储到数据库中并比较cookie中的令牌。 我需要的是使用PersistentTokenRepository在我的应用程序中自定义PersistentTokenBasedRememberMeServices来存储令牌。 Spring Security提供了PersistentTokenRepository的JDBC实现,我发现在阅读源代码之后编写自己的MongoDB实现非常简单。

第一步是将PersistentRememberMeToken数据存储到MongoDB。 我需要为其添加一个域实体类:

@Document(collection = 'RememberMeToken')
public class RememberMeToken extends BaseEntity{private String username;@Indexedprivate String series;private String tokenValue;private Date date;... // getter/setter omittedpublic RememberMeToken(){}public RememberMeToken(PersistentRememberMeToken token){this.series = token.getSeries();this.username = token.getUsername();this.tokenValue = token.getTokenValue();this.date = token.getDate();}}

接下来,使用Spring Data为实体添加一个存储库:

public interface RememberMeTokenRepository extends MongoRepository<RememberMeToken, String>{RememberMeToken findBySeries(String series);List<RememberMeToken> findByUsername(String username);
}

然后,唯一相对繁重的编码是为MongoDB实现PersistentTokenRepository:

public class MongoPersistentTokenRepositoryImpl implements PersistentTokenRepository {private final RememberMeTokenRepository rememberMeTokenRepository;public MongoPersistentTokenRepositoryImpl(RememberMeTokenRepository rememberMeTokenRepository){this.rememberMeTokenRepository = rememberMeTokenRepository;}@Overridepublic void createNewToken(PersistentRememberMeToken token) {RememberMeToken newToken = new RememberMeToken(token);this.rememberMeTokenRepository.save(newToken);}@Overridepublic void updateToken(String series, String tokenValue, Date lastUsed) {RememberMeToken token = this.rememberMeTokenRepository.findBySeries(series);if (token != null){token.setTokenValue(tokenValue);token.setDate(lastUsed);this.rememberMeTokenRepository.save(token);}}@Overridepublic PersistentRememberMeToken getTokenForSeries(String seriesId) {RememberMeToken token = this.rememberMeTokenRepository.findBySeries(seriesId);return new PersistentRememberMeToken(token.getUsername(), token.getSeries(), token.getTokenValue(), token.getDate());}@Overridepublic void removeUserTokens(String username) {List<RememberMeToken> tokens = this.rememberMeTokenRepository.findByUsername(username);this.rememberMeTokenRepository.delete(tokens);}
}

剩下的工作就是所有配置。 我需要在Java配置类中将它们连接在一起:

@Configuration
public class SocialAndSecurityConfig {@Injectprivate Environment environment;@Injectprivate AccountService accountService;@Injectprivate AuthenticationManager authenticationManager;@Injectprivate RememberMeTokenRepository rememberMeTokenRepository;...@Beanpublic RememberMeServices rememberMeServices(){PersistentTokenBasedRememberMeServices rememberMeServices = new PersistentTokenBasedRememberMeServices(environment.getProperty('application.key'), accountService, persistentTokenRepository());rememberMeServices.setAlwaysRemember(true);return rememberMeServices;}@Bean public RememberMeAuthenticationProvider rememberMeAuthenticationProvider(){RememberMeAuthenticationProvider rememberMeAuthenticationProvider = new RememberMeAuthenticationProvider(environment.getProperty('application.key'));return rememberMeAuthenticationProvider; }@Bean public PersistentTokenRepository persistentTokenRepository() {return new MongoPersistentTokenRepositoryImpl(rememberMeTokenRepository);}
}

最后一步是将“记住我”服务添加到安全性xml配置文件中,这是xml配置的最后一部分,我们现在无法消除它。 (更新:一个新项目Spring Security Java Config将用Spring Security中的Java config替换xml配置。)

<?xml version='1.0' encoding='UTF-8'?>
<beans:beans xmlns='http://www.springframework.org/schema/security'xmlns:beans='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd'><http use-expressions='true' entry-point-ref='socialAuthenticationEntryPoint'><custom-filter position='PRE_AUTH_FILTER' ref='socialAuthenticationFilter' /><logout logout-url='/signout' delete-cookies='JSESSIONID' /><remember-me services-ref='rememberMeServices' /><!-- Configure these elements to secure URIs in your application --><intercept-url pattern='/favicon.ico' access='permitAll' /><intercept-url pattern='/robots.txt' access='permitAll' /><intercept-url pattern='/resources/**' access='permitAll' /><intercept-url pattern='/signin' access='permitAll'requires-channel='#{environment['application.secureChannel']}' /><intercept-url pattern='/signin/*' access='permitAll'requires-channel='#{environment['application.secureChannel']}' /><intercept-url pattern='/presentation/**' access='hasRole('ROLE_USER')'requires-channel='#{environment['application.secureChannel']}' /><intercept-url pattern='/myAccount/**' access='hasRole('ROLE_USER')'requires-channel='#{environment['application.secureChannel']}' /><intercept-url pattern='/myPost/**' access='hasRole('ROLE_AUTHOR')'requires-channel='#{environment['application.secureChannel']}' /><intercept-url pattern='/admin/**' access='hasRole('ROLE_ADMIN')'requires-channel='#{environment['application.secureChannel']}' /><intercept-url pattern='/**' access='permitAll' /></http><authentication-manager alias='authenticationManager'><authentication-provider ref='socialAuthenticationProvider' /><authentication-provider ref='rememberMeAuthenticationProvider' /></authentication-manager></beans:beans>

这就是向我的博客应用程序添加“记住我的身份验证”的全部方法。 现在,您可以通过Google / Facebook / Twitter登录到我的网站,该网站将在接下来的两周内始终记住您。

参考:来自Jiwhiz博客的JCG合作伙伴 Yuan Ji 添加了Spring Security的RememberMe身份验证 。

翻译自: https://www.javacodegeeks.com/2013/03/add-rememberme-authentication-with-spring-security.html

rememberme多久

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 9:对可选的增强

之前 &#xff0c;我写过Java 8中引入的Optional类&#xff0c;该类用于对可能不存在的值进行建模并减少可能引发NullPointerException的位置的数量。 Java 9向Optional添加了三个新方法&#xff1a; 1. ifPresentOrElse 新ifPresentOrElse方法允许你执行一个动作&#xff0c…

电脑还原Mac地址

之前修改过电脑Mac&#xff0c;现在与手机Mac冲突&#xff0c;导致手机无法连接校园网。 控制面板——》打开网络和共享中心——》选择更改适配器设置 本地连接——》右键选择属性 上图选择配置 高级——》在下拉菜单中选择网络地址——》右边选为“不存在” 之后本地连接会自…

聊天ListView使用ViewHolder

聊天界面会展示至少两种布局&#xff0c;即收到消息和发送消息。这样一个ListView与平时使用的ListView的最大不同&#xff0c;在于它有两个不同的布局&#xff1a;收到的布局和发送的布局。需要利用Adapter实现这样的效果。即需要在获取布局的时候判断该获取哪个布局。 public…

动态改变ListView布局

在getView()时&#xff0c;通过判断选择加载不同的布局。 点击某个item的时候&#xff0c;变为foucus状态&#xff0c;其他的items还原。 下面用两个方法给item设置两个不同的布局。 //foucus状态&#xff0c;显示一个ImageViewprivate View addFocusView(int i) {ImageView…

jpa 关系拥有方_JPA:确定关系的归属方

jpa 关系拥有方使用Java Persistence API&#xff08;JPA&#xff09;时&#xff0c;通常需要在两个实体之间创建关系。 这些关系是通过使用外键在数据模型&#xff08;例如数据库&#xff09;中定义的&#xff0c;而在我们的对象模型&#xff08;例如Java&#xff09;中则使用…

JDBC连接备忘单

抽象 这是常见数据库的JDBC连接的快速参考。 我似乎必须大量查找此信息&#xff0c;因此我认为最好将所有参考资料放在一个地方。 德比 <dependency><groupId>org.apache.derby</groupId><artifactId>derbyclient</artifactId><version>1…

获取View坐标

滑动一个View&#xff0c;即移动一个View&#xff0c;改变其当前所处的位置&#xff0c;通过不断改变View的坐标实现滑动的效果。 1、Android坐标系&#xff1a;坐标原点在屏幕左上角。 public void getLocationOnScreen(int[] location) Computes the coordinates of this vi…

李宏毅 课程打包_按功能而不是按层打包课程

李宏毅 课程打包大多数企业Java应用程序在设计上都有一些相似之处。 这些应用程序的打包通常由它们使用的框架&#xff08;如Spring&#xff0c;EJB或Hibernate等&#xff09;驱动。或者&#xff0c;您可以按功能对打包进行分组。 像任何其他有关建模的项目一样&#xff0c;这也…

error inflating class binaryXML LayoutParams addRule()

报出异常的原因是由于少添加了构造方法&#xff0c;三个构造方法需要写完整&#xff0c;不能只写一个。参数为(Context, AttributeSet)&#xff0c;其中第二个参数用来将xml文件中的属性初始化。 自定义控件若需要在xml文件中使用&#xff0c;就必须重写带如上两个参数的构造方…

AppD方法:Java 9支持

通过从应用程序中学习企业APM产品&#xff0c;发现更快&#xff0c;更高效的性能监控。 参加AppDynamics APM导览&#xff01; 阅读有关Java 9模块化功能带来的挑战以及AppDynamics保持在该领域的领导者的严格要求的更多信息。 我们很高兴宣布Java 17全面支持&#xff0c;这是…

Java反射,但速度更快

在编译时不知道Java类的最快方法是什么&#xff1f; Java框架通常会这样做。 很多。 它可以直接影响其性能。 因此&#xff0c;让我们对不同的方法进行基准测试&#xff0c;例如反射&#xff0c;方法句柄和代码生成。 用例 假设我们有一个简单的Person类&#xff0c;其中包含名…

Git时间

1、Git是目前世界上最先进的分布式版本控制系统。和集中式版本控制系统相比&#xff0c;分布式版本控制系统的安全性要高很多&#xff0c;因为每个人电脑里都有完整的版本库&#xff0c;某一个人的电脑坏掉了不要紧&#xff0c;随便从其他人那里复制一个就可以了。而集中式版本…

横、竖分割线

竖分割线&#xff1a; <View android:layout_width"0.5px" android:layout_height"120dp" android:background"#B8B8B8" android:visibility"visible" /> <!-- 竖直线 -->横分割线&#xff1a;<Viewandroid:layout…

java中update_Java 7 Update 21安全改进的详细信息

java中updateOracle昨天发布了三个Java更新 。 重要的是要注意它们包含一些与安全性相关的更改。 一段时间以来&#xff0c;这些变更中的大多数已经宣布&#xff0c;首先要注意的是Oracle按计划交付。 Oracle公司Java平台安全经理米尔顿史密斯&#xff08;Milton Smith&…

访问GitHub超慢的解决办法

是github某个CDN(Content Delivery Network&#xff0c;即内容分发网络?)被屏蔽所致。 附件--->记事本&#xff08;选择以管理员身份运行&#xff09;——文件——打开C:\Windows\System32\drivers\etc 右下角选择“所有文件” 选择hosts 打开 如图在这行下面添加绑定IP…

学习使用Whally GraalVM!

介绍 在Truffle在神圣的Graal中服务&#xff1a;Graal和Truffle在JVM上进行多语种语言解释的帖子中&#xff0c;我们得到了简短的介绍&#xff0c;并对Graal&#xff0c;Truffle及其周围的一些概念进行了深入研究。 但是&#xff0c;如果不深入研究实用性&#xff0c;那么任何技…

colos.xml

<?xml version"1.0" encoding"utf-8"?> <!-- /* //device/apps/common/assets/res/any/colors.xml ** ** Copyright 2006, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License");…

Android样式开发---shape

Thanks to:转载自Keegan小钢 原文链接&#xff1a;http://keeganlee.me/post/android/20150830 一个应用&#xff0c;应该保持一套统一的样式&#xff0c;包括Button、EditText、ProgressBar、Toast、Checkbox等各种控件的样式&#xff0c;还包括控件间隔、文字大小和颜色、阴影…

主键能否@onetoone_双向@OneToOne主键关联

主键能否onetoone现在该继续有关Hibernate的文章了。 最后一个致力于单向OneToOne关联 。 因此&#xff0c;今天我将向您展示如何获取双向OneTonOne主键关联 。 本教程中基于前一篇文章的示例。 让我们开始吧。 我将使用以前创建的相同表。 为了建立双向一对一关联&#xff0c…

Android样式开发--selector

Thanks to 转载自Keegan小钢 原文链接&#xff1a;http://keeganlee.me/post/android/20150905 上一篇详细讲了shape的用法&#xff0c;讲解了怎么用shape自定义矩形、圆形、线形和环形&#xff0c;以及有哪些需要注意的地方。不过&#xff0c;shape只能定义单一的形状&#xf…