SpringSecurity权限管理(转载)

一 全局异常处理

有时候不可避免服务器报错的情况,如果不配置异常处理机制,就会默认返回tomcat或者nginx的5XX页面,对普通用户来说,不太友好,用户也不懂什么情况。这时候需要我们程序员设计返回一个友好简单的格式给前端。处理办法如下:通过使用@ControllerAdvice来进行统一异常处理,@ExceptionHandler(value = RuntimeException.class)来指定捕获的Exception各个类型异常 ,这个异常的处理,是全局的,所有类似的异常,都会跑到这个地方处理。步骤二、定义全局异常处理,@ControllerAdvice表示定义全局控制器异常处理,@ExceptionHandler表示针对性异常处理,可对每种异常针对性处理。
/** * 全局异常处理 */@Slf4j@RestControllerAdvicepublic class GlobalExceptionHandler {    @ResponseStatus(HttpStatus.FORBIDDEN)    @ExceptionHandler(value = AccessDeniedException.class)    public Result handler(AccessDeniedException e) {        log.info("security权限不足:----------------{}", e.getMessage());        return Result.fail("权限不足");    }        @ResponseStatus(HttpStatus.BAD_REQUEST)    @ExceptionHandler(value = MethodArgumentNotValidException.class)    public Result handler(MethodArgumentNotValidException e) {        log.info("实体校验异常:----------------{}", e.getMessage());        BindingResult bindingResult = e.getBindingResult();        ObjectError objectError = bindingResult.getAllErrors().stream().findFirst().get();        return Result.fail(objectError.getDefaultMessage());    }        @ResponseStatus(HttpStatus.BAD_REQUEST)    @ExceptionHandler(value = IllegalArgumentException.class)    public Result handler(IllegalArgumentException e) {        log.error("Assert异常:----------------{}", e.getMessage());        return Result.fail(e.getMessage());    }        @ResponseStatus(HttpStatus.BAD_REQUEST)    @ExceptionHandler(value = RuntimeException.class)    public Result handler(RuntimeException e) {        log.error("运行时异常:----------------{}", e);        return Result.fail(e.getMessage());    }}


二: SpringSecurity登录授权


image-20220116234434424

流程说明: 1.客户端发起一个请求,进入 Security 过滤器链。 2.当到 LogoutFilter 的时候判断是否是登出路径,如果是登出路径则到 logoutHandler ,如果登出成功则到 logoutSuccessHandler 登出成功处理。如果不是登出路径则直接进入下一个过滤器。 3.当到 UsernamePasswordAuthenticationFilter 的时候判断是否为登录路径,如果是,则进入该过滤器进行登录操作,如果登录失败则到 AuthenticationFailureHandler ,登录失败处理器处理,如果登录成功则到 AuthenticationSuccessHandler 登录成功处理器处理,如果不是登录请求则不进入该过滤器。 4.进入认证BasicAuthenticationFilter进行用户认证,成功的话会把认证了的结果写入到SecurityContextHolder中SecurityContext的属性authentication上面。如果认证失败就会交给AuthenticationEntryPoint认证失败处理类,或者抛出异常被后续ExceptionTranslationFilter过滤器处理异常,如果是AuthenticationException就交给AuthenticationEntryPoint处理,如果是AccessDeniedException异常则交给AccessDeniedHandler处理。 5.当到 FilterSecurityInterceptor 的时候会拿到 uri ,根据 uri 去找对应的鉴权管理器,鉴权管理器做鉴权工作,鉴权成功则到 Controller 层,否则到 AccessDeniedHandler 鉴权失败处理器处理。 Spring Security 实战干货:必须掌握的一些内置 Filter:https://blog.csdn.net/qq_35067322/article/details/102690579

ok,上面我们说的流程中涉及到几个组件,有些是我们需要根据实际情况来重写的。因为我们是使用json数据进行前后端数据交互,并且我们返回结果也是特定封装的。我们先再总结一下我们需要了解的几个组件:LogoutFilter - 登出过滤器

  • logoutSuccessHandler - 登出成功之后的操作类

  • UsernamePasswordAuthenticationFilter - from提交用户名密码登录认证过滤器

  • AuthenticationFailureHandler - 登录失败操作类

  • AuthenticationSuccessHandler - 登录成功操作类

  • BasicAuthenticationFilter - Basic身份认证过滤器

  • SecurityContextHolder - 安全上下文静态工具类

  • AuthenticationEntryPoint - 认证失败入口

  • ExceptionTranslationFilter - 异常处理过滤器

  • AccessDeniedHandler 权限不足操作类

  • FilterSecurityInterceptor - 权限判断拦截器、出口

  • 有了上面的组件,那么认证与授权两个问题我们就已经接近啦,我们现在需要做的就是去重写我们的一些关键类。

end

评论