shiro与spring security用自定义异常处理401错误

目录
  • shiro与spring security自定义异常处理401
    • 背景
    • 解决方案
  • SpringBoot整合Shiro自定义filter报错
    • No SecurityManager accessible to the calling code...
    • 产生原因
    • 解决办法
    • 小结一下

shiro与spring security自定义异常处理401

背景

现在是前后端分离的时代,后端必然要统一处理返回结果,比如定义一个返回对象

public class ResponseData<T> {
    /**
     * 统一返回码
     */
    public String rtnCode;
    /**
     * 统一错误消息
     */
    public String rtnMsg;
    /**
     * 结果对象
     */
    public T rtnData;

对于所有异常都有对应的rtnCode对应,而不需要框架默认处理如返回

这时候前端同学就不开心了,都已经有rtnCode了,为啥http的status还要弄个401而不是200。

解决方案

一般的业务异常在springboot项目中新建一个统一处理类去处理即可,如

@ControllerAdvice
public class DefaultExceptionHandler {
    /**
     * 异常统一处理
     */
    @ExceptionHandler({Exception.class})
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public ResponseData allException(Exception e) {

大部分情况都能捕获到从而如期返回json对象数据,但是某些权限框架抛出的异常如401等等,不会被拦截到,这时候就需要再建一个类去处理这种情况,代码如下

package com;
import com.vo.ResponseData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.ErrorAttributes;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
 * spring security 异常处理
 */
@RestController
public class CustomErrorController implements ErrorController {
	private static final String PATH = "/error";
    @Autowired
    private ErrorAttributes errorAttributes;
    @RequestMapping(value = PATH)
    ResponseData error(HttpServletRequest request, HttpServletResponse response) {
        // Appropriate HTTP response code (e.g. 404 or 500) is automatically set by Spring.
        // Here we just define response body.
    	Map<String, Object> errorMap = getErrorAttributes(request);
        ResponseData d= new ResponseData(response.getStatus()+"", errorMap.get("message").toString());
        response.setStatus(HttpServletResponse.SC_OK);
        return d;
    }
    @Override
    public String getErrorPath() {
        return PATH;
    }
    private Map<String, Object> getErrorAttributes(HttpServletRequest request) {
        RequestAttributes requestAttributes = new ServletRequestAttributes(request);
        return errorAttributes.getErrorAttributes(requestAttributes, false);
    }
}

SpringBoot整合Shiro自定义filter报错

No SecurityManager accessible to the calling code...

最近在用springboot整合shiro,在访问时出现了No SecurityManager accessible to the calling code…

报错:

产生原因

自定义的SysUserFilter加载顺序在ShiroFilter之前,导致出现No SecurityManager accessible to the calling code…

解决办法

shiroFilter()的加载先于自定义的SysUserFilter

小结一下

出现No SecurityManager accessible to the calling code…问题的原因可能有很多,而我这个是因为将自定义的Filter在ShiroFitler之前加载。

ShiroFilter 是整个 Shiro 的入口点,用于拦截需要安全控制的请求进行处理,当自定义的filter先于shiroFilter加载,而shiroFilter里又使用到该自定义filter时,就会导致调用该自定义filter进行预处理时访问不到SecurityManager,也就是文中所出现的错误。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring Security和自定义filter的冲突导致多执行的解决方案

    问题描述: 使用Spring Security时,在WebSecurityConfig中需要通过@bean注解注入Security的filter对象,但是不知是不是因为spring boot框架的原因还是什么未知原因,导致在这里注入,就会多注入一次这个对象,导致filter链走完之后,又会回到这个filter中再执行一次. @Bean public JwtAuthenticationTokenFilter authenticationTokenFilterBean() throws Except

  • 解决springboot+shiro 权限拦截失效的问题

    最近因为项目需要,接触了shiro.新手入门 发现权限拦截失效, 一直以为是以为授权和DB的问题 研究了一个下午,终于发现了问题所在 我的访问路径没有写前面的斜杠!!,而DB中的资源路径是可以省略的,崩溃了吧 但是问题来了,为什么在其他地方可以忽略掉前面的小斜杠呢? 经过几分钟的捣鼓发现,在springboot中,不论是thymeleaf的模板也好(我用的thymeleaf),还是后端代码也好,底层会自动补全这个斜杠 问题解决!! 补充知识:SpringBoot整合shiro的一个完整的小案例

  • spring boot 集成 shiro 自定义密码验证 自定义freemarker标签根据权限渲染不同页面(推荐

    项目里一直用的是 spring-security ,不得不说,spring-security 真是东西太多了,学习难度太大(可能我比较菜),这篇博客来总结一下折腾shiro的成果,分享给大家,强烈推荐shiro,真心简单 : ) 引入依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4

  • shiro与spring security用自定义异常处理401错误

    目录 shiro与spring security自定义异常处理401 背景 解决方案 SpringBoot整合Shiro自定义filter报错 No SecurityManager accessible to the calling code... 产生原因 解决办法 小结一下 shiro与spring security自定义异常处理401 背景 现在是前后端分离的时代,后端必然要统一处理返回结果,比如定义一个返回对象 public class ResponseData<T> { /** *

  • Spring Security OAuth 自定义授权方式实现手机验证码

    Spring Security OAuth 默认提供OAuth2.0 的四大基本授权方式(authorization_code\implicit\password\client_credential),除此之外我们也能够自定义授权方式. 先了解一下Spring Security OAuth提供的两个默认 Endpoints,一个是AuthorizationEndpoint,这个是仅用于授权码(authorization_code)和简化(implicit)模式的.另外一个是TokenEndpoi

  • Spring Cloud Gateway自定义异常处理Exception Handler

    版本: Spring Cloud 2020.0.3 常见的方法有 实现自己的 DefaultErrorWebExceptionHandler 或 仅实现ErrorAttributes. 方法1: ErrorWebExceptionHandler (仅供示意) 自定义一个 GlobalErrorAttributes: @Component public class GlobalErrorAttributes extends DefaultErrorAttributes{ @Override pub

  • Spring Security基于自定义的认证提供器实现图形验证码流程解析

    目录 前言 一. 认证提供器简介 1. 认证提供器AuthenticationProver 2. WebAuthenticationDetails类介绍 二. 实现图形验证码 1. 添加依赖包 2. 创建Producer对象 3. 创建生成验证码的接口 4. 自定义异常 5. 自定义WebAuthenticationDetails 6. 自定义AuthenticationDetailsSource 7. 自定义DaoAuthenticationProver 8. 添加SecurityConfig

  • Spring Security实现自定义访问策略

    目录 1.安全注释 2.投票机制 3.配置 4.测验 前言: 我们将探索一个用户共享电子表格的系统,每个电子表格的访问权限单独存储.我们已经尽可能简单地对权限存储进行了显式建模:想象一下,它在调用其他地方的记录系统.请注意,在这个简化的实现中,访问决定是二进制的:要么有访问权,要么没有.在这个实现中,读/写访问权没有区别. 1.安全注释 打开SpreadsheetService会显示一个用@Secured注释的方法. @Secured("com.jdriven.model.Spreadsheet

  • Spring Cloud Gateway自定义异常处理Exception Handler的方法小结

    版本: Spring Cloud 2020.0.3 常见的方法有 实现自己的 DefaultErrorWebExceptionHandler 或 仅实现ErrorAttributes. 方法1: ErrorWebExceptionHandler (仅供示意) 自定义一个 GlobalErrorAttributes: @Component public class GlobalErrorAttributes extends DefaultErrorAttributes{ @Override pub

  • Spring Boot中整合Spring Security并自定义验证代码实例

    最终效果 1.实现页面访问权限限制 2.用户角色区分,并按照角色区分页面权限 3.实现在数据库中存储用户信息以及角色信息 4.自定义验证代码 效果如下: 1.免验证页面 2.登陆页面 在用户未登录时,访问任意有权限要求的页面都会自动跳转到登陆页面. 3.需登陆才能查看的页面 用户登陆后,可以正常访问页面资源,同时可以正确显示用户登录名: 4.用户有角色区分,可以指定部分页面只允许有相应用户角色的人使用 4.1.只有ADMIN觉得用户才能查看的页面(权限不足) 4.2.只有ADMIN觉得用户才能查

  • SpringBoot Security的自定义异常处理

    目录 SpringBoot Security自定义异常 access_denied 方面异常 Invalid access token 方面异常 Bad credentials 方面异常(登陆出错) 其他类 补充 SpringSecurity自定义响应异常信息 SpringBoot Security自定义异常 access_denied 方面异常 原异常 { "error": "access_denied", "error_description"

  • spring Security的自定义用户认证过程详解

    首先我需要在xml文件中声明.我要进行自定义用户的认证类,也就是我要自己从数据库中进行查询 <http pattern="/*.html" security="none"/> <http pattern="/css/**" security="none"/> <http pattern="/img/**" security="none"/> <h

随机推荐