• 微服务项目中怎么让登录用户信息共享


    微服务项目中怎么让登录用户信息共享

    无论是token还是jwt,核心就是获取登录信息,然后放到SecurityContextHolder.getContext().setAuthentication(authResult)中。

    token

    token的话,只要在资源服务器中,进行校验token,底层代码中会把OAuth2Authentication放到SecurityContextHolder.getContext()中,这里的代码在上一篇博客有写,这里就不贴出来了。

    image-20210822173442238

    image-20210822173850004
    用户信息如下:

    jwt

    认证服务器登录成功用户。往响应头中添加token信息

    public class JwtLoginFilter extends UsernamePasswordAuthenticationFilter {
    
        private AuthenticationManager authenticationManager;
        private RsaKeyProperties prop;
    
        public JwtLoginFilter(AuthenticationManager authenticationManager, RsaKeyProperties prop) {
            this.authenticationManager = authenticationManager;
            this.prop = prop;
        }
    
        @Override
        public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
            try {
                SysUser sysUser = new ObjectMapper().readValue(request.getInputStream(), SysUser.class);
                UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(sysUser.getUsername(), sysUser.getPassword());
                return authenticationManager.authenticate(authRequest);
            }catch (Exception e){
                try {
                    response.setContentType("application/json;charset=utf-8");
                    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                    PrintWriter out = response.getWriter();
                    Map resultMap = new HashMap();
                    resultMap.put("code", HttpServletResponse.SC_UNAUTHORIZED);
                    resultMap.put("msg", "用户名或密码错误!");
                    out.write(new ObjectMapper().writeValueAsString(resultMap));
                    out.flush();
                    out.close();
                }catch (Exception outEx){
                    outEx.printStackTrace();
                }
                throw new RuntimeException(e);
            }
        }
    
        @Override
        public void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
            SysUser user = new SysUser();
            user.setUsername(authResult.getName());
            user.setRoles((List<SysRole>) authResult.getAuthorities());
            String token = JwtUtils.generateTokenExpireInMinutes(user, prop.getPrivateKey(), 24 * 60);
            response.addHeader("Authorization", "Bearer "+token);
            try {
                response.setContentType("application/json;charset=utf-8");
                response.setStatus(HttpServletResponse.SC_OK);
                PrintWriter out = response.getWriter();
                Map resultMap = new HashMap();
                resultMap.put("code", HttpServletResponse.SC_OK);
                resultMap.put("msg", "认证通过!");
                out.write(new ObjectMapper().writeValueAsString(resultMap));
                out.flush();
                out.close();
            }catch (Exception outEx){
                outEx.printStackTrace();
            }
        }
    
    }
    

    资源服务器,可以从token中,拿到认证信息,在放到 SecurityContextHolder.getContext().setAuthentication(authResult);中

    public class JwtVerifyFilter extends BasicAuthenticationFilter {
    
        private RsaKeyProperties prop;
    
        public JwtVerifyFilter(AuthenticationManager authenticationManager, RsaKeyProperties prop) {
            super(authenticationManager);
            this.prop = prop;
        }
    
        @Override
        public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
            String header = request.getHeader("Authorization");
            if (header == null || !header.startsWith("Bearer ")) {
                //如果携带错误的token,则给用户提示请登录!
                chain.doFilter(request, response);
                response.setContentType("application/json;charset=utf-8");
                response.setStatus(HttpServletResponse.SC_FORBIDDEN);
                PrintWriter out = response.getWriter();
                Map resultMap = new HashMap();
                resultMap.put("code", HttpServletResponse.SC_FORBIDDEN);
                resultMap.put("msg", "请登录!");
                out.write(new ObjectMapper().writeValueAsString(resultMap));
                out.flush();
                out.close();
            } else {
                //如果携带了正确格式的token要先得到token
                String token = header.replace("Bearer ", "");
                //验证tken是否正确
                Payload<SysUser> payload = JwtUtils.getInfoFromToken(token, prop.getPublicKey(), SysUser.class);
                SysUser user = payload.getUserInfo();
                if(user!=null){
                    UsernamePasswordAuthenticationToken authResult = new UsernamePasswordAuthenticationToken(user.getUsername(), null, user.getAuthorities());
                    SecurityContextHolder.getContext().setAuthentication(authResult);
                    chain.doFilter(request, response);
                }
            }
        }
    
    }
    
    
  • 相关阅读:
    Excel VB Script
    Excel Text Converter as C# Format
    快捷键
    如何使用 MasterPage
    Excel 오른쪽버튼 윗주
    Oracle Hints
    ASP.NET 弹出窗口
    Log4Net
    word 修改 表宽度
    While 나가는 법
  • 原文地址:https://www.cnblogs.com/dalianpai/p/15172942.html
Copyright © 2020-2023  润新知