關于springsecurity添加自定義filter去除header中訪問Authenzation的方法
因為springsecurity不論是否設置了開放路徑只要請求中攜帶了authentization的請求頭都會去校驗token
這次因為有2個不同的系統,里面都帶有security的依賴。
有一個系統的前端訪問authentization帶了他們的token過來,然后就會401的結果。
怎么讓springsercurity 不去驗證帶了authentization的請求?
以下是解決的辦法:
定義header返回值,這里如果不這么寫可能會有一個問題,使用postman會正常執行并返回正常結果,但是如果用瀏覽器請求,會返回(fail)net::ERR_FAILED
public class HeaderMapRequestWrapper extends HttpServletRequestWrapper { /** * construct a wrapper for this request * * @param request */ public HeaderMapRequestWrapper(HttpServletRequest request) { super(request); } private Map<String, String> headerMap = new HashMap<>(); /** * add a header with given name and value * * @param name * @param value */ public void addHeader(String name, String value) { headerMap.put(name, value); } @Override public String getHeader(String name) { log.info("getHeader --->{}",name); String headerValue = super.getHeader(name); if (headerMap.containsKey(name)) { headerValue = headerMap.get(name); } return headerValue; } /** * get the Header names */ @Override public Enumeration<String> getHeaderNames() { List<String> names = Collections.list(super.getHeaderNames()); for (String name : headerMap.keySet()) { names.add(name); } return Collections.enumeration(names); } @Override public Enumeration<String> getHeaders(String name) { log.info("getHeaders --->>>>>>{}",name); List<String> values = Collections.list(super.getHeaders(name)); log.info("getHeaders --->>>>>>{}",values); if (headerMap.containsKey(name)) { log.info("getHeaders --->{}",headerMap.get(name)); values = Arrays.asList(headerMap.get(name)); } return Collections.enumeration(values); } }
自定義filter
public class DemoFilter extends OncePerRequestFilter{ @Overrider protected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain chain) throws IOException,ServletException{ if(過濾條件達成){ CustomHttpServletRequest custom = new CustomHttpServletRequest(request); //自定義的方法 custom.addHeader("替換的header",""); chain.doFilter(custom,response); return ; } chain.doFilter(request,response); } }
filter加入流程
//這里可以改成自己的配置類
public class DemoResourceServerConfigurerAdapter extends ResourceServerConfigurerAdapter{ //這里是讓自定義filter加入security之前調用 @Override public void configure(HttpServlet http){ //主要代碼 http.addFilterBefore(new DemoFilter(),SecurityContextPersistenceFilter.class); } }

浙公網安備 33010602011771號