RememberMe 功能的实现(base-auth使用说明)
2019独角兽企业重金招聘Python工程师标准>>>
日常记录,代码是根据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
RememberMe 功能的实现(base-auth使用说明)相关推荐
- 【Spring Security】的RememberMe功能流程与源码详解
文章目录 前言 原理 基础版 搭建 初始化sql 依赖引入 配置类 验证 源码分析 进阶版 集成 源码分析 疑问1 疑问2 鉴权 升级版 集成 初始化sql 配置类 验证 源码分析 鉴权 流程 扩展版 ...
- [shiro] - 加入rememberMe功能
shiro不加入rememberMe没事,一加入就出错. RememberMeAuthenticationToken : public interface RememberMeAuthenticati ...
- Spring boot中使用Spring Security的记住我 remember-me功能
Spring boot中使用Spring Security的记住我 remember-me功能 问题描述:Spring security新手,在登录时加上记住我功能,需要使用框架自带的记住我. 记住的 ...
- Spring Security(12)——Remember-Me功能
Remember-Me功能 目录 1.1 概述 1.2 基于简单加密token的方法 1.3 基于持久化token的方法 1.4 Remember-Me相关接口和实现类 ...
- Remember-Me功能
概述 Remember-Me是指网站能够在Session之间记住登录用户的身份,具体来说就是我成功认证一次之后在一定的时间内我可以不用再输入用户名和密码进行登录了,系统会自动给我登录.这通常是通过服务 ...
- SpringSecurity详细介绍RememberMe功能
本文我们来实现下SpringSecurity的RememberMe功能 一.rememberMe功能实现 接下来我们看看具体怎么实现rememberMe功能 1.表单记住我选项 <%--Cr ...
- Spring Security实现RememberMe功能以及原理探究
在大多数网站中,都会实现RememberMe这个功能,方便用户在下一次登录时直接登录,避免再次输入用户名以及密码去登录,下面,主要讲解如何使用Spring Security实现记住我这个功能以及深入源 ...
- Shiro的 rememberMe 功能使用指导(为什么rememberMe设置了没作用?)
问题 shiro中提供了rememberMe功能,它用起来是这样的 UsernamePasswordToken token = new UsernamePasswordToken(loginForm. ...
- Shiro学习之RememberMe功能实现
目录 前言 更换MySQL数据库 一.更换依赖 二.更改配置 三.改换建表语句 Shiro的配置 控制层的改进 实际展示 咨询请找 前言 在网上看了一个开源的springboot项目,上面有非常全的s ...
最新文章
- win10安装java+hadoop+spark
- 如何设计一门语言(八)——异步编程和CPS变换
- qtp web随机获取下拉框的值
- emcy协议_CANopen协议 -
- C语言控制结构程序设计,第3讲 C语言程序的基本控制结构_C语言程序设计(上)_pps_大学课件预览_高等教育资讯网...
- three.js 渲染器更改背景色的几种方法
- linux中dns超时时间,Linux DNS timeout, attempts.---DNS超时,重试的配置
- 算法研发---对宏定义#define相关研究
- 认识与防御XSS攻击
- BootStrapCSS样式和JS插件
- HTML5汽车赛道飙车游戏免费源码下载
- SQL Server 2012 查看数据库属性
- 同济大学研究生 计算机 哪个校区,同济大学研究生院在哪个校区?宿舍条件好不好?有哪些招生专业目...
- 搭建Kangle+EasyPanel+WHMCS实时开通付费虚拟空间
- 我感觉被骗了,微信内测 “大小号” 功能,同一手机号可注册两个微信
- ansible的使用
- 【项目整理】一个好看的导航栏
- 微信公众号怎么集赞服务器,【微信点赞】_微信怎么点赞如何集赞微信点赞活动新手必备点赞教程...
- Parsing error: No Babel config file detected for
- 微信小程序 | 小程序系统API调用