用户功能完善
类似于某宝,某东的系统,在登陆之后都会在头部显示已登录的用户名,
在之前的运用中,都是将登陆的用户信息存储在session域中,
那么经过安全框架之后,用户名又该如何获取呢?
要想获取用户名,有两中方式:总的来说步骤如下:
获取过程:SecurityContext—>Authentication—>User—>username
方法一:服务器端可以通过程序API的方式获得
//通过SecurityContextHolder获得当前线程上绑定的SecurityContext对象
SecurityContext context = SecurityContextHolder.getContext();
//也可以通过session获得SecurityContext对象,
//在未知存储名的情况下可以通过request.getAttributeNames()
//获得一个枚举类型的数据,会发现只有一个名字:SPRING_SECURITY_CONTEXT
//然后就可以直接通过下面的方法获取Context对象
SecurityContext context_session = (SecurityContext) request.getSession().getAttribute("SPRING_SECURITY_CONTEXT");
//证明线程绑定的SecurityContext与session域中存储的SecurityContext是同一个
System.out.println(context==context_session);
//获得Authentication认证对象
Authentication authentication = context_session.getAuthentication();
//获得User对象
User user = (User) authentication.getPrincipal();
// 获得用户名
System.out.println(user.getUsername());
方法二:EL表达式
User user1 = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
System.out.println(user1.getUsername());
在页面删上获取的话可以选择EL表达式,也可以使用Security的标签库
${sessionScope.SPRING_SECURITY_CONTEXT.authentication.principal.username}
或者
<security:authentication property="principal.username"/>
用户密码的加密操作
目前我们使用的SpringSecurity框架本身就提供了多种加密工具。
简述集中加密方式
一:Md5加密
- md5登录流程
就是原来的数据经过一定算法,变成一定长度的字符串,不容易别人解析添加时需要把密码通过md5加密,保存到数据库登录的时候,把登录输入的数据也经过md5加密,与数据库中的密码比较 就是原来的数据经过一定算法,变成一定长度的字符串,不容易别人解析添加时需要把密码通过md5加密,保存到数据库登录的时候,把登录输入的数据也经过md5加密,与数据库中的密码比较
2.md5弊端
相同密码经过加密之后也相同
二:spring-security加密方法
1.流程
在用户输入密码之后,会在用户输入的密码之后在随机生成一串数字,然后将这串数字经过md5加密方法加密,这样可以保证相同密码也会加密成不同的形式
a:在spring-security.xml中配置加密类BCryptPasswordEncoder
b:用户在登录时的密码也需要进行加密才能与数据库中的密码进行匹配,但认证时的加密操作不需要手动编写程序实 现,只需要对spring-security.xml进行配置即可。
修改spring-security.xml
<security:authentication-manager>
<!-- 提供服务类,去数据库查询用户名和密码 -->
<security:authentication-provider user-service-ref="userService">
<!--指定使用spring容器中passwordEncoder进行加密操作-->
<security:password-encoder ref="passwordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>
c:修改userServiceImpl的认证方法loadUserByUsername,把{noop}代码去掉,表示采用加密方式登录
希望多多关注