Spring-Security (学习记录五)--配置登录时,密码采用md5加密,以及获取登录信息属性监听同步自己想要的登录信息
2016-08-29 10:40
761 查看
[Toc]
使用前面的例子。可以看出我们数据库密码是采用明文的,我们在登录的时候也需要将传递的明文密码使用对应的算法加密后再与保存好的密码比较,这样比较好,Spring-Security也有支持通过在authentication-provider下定义一个password-encoder我们可以定义当前AuthenticationProvider需要在进行认证时需要使用的password-encoder。password-encoder是一个PasswordEncoder的实例,我们可以直接使用它,如:
其属性hash表示我们将用来进行加密的哈希算法,系统已经为我们实现的有plaintext、sha、sha-256、md4、md5、{sha}和{ssha}。它们对应的PasswordEncoder实现类如下:
使用BASE64编码加密后的密码
加密时使用salt
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、{sha}和{ssha}。它们对应的PasswordEncoder实现类如下:
加密算法 | PasswordEncoder实现类 |
---|---|
plaintext | PlaintextPasswordEncoder |
sha | ShaPasswordEncoder |
sha-256 | ShaPasswordEncoder,使用时new ShaPasswordEncoder(256) |
md4 | Md4PasswordEncoder |
md5 | Md5PasswordEncoder |
{sha} | LdapShaPasswordEncoder |
{ssha} | LdapShaPasswordEncoder |
<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[/code]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 (学习记录四)--配置权限过滤器,采用数据库方式获取权限
- Spring-Security (学习记录二)--修改为自己的登录页面
- Spring-Security (学习记录一)--登录
- JavaWeb学习记录(八)——servlet获取配置信息
- [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间
- Spring入门学习——配置文件<beans>属性配置记录
- 解决 CAS + Spring Security整合 无法获取当前登录用户信息
- Spring Boot Security 学习笔记-根据登陆人动态配置权限-密码加密验证
- spring-security4.2实现登录退出以及权限配置
- 【Spring实战】----Security4.1.3实现根据请求跳转不同登录页以及登录后根据权限跳转到不同页配置
- spring boot +security获取当前登录用户信息
- 【Spring实战】----Security4.1.3实现根据请求跳转不同登录页以及登录后根据权限跳转到不同页配置
- Spring-Security (学习记录六)--采用ehcache缓存UserDetails
- Spring学习记录(二)---容器和bean属性配置
- 解决 CAS + Spring Security整合 无法获取当前登录用户信息
- 获取客户端信息,主机名称,系统登录名,MAC地址,以及其它
- Spring学习笔记 关于Bean属性的初始化 - 使用inner bean以及List, Map与Set的初始化
- Dive Into Python 学习记录3-对获取某文件夹下MP3文件信息的代码构成分析
- Spring学习----------AOP以及Spring配置文件详解
- Spring配置文件中使用PropertyPlaceholderConfigurer配置获取jdbc的配置信息