SpringSecurity中密码加盐与SpringBoot中异常统一处理

栏目: Java · 发布时间: 6年前

内容简介:SpringSecurity中密码加盐与SpringBoot中异常统一处理

当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异。笔者前几天刚好在负责一个项目的权限管理模块,现在权限管理模块已经做完了,我想通过5-6篇文章,来介绍一下项目中遇到的问题以及我的解决方案,希望这个系列能够给小伙伴一些帮助。本系列文章并不是手把手的教程,主要介绍了核心思路并讲解了核心代码,完整的代码小伙伴们可以在GitHub上star并clone下来研究。另外,原本计划把项目跑起来放到网上供小伙伴们查看,但是之前买服务器为了省钱,内存只有512M,两个应用跑不起来(已经有一个 V部落开源项目 在运行),因此小伙伴们只能将就看一下下面的截图了,GitHub上有部署教程,部署到本地也可以查看完整效果。

项目地址: https://github.com/lenve/vhr

上篇文章我们已经把整个环境搭建成功了,并且配置好了资源和角色的动态分配,本文我们主要来聊聊异常处理和密码加密。

本文是本系列的第三篇,建议先阅读前面的文章有助于更好的理解本文:

1. SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(一)

2. SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(二)

密码加盐

密码要加盐处理,这是常识。各个权限处理框架对此都有不同程度的支持,Shiro、SpringSecurity都有自家的解决方案,SpringSecurity中有一个升级版的消息摘要:

BCryptPasswordEncoder 

使用BCryptPasswordEncoder,即使相同的明文,生成的新的加密字符串都是不一样的,这样可以避免像在Shiro中那样我们自己配置密码的盐,SpringSecurity中使用BCryptPasswordEncoder的具体流程如下:

注册处理

在用户注册时,我们需要对密码进行处理,处理方式如下:

public int hrReg(String username, String password) {
    //如果用户名存在,返回错误
    if (hrMapper.loadUserByUsername(username) != null) {
        return -1;
    }
    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
    String encode = encoder.encode(password);
    return hrMapper.hrReg(username, encode);
}

通过BCryptPasswordEncoder中的encode方法对密码进行处理。

当用户注册成功之后,存在数据库中的密码就像下面这样:

SpringSecurity中密码加盐与SpringBoot中异常统一处理

登录处理

密码加密处理之后,登录时候也要对密码进行处理,修改WebSecurityConfig类的configure(AuthenticationManagerBuilder auth)方法,改为下面这样即可:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(hrService).passwordEncoder(new BCryptPasswordEncoder());
}

异常统一处理

如果不是前后端分离,一般出了异常都很容易处理,直接跳转到相关的错误页面即可,现在前后端分离,出了异常,就不能再跳转到错误页面了,但是我们可以返回JSON呀!我们可以对服务端可能发生的异常进行统一处理。

举个栗子:

当管理员想要删除某一个角色的时候,如果该角色下尚有关联的用户或者资源,此时由于数据库中外键的约束会导致删除失败(我的业务逻辑就是如此,这里小伙伴不要和我扯cascade (*^_^*) ),当删除失败时,会抛出一个DataIntegrityViolationException异常,我将这种异常捕获后统一处理。

处理方式如下:

自定义异常处理类

自定义异常处理类CustomExceptionResolver,如下:

public class CustomExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse response, Object o, Exception e) {
        ModelAndView mv = new ModelAndView(new MappingJackson2JsonView());
        Map<String, String> map = new HashMap<>();
        map.put("status", "error");
        if (e instanceof DataIntegrityViolationException) {
            map.put("msg", "该角色尚有关联的资源或用户,删除失败!");
        }
        mv.addAllObjects(map);
        return mv;
    }
}

在这里接收到系统抛出的各种异常,判断异常的类型,根据不同的类型,返回不同的提示,当然,我这里只有一种情况。

将CustomExceptionResolver注册为一个Bean

将CustomExceptionResolver注册为Bean就比较简单了,可以直接在类上添加@Component注解,也可以通过 Java 进行配置,如下:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Bean
    public CustomExceptionResolver customExceptionResolver() {
        return new CustomExceptionResolver();
    }
}

两种方式任选一。

关注公众号,可以及时接收到最新文章:

SpringSecurity中密码加盐与SpringBoot中异常统一处理


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据压缩导论(第4版)

数据压缩导论(第4版)

[美] Khalid Sayood / 贾洪峰 / 人民邮电出版社 / 2014-1 / 129.00

数据压缩已经成为信息革命的一门支撑技术,这场革命已经改变了我们的生活,而在此过程中,数据压缩也变得几乎无处不在。从MP3播放器到智能手机,再到数字电视和数字电影,数据压缩几乎成了所有信息技术的必备要素。 近年来,以大数据为标志的互联网技术高歌猛进。数据规模大、产生速度快、来源多样等特性,导致数据存储和处理都前所未有地复杂。《数据压缩导论(第4版)》作为迄今为止数据压缩领域最全面而深入的著作,......一起来看看 《数据压缩导论(第4版)》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

SHA 加密
SHA 加密

SHA 加密工具