当前位置: 首页 > 编程日记 > 正文

RememberMe 功能的实现(base-auth使用说明)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

日常记录,代码是根据SpringSecurity写的。

###写个Entity类实现UserDetails

<!-- lang: java -->
package com.lqz.b2c.base.web.controller.member.support;import com.lqz.b2c.base.entity.Passport;
import com.lqz.base.auth.UsernameNotFoundException;
import com.lqz.base.auth.userdetails.UserDetails;public class LoginUserSupport implements UserDetails {private static final long serialVersionUID = 20130411151453L;public LoginUserSupport() {// TODO Auto-generated constructor stub}public LoginUserSupport(Passport passport) throws UsernameNotFoundException {if (passport == null || passport.getId() == null|| passport.getId() <= 0 || passport.getLoginName() == null|| passport.getPassword() == null) {throw new UsernameNotFoundException();}setId(passport.getId());setUsername(passport.getLoginName());setPassword(passport.getPassword());}private Long id;private String username;private String password;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public void setLoginName(String loginName) {this.username = loginName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}/*** 非过期账户*/@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}}

###写个处理类,继承UserDetailsService

<!-- lang: java -->
package com.lqz.b2c.base.service.impl;import javax.annotation.Resource;import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import com.lqz.b2c.base.entity.Passport;
import com.lqz.b2c.base.repository.IPassportDao;
import com.lqz.b2c.base.service.IPassportMgr;
import com.lqz.b2c.base.web.controller.member.support.LoginUserSupport;
import com.lqz.base.auth.UsernameNotFoundException;
import com.lqz.base.auth.userdetails.UserDetails;
import com.lqz.base.auth.userdetails.UserDetailsService;/*** @author 小败* */
@Service("passportMgrImpl")
@Transactional(readOnly = true)
public class PassportMgrImpl implements IPassportMgr, UserDetailsService {@Overridepublic UserDetails loadUser(Long userId, String username)throws UsernameNotFoundException, DataAccessException {Passport passport = passportDao.findByIDAndLoginName(userId, username);LoginUserSupport user = new LoginUserSupport(passport);return user;}/** 注入 **/private IPassportDao passportDao;@Resource(name = "passportDao")public void setPassportDao(IPassportDao passportDao) {this.passportDao = passportDao;}	}

###登录处使用

<!-- lang: java -->@RequestMapping(method = RequestMethod.POST)
public String login(LoginUserSupport user, HttpServletRequest request,HttpServletResponse response, RedirectAttributes redirectAttributes) {Passport passport = passportMgr.login(user.getUsername(),user.getPassword());if (passport != null) {user.setId(passport.getId());user.setPassword(passport.getPassword());rememberMeService.loginSuccess(request, response, user);return passportMgr.login(request.getSession(), passport);}redirectAttributes.addFlashAttribute("login_error", "登录失败");return "redirect:/login";
}

###退出登录处理

<!-- lang: java -->public String logout(HttpServletRequest request,HttpServletResponse response, HttpSession session) {logger.info("LogoutController#logout");rememberMeService.logout(request, response);session.invalidate();return "redirect:/";}

###拦截器自动登录实现

<!-- lang: java -->public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {/*** 判断用户有没有登录*/Passport account = (Passport) WebUtils.getSessionAttribute(request, "passport");if (account != null) {return true;}/*** 判断有没有Cookie 有的话提取Cookie 内容 */UserDetails user = rememberMeService.autoLogin(request, response);if (user == null) {return true;}/*** 自动登录*/Passport passport = passportMgr.getPassportById(user.getId());if (passport != null) {passportMgr.login(request.getSession(), passport);} else {rememberMeService.loginFail(request, response);}return true;
}

Spring 配置

<!-- lang: xml --><bean id="rememberMeService" class="com.lqz.base.auth.rememberme.TokenBasedRememberMeServices"><property name="key" value="20130411192953"/><property name="domain" value=".lqz.com"/><!-- option --><property name="parameter" value="rememberMe"/><!-- defult: remember_me --><property name="userDetailsService" ref="passportMgrImpl"/>
</bean>

原理

登录时,把数据以[用户名:时间:密码:key:id]形式加密 其中密码与key是单项加密

自动登录时,首先使用id与用户名加载用户信息. 然后把查询出来的密码与key再次加密,与上次结果比较 如果两次加密相等,则登录成功

项目地址:http://git.oschina.net/unsuccessful/rememberme

转载于:https://my.oschina.net/8E58B088F8E88B48A5/blog/122123

相关文章:

AutoML前沿技术与实践经验分享 | 免费公开课

传统机器学习的解决范式可表示为&#xff1a;ML Solution ML expertise Computation Data新机器学习范式可表示为&#xff1a;New ML Solution 100x Computation 100x Data通过表示的变化&#xff0c;可以看出&#xff0c;传统范式的“ML expertise”被“100x”的“Comput…

Windows 7 64位机上搭建Android开发环境

1、从http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html下载Java JDK&#xff0c;根据机子本身配置&#xff0c;选择jdk-7u25-windows-x64.exe下载&#xff0c;将其安装到D:\ProgramFiles\Java\jdk1.7.0_25文件夹下&#xff0c;并将D:\Pro…

近4万Star,登月源码登顶GitHub,这位女程序员“拯救”了阿波罗

作者 | 伍杏玲转载自CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;1969 年 7 月 20 日&#xff0c;“阿波罗 11 号”飞船登月&#xff0c;宇航员尼尔阿姆斯特朗&#xff08;Neil Armstrong&#xff09;成功踏上月球表面&#xff0c;标志着人类第一次踏上月球&#xff0c…

Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

1、 先按照http://blog.csdn.net/fengbingchun/article/details/10439281中操作搭建好基本的Android开发环境&#xff1b; 2、 打开Eclipse&#xff0c;-->Window-->AndroidVirtual Device Manager-->New-->AVD Name:Android_OpenGLES, Device:GalaxyNexus(4.65…

animate默认时长所带来的问题及解决

一、需求描述 做一个进度条长度逐渐减少的动画&#xff0c;当进度条长度小于等于0时&#xff0c;关闭动画&#xff0c;并弹出透明底板显示新提示。 二、问题描述 初始代码如下&#xff1a; //设置进度条初始长度 var progressLength 180; //设置一个定时器 var timer …

避坑指南:如何选择适当的预测评价指标?| 程序员评测

作者 | Nicolas Vandeput译者 | Tianyu责编 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导语】因为不存在一个适用于所有情况的评价指标&#xff0c;所以评估预测精度&#xff08;或误差&#xff09;就变成了一件不是那么容易的事情。只有通过…

利用JNI技术在Android中调用C++代码

JNI是Java Native Interface的简称&#xff0c;也就是Java本地接口&#xff0c;它提供了若干的API实现Java和其它语言的通信(主要是C&C)。 1、打开Eclipse&#xff0c;File-->New-->Project…-->AndroidApplication Project-->Application Name:TestJNI,Packag…

微软开源数据处理引擎 Trill,每天可分析万亿次事件

微软近日开源了数据处理引擎 Trill&#xff0c;它每天能够分析万亿次事件。项目地址&#xff1a;https://github.com/Microsoft/trill当下每毫秒处理大量数据正成为一种常见的业务需求&#xff0c;此次微软开源的 Trill&#xff0c;据说每秒能够处理高达数十亿事件&#xff0c;…

【杭电ACM】1097 A hard puzzle

【杭电ACM】1097 A hard puzzle http://acm.hdu.edu.cn/showproblem.php?pid1097 先用int手写了算法结果竟然wrong answer&#xff0c;估计是测试数据很大&#xff0c;直接上BigInteger 和modPow()&#xff0c;轻松解决。 1 //author:pz2 3 import java.math.BigInteger;4 im…

mvc 下的 signalR使用小结

2019独角兽企业重金招聘Python工程师标准>>> sirnal下有两种使用。 一种是 Persistent Connection &#xff0c;另外一种是Hubs 。详细请看 https://github.com/SignalR/SignalR/wiki &#xff1b; hubs支持浏览器与客户端互相调用方法。所以应用更广泛。 在前台…

利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数

1、 打开Eclipse&#xff0c;File-->New-->Project…-->Android-->AndroidApplication Project,Next-->Application Name:FillTriangle, PackageName:com.filltriangle.android,Minimum Required SDK:API 10Android2.3.3(Gingerbread),Next--&g…

Python三十年技术演变史

作者 | 宋天龙&#xff0c;大数据技术专家&#xff0c;触脉咨询合伙人兼副总裁&#xff0c;前Webtrekk中国区技术和咨询负责人&#xff08;Webtrekk&#xff0c;德国的在线数据分析服务提供商&#xff09;。擅长数据挖掘、建模、分析与运营&#xff0c;精通端到端数据价值场景设…

php 扩展包链接

https://pecl.php.net/package-stats.php?cid7转载于:https://www.cnblogs.com/gaoyuechen/p/10148754.html

面向中小企业的视频云服务 视频托管

2019独角兽企业重金招聘Python工程师标准>>> 面向中小企业的视频云服务解决方案 如果你是一个传统的企业网站&#xff0c;想要在网站首页加入一段视频&#xff0c;或者是一个垂直资讯网站想要开设视频频道&#xff0c;又或者想要进行一项活动的在线直播。这时候也许…

VS2010下编译OpenCV2.4.6静态库

1、 从 http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.3/ 下载最新的OpenCV2.4.6&#xff1b; 2、 将OpenCV-2.4.6.0.exe存放到D:\Soft\OpenCV2.4.6文件夹下&#xff0c;解压到当前文件夹下&#xff0c;生成一个opencv文件夹&#xff1b; 3、 下…

【性能优化之道】每秒上万并发下的Spring Cloud参数优化实战

一、写在前面 相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构&#xff0c;毕竟现在这是非常火的一门技术。 如果只是用户量很少的传统IT系统&#xff0c;使用Spring Cloud可能还暴露不出什么问题。 如果是较多用户量&#xff0c;高峰每秒高达上万并发请求的互联…

共话数据智能新经济,首届市北·GMIS 2019全球数据智能峰会隆重召开

7月19日&#xff0c;上海市市北高新技术服务业园区&#xff08;以下简称“市北高新”&#xff09;成功举办首届「市北GMIS 2019全球数据智能峰会」&#xff08;以下简称“市北GMIS峰会”&#xff09;。为期两天的市北GMIS峰会以“拥抱数智经济&#xff0c;赋能产业生态”为主题…

最新剑桥《AI全景报告》出炉:中国发表机器学习学术研究超过美国

来源 | 转载自新智元&#xff08;ID:AI_era&#xff09;2019年即将过去一半&#xff0c;剑桥大学的两位研究人员近日推出了本年度的State AI 2019全景报告。本报告基本沿袭去年的大体框架&#xff0c;从产业、人才、政策、预测等方面对过去一年来AI领域的技术的新进步、产业格局…

《OpenMP编译原理及实现技术》摘录

内容摘自《OpenMP编译原理及实现技术》第2章 代码测试环境&#xff1a;Windows7 64bit, VS2010, 4核机。 可以说OpenMP制导指令将C语言扩展为一个并行语言&#xff0c;但OpenMP本身不是一种独立的并行语言&#xff0c;而是为多处理器上编写并行程序而设计的、指导共享内存、多…

C# 36进制转10进制

代码是Java转过来的&#xff0c;变量名都没有改……有空再整理一下好了。public long toDecimal(string input, long bs){try{long Bigtemp 0, temp 1;int len input.Length;for (int i len - 1; i > 0; i--){if (i ! len - 1)temp * bs;long num changeDec(input[i]);…

Oracle Cloud Native Framework推出云原生解决方案

摘要&#xff1a;Oracle Cloud Native Framework云原生平台提供托管云服务和本地软件&#xff0c;同时在现Oracle云基础架构上跨应用程序配置和分析大量服务。developer relations for Oracle Cloud Infrastructure副总裁Bob Quillin讨论了该框架的优势以及对2019年云原生市场的…

OpenMP知识点汇总

1. OpenMP(Open Multi-Processing)官网&#xff1a;http://openmp.org/wp/ 2. OpenMP最新版本4.0&#xff0c;2013年7月发布。Visual Studio 2010内置支持OpenMP2.0&#xff0c;选中工程属性->C/C->Language->Open MP Support:选中Yes(/openmp)即可&#xff0c;然后在…

chsop 兼容jquery(解决与transport.js冲突)

2019独角兽企业重金招聘Python工程师标准>>> $(function() { window.__Object_toJSONString Object.prototype.toJSONString; delete Object.prototype.toJSONString; }); 要用到jquery的页面放入此代码即可 转载于:https://my.oschina.net/netmouse/blog/1241…

进程详细剖析(二)

摘自《C多核高级编程》 5.6.3 进程状态 在进程执行期间&#xff0c;它的状态会发生改变。进程的状态时指进程的当前状况。在POSIX兼容的环境中&#xff0c;进程可以处于以下状态&#xff1a; 1&#xff09;运行&#xff08;running&#xff09; 2&#xff09;就绪(runnable, r…

AI算力需求6年增长30万倍,「超异构计算」才能满足下一个10年

今年 3 月&#xff0c;「强化学习教父」Richard Sutton 在《苦涩的教训》一文中指出&#xff0c;「70 年的人工智能研究史告诉我们&#xff0c;利用计算能力的一般方法最终是最有效的方法。要在短期内有所提升&#xff0c;研究人员要利用专门领域的人类知识。但如果想要长期的获…

一览六月最热的5篇AI技术论文

作者 | 神经小姐姐转载自HyperAI超神经&#xff08;ID: HyperAI&#xff09;导语&#xff1a;始建于 1991 年的 arXiv.org 至今已收录超过 100 万篇论文预印本&#xff0c;近年来&#xff0c;其每月提交量已经超过 1 万篇。这里成为一个巨大的学习宝库。本文罗列了 arXiv.org 上…

OnCheckedChanged的触发需要AutoPostBack=true

OnCheckedChanged的触发需要AutoPostBack"true"

OpenCV中resize函数五种插值算法的实现过程

最新版OpenCV2.4.7中&#xff0c;cv::resize函数有五种插值算法&#xff1a;最近邻、双线性、双三次、基于像素区域关系、兰索斯插值。下面用for循环代替cv::resize函数来说明其详细的插值实现过程&#xff0c;其中部分代码摘自于cv::resize函数中的源代码。 每种插值算法的前…

企业金融云存储建设之路

当前世界形势千变万化&#xff0c;各种技术创新层出不穷&#xff0c;新兴业务模式也是波谲云诡&#xff0c;企业的信息化建设如何紧跟业务&#xff0c;适应业务乃至驱动业务转型是各级管理者的头等题目。对于底层执行者&#xff0c;如何能够快速满足企业的要求&#xff0c;如何…

【原创】VB利用堆栈实现算术表达式计算

这个抽象算法早已为人所知&#xff0c;只不过在VB的公开文档中鲜见示例代码。于是&#xff0c;为了提高自己的程序设计水平&#xff0c;锻炼自己的能力&#xff0c;我写了如下代码。 【VB代码版权所有&#xff0c;允许转载修改用作学习目的&#xff0c;转载必须注明来源】 【求…