Spring-Security (学习记录五)--配置登录时,密码采用md5加密,以及获取登录信息属性监听同步自己想要的登录信息
[Toc]
#1. PasswordEncoder 采用密码加密
使用前面的例子。可以看出我们数据库密码是采用明文的,我们在登录的时候也需要将传递的明文密码使用对应的算法加密后再与保存好的密码比较,这样比较好,Spring-Security也有支持通过在authentication-provider下定义一个password-encoder我们可以定义当前AuthenticationProvider需要在进行认证时需要使用的password-encoder。password-encoder是一个PasswordEncoder的实例,我们可以直接使用它,如:
<!-- 认证管理器,配置了管理员与角色的关系 -->
<security:authentication-manager alias="authenticationManager">
<!-- accountService 实现了UserDetailsService接口
-->
<security:authentication-provider user-service-ref="accountService">
<!-- 密码采用md5加密 -->
<security:password-encoder hash="md5" />
</security:authentication-provider>
</security:authentication-manager>
上面的例子只是简单是使用md5加密。
- 其属性hash表示我们将用来进行加密的哈希算法,系统已经为我们实现的有plaintext、sha、sha-256、md4、md5、和。它们对应的PasswordEncoder实现类如下:
| 加密算法 | PasswordEncoder实现类 |
|---|---|
| plaintext | PlaintextPasswordEncoder |
| sha | ShaPasswordEncoder |
| sha-256 | ShaPasswordEncoder,使用时new ShaPasswordEncoder(256) |
| md4 | Md4PasswordEncoder |
| md5 | Md5PasswordEncoder |
| LdapShaPasswordEncoder | |
| LdapShaPasswordEncoder |
- 使用BASE64编码加密后的密码
<security:password-encoder hash="md5" base64="true"/>
- 加密时使用salt
<!-- (1)下面的配置将使用常量“abc”作为salt。 -->
<security:authentication-manager>
<security:authentication-provider user-service-ref="userDetailsService">
<security:password-encoder hash="md5" base64="true">
<security:salt-source system-wide="abc"/>
</security:password-encoder>
</security:authentication-provider>
</security:authentication-manager>
<!--(2)下面的配置将使用UserDetails的username作为salt。 -->
<security:authentication-manager>
<security:authentication-provider user-service-ref="userDetailsService">
<security:password-encoder hash="md5" base64="true">
<security:salt-source user-property="username"/>
</security:password-encoder>
</security:authentication-provider>
</security:authentication-manager>
来源: http://www.mincoder.com/article/3505.shtml
#2. 获取当前的用户信息
spring-security 登录的时候,会将用户信息放到 session中,其中的key为 “SPRING_SECURITY_CONTEXT”,spring-security也给我们提供了获取方案
Account account = (Account) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- 如果想管理我们用户信息。我们可以添加一个sessionAttribute监听器,来监听SPRING_SECURITY_CONTEXT,当spring-security中SPRING_SECURITY_CONTEXT有变化时,我们可以同步到我们自己的session中。这样方便我们自己管理用户信息。
package com.hp.listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import com.hp.model.Account;
import com.hp.utils.ConfigUtil;
public class UserHttpSessionAttributeListener implements HttpSessionAttributeListener {
protected final Log logger = LogFactory.getLog(UserHttpSessionAttributeListener.class);
private SecurityContext context = null;
private final String springSecurityContext = "SPRING_SECURITY_CONTEXT";
/**
* session添加
*/
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
// logger.info("attributeAdded---->" + event.getName() + event.getValue());
// 当前session中有新的属性时触发 SPRING_SECURITY_CONTEXT 是spring存放的key
if (event.getName().equals(springSecurityContext)) {
context = SecurityContextHolder.getContext();
Account account = (Account) context.getAuthentication().getPrincipal();
event.getSession().setAttribute(ConfigUtil.getSessionInfoName(), account);
}
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
// 在注销的时候,security已经销毁的整个session
}
/**
* session替换
*/
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
if (event.getName().equals(springSecurityContext)) {
// System.out.println("----session中更新登陆信息------");
context = SecurityContextHolder.getContext();
Account account = (Account) context.getAuthentication().getPrincipal();
event.getSession().setAttribute(ConfigUtil.getSessionInfoName(), account);
}
}
}
Spring-Security (学习记录五)--配置登录时,密码采用md5加密,以及获取登录信息属性监听同步自己想要的登录信息的更多相关文章
- Spring Security 学习记录
一.核心拦截器详细说明 1.WebAsyncManagerIntegrationFilter 根据请求封装获取WebAsyncManager 从WebAsyncManager获取/注册Security ...
- SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能
在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...
- spring security实现记录用户登录时间等信息
目录 spring security实现记录用户登录时间等信息 一.原理分析 二.实现方式 2.1 自定义AuthenticationSuccessHandler实现类 2.2 在spring-sec ...
- Spring Security学习笔记
Spring Web Security是Java web开发领域的一个认证(Authentication)/授权(Authorisation)框架,基于Servlet技术,更确切的说是基于Servle ...
- [转]Spring Security学习总结一
[总结-含源码]Spring Security学习总结一(补命名空间配置) Posted on 2008-08-20 10:25 tangtb 阅读(43111) 评论(27) 编辑 收藏 所属分 ...
- SpringBoot + Spring Security 学习笔记(三)实现图片验证码认证
整体实现逻辑 前端在登录页面时,自动从后台获取最新的验证码图片 服务器接收获取生成验证码请求,生成验证码和对应的图片,图片响应回前端,验证码保存一份到服务器的 session 中 前端用户登录时携带当 ...
- [转]Spring Security学习总结二
原文链接: http://www.blogjava.net/redhatlinux/archive/2008/08/20/223148.html http://www.blogjava.net/red ...
- spring boot rest 接口集成 spring security(1) - 最简配置
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客
==他的博客应该不错,没有细看 Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客 http://blog.csdn.net/u012706811/article/det ...
随机推荐
- Unity NGUI插件
前言:关于Unity中关于UI的插件,我们最开始学的是UGUI,是Unity自带的UI系统,而在Unity版本还没更新出UGUI之前,除了NGUI没有一个更好些的插件,所以人们不得不去选择NGUI去制 ...
- 阿里云资深技术专家黄省江:让天下没有难做的SaaS
导语:本文中,阿里云资深技术专家黄省江(花名禅笑)将聚焦“SaaS加速器——让天下没有难做的SaaS”,对伙伴来说,SaaS加速器帮助他们做好SaaS,卖好SaaS:对企业来说,SaaS加速器帮助他们 ...
- 「NOI2016」循环之美 解题报告
「NOI2016」循环之美 对于小数\(\frac{a}{b}\),如果它在\(k\)进制下被统计,需要满足要求并且不重复. 不重复我们确保这个分数是最简分数即\((a,b)=1\) 满足要求需要满足 ...
- 【Flutter学习】基本组件之基本列表ListView组件
一,概述 列表是前端最常见的需求. 在flutter中,用ListView来显示列表页,支持垂直和水平方向展示,通过一个属性我们就可以控制其方向,列别有以下分类 水平列表 垂直列表 数据量非常大的列表 ...
- 生产环境用到的几个有用的Linux命令
有时候,几个有用的Linux命令可以很大的提高你的工作效率. 1.free -m 这个命令我暂时就只会这么使用,它可以查看服务器的内存资源 2.top 这个命令同样可以查看服务器的资源,当然我还是用它 ...
- 13、java获取路径
1.获取WEB-INF文件夹下的文件 /C:/Users/Administrator/Workspaces/MyEclipse%2010/day_38_spring_hibernate/WebRoot ...
- 二.Python基础语法和数据类型
Python第二节 基础语法和数据类型 Python编码 python3默认情况下源码文件以UTF-8编码, 字符串均为unicode字符串.同时也可以通过# -*- coding: cp-1252 ...
- JQ基本
jQuery的入口函数: 特点:1. 等着DOM结构渲染完毕即可执行内部代码,不必等到所有外部资源加载完毕,jQuery帮我们完成了封装. 2. 相当于原生js中的DOMContentLoaded. ...
- linux常用命令-2网络相关命令
1.ip [选项] 操作对象{link|addr|route...} ip addr show #显示网卡IP信息 2.修改IP配置 1) root权限 2) cd /etc/sy ...
- IOS 表单含有input框和有position: fixed导致错位的问题
在input框聚焦失焦的时候,都调用以下js即可 setScrollTop() { let scrollTop = document.body.scrollTop + document.documen ...