我们接着上一篇博客SSM+springSecurity与数据库连接实现动态角色权限控制来实现springSecurity与数据库连接实现动态角色权限控制的一些细节
1. 实现密码加密,解密
- springSecurity内部提供了PasswordEncoder接口,其中定义了两个方法
public interface PasswordEncoder {
//对密码进行加密(相同密码会被加密成不同的结果)
String encode(CharSequence var1);
//对输入的密码,与数据库密码进行对比
boolean matches(CharSequence var1, String var2);
}
- 首先我们写一个测试方法,将数据库的密码进行加密:
BCryptPasswordEncoder类是PasswordEncoder的实现类
@Test
public void updateUser(){
SysUserEntity user=new SysUserEntity();
user.setUsername("user2");
PasswordEncoder passwordEncoder=new BCryptPasswordEncoder();
String encode = passwordEncoder.encode("123");
user.setPassword(encode);
userMapper.updateUser(user);
}
编写dao层的接口以及mapper.xml文件中的sql:
<update id="updateUser" parameterType="SysUserEntity" >
update sys_user set password=#{password} where username=#{username}
</update>
运行测试方法,将user1与user2的密码进行加密(密码均为123),加密后如图:
在实际项目中,此逻辑只需要写入注册用户的controller中即可
- 登录时对用户输入的密码与数据库中的密码进行比对,这里比对的方法已经在security内部实现了,我们只需要告诉security我们使用的哪一种加密方式。
在AppicationContext.xml或者springSecurity.xml中添加BCryptPasswordEncoder的配置:
<bean id="bCryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
在springSecurity.xml中引入加密方式即可:
重启项目,进行测试,输入密码输入123,登录成功!
2. 当用户名或者账号输入错误时,进行提示
目前用户名或者账号输入错误,会直接跳转至localhost:8080/ss2/user/login?error页面,于是我们可以仍然跳转至login页面,但是error带上值rue,到达页面时判断参数error是否有值,有值则说明账号或者密码输入错误
- 设置认证失败的地址
在springSecurity.xml中的form-lofgin标签中设置认证失败的地址:
<!-- 使用form-login的方式进行登录认证 -->
<security:form-login login-page="/user/login" authentication-failure-forward-url="/user/login?error=true"/>
- 编写前端login页面逻辑
重启项目,输入错的账号或者密码:
3. 以上登录逻辑我么采用的是同步登录,下面进行改造成异步登录
-
引入js
-
修改springMvc.xml,增加下面的标签对静态资源放行
<mvc:default-servlet-handler/>
- 编写处理认证成功、认证失败的处理器
public class MyAuthenticationFailureHandler implements AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
Map<String,Object> map=new HashMap<>(2);
map.put("success",false);
map.put("mes","登录失败");
String reslut = JSONObject.toJSONString(map);
httpServletResponse.setContentType("text/json;charset=utf-8");
httpServletResponse.getWriter().write(reslut);
}
}
public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
Map<String,Object> map=new