当前位置:   article > 正文

利用SpringSecurity和JWT实现mymes认证和授权(二)_if (username != null && securitycontextholder.getc

if (username != null && securitycontextholder.getcontext().getauthentication

SpringBoot整合SpringSecurity和JWT实现mymes认证和授权(二)

接上一篇接上一篇,SpringSecurity的配置类相关依赖以及方法说明

  • configure(HttpSecurity httpSecurity):用于拦截url路径、JWT过滤和异常处理

  • configure(AuthenticationManagerBuilder auth):用于配置userDetailsService和PasswordEncoder

  • JwtAuthenticationTokenFilter:在用户名和密码前添加过滤器,若有token,会根据token自行登录

  • RestfulAccessDeniedHandler:在用户没有访问权限的时候,返回JSON格式的处理结果

  • RestAuthenticationEntryPoint:在token失效或者没有登录情况下,返回JSON格式处理结果

  • PasswordEncoder:SpringSecurity定义的用于对密码进行编码及比对的接口,目前使用的是BCryptPasswordEncoder;

  • IgnoreUrlsConfig:用于从application.yml中获取不需要安全保护的资源路径

  • UserDetailsService:SpringSecurity核心接口,获取用户信息

添加IgnoreUrlsConfig

  1. package com.cn.mymes.utils.config;/*
  2.  *Created by zbb on 2021/1/6
  3.  **/
  4. import lombok.Getter;
  5. import lombok.Setter;
  6. import org.springframework.boot.context.properties.ConfigurationProperties;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. /**
  10.  * 用于配置不需要保护的资源路径
  11.  *
  12.  */
  13. @Getter
  14. @Setter
  15. @ConfigurationProperties(prefix = "secure.ignored")
  16. public class IgnoreUrlsConfig {
  17.     private List<String> urls = new ArrayList<>();
  18. }

在application.yml中配置下不需要安全保护的资源路径

  1. secure:
  2.   ignored:
  3.     urls: #安全路径白名单
  4.       - /swagger-ui.html
  5.       - /swagger-resources/**
  6.       - /swagger/**
  7.       - /**/v2/api-docs
  8.       - /**/*.js
  9.       - /**/*.css
  10.       - /**/*.png
  11.       - /**/*.ico
  12.       - /webjars/springfox-swagger-ui/**
  13.       - /actuator/**
  14.       - /druid/**
  15.       - /admin/login
  16.       - /admin/register
  17.       - /admin/info
  18.       - /admin/logout

添加Token过滤器JwtAuthenticationTokenFilter

  1. package com.cn.mymes.component;
  2. import com.cn.mymes.utils.JwtTokenUtil;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  8. import org.springframework.security.core.context.SecurityContextHolder;
  9. import org.springframework.security.core.userdetails.UserDetails;
  10. import org.springframework.security.core.userdetails.UserDetailsService;
  11. import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
  12. import org.springframework.web.filter.OncePerRequestFilter;
  13. import javax.servlet.FilterChain;
  14. import javax.servlet.ServletException;
  15. import javax.servlet.http.HttpServletRequest;
  16. import javax.servlet.http.HttpServletResponse;
  17. import java.io.IOException;
  18. /**
  19.  *token登录过滤器
  20.  *
  21.  */
  22. public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
  23.     private static final Logger LOGGER = LoggerFactory.getLogger(JwtAuthenticationTokenFilter.class);
  24.     @Autowired
  25.     private UserDetailsService userDetailsService;
  26.     @Autowired
  27.     private JwtTokenUtil jwtTokenUtil;
  28.     @Value("${jwt.tokenHeader}")
  29.     private String tokenHeader;
  30.     @Value("${jwt.tokenHead}")
  31.     private String tokenHead;
  32.     @Override
  33.     protected void doFilterInternal(HttpServletRequest request,
  34.                                     HttpServletResponse response,
  35.                                     FilterChain chain) throws ServletException, IOException {
  36.         String authHeader = request.getHeader(this.tokenHeader);
  37.         if (authHeader != null && authHeader.startsWith(this.tokenHead)) {
  38.             String authToken = authHeader.substring(this.tokenHead.length());// The part after "Bearer "
  39.             String username = jwtTokenUtil.getUserNameFromToken(authToken);
  40.             LOGGER.info("checking username:{}", username);
  41.             if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
  42.                 UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
  43.                 if (jwtTokenUtil.validateToken(authToken, userDetails)) {
  44.                     UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
  45.                     authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
  46.                     LOGGER.info("authenticated user:{}", username);
  47.                     SecurityContextHolder.getContext().setAuthentication(authentication);
  48.                 }
  49.             }
  50.         }
  51.         chain.doFilter(request, response);
  52.     }
  53. }

添加无权访问时RestfulAccessDeniedHandler方法

  1. package com.cn.mymes.component;
  2. import cn.hutool.json.JSONUtil;
  3. import com.cn.mymes.common.CommonResult;
  4. import org.springframework.security.access.AccessDeniedException;
  5. import org.springframework.security.web.access.AccessDeniedHandler;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. /**
  11.  *在没有权限访问时,返回自定义JSON格式结果
  12.  */
  13. public class RestfulAccessDeniedHandler implements AccessDeniedHandler{
  14.     @Override
  15.     public void handle(HttpServletRequest request,
  16.                        HttpServletResponse response,
  17.                        AccessDeniedException e) throws IOException, ServletException {
  18.         response.setHeader("Access-Control-Allow-Origin""*");
  19.         response.setHeader("Cache-Control","no-cache");
  20.         response.setCharacterEncoding("UTF-8");
  21.         response.setContentType("application/json");
  22.         response.getWriter().println(JSONUtil.parse(CommonResult.forbidden(e.getMessage())));
  23.         response.getWriter().flush();
  24.     }
  25. }

添加未登录或者登录过期返回自定义结果的RestAuthenticationEntryPoint方法

  1. package com.cn.mymes.component;
  2. import cn.hutool.json.JSONUtil;
  3. import com.cn.mymes.common.CommonResult;
  4. import org.springframework.security.core.AuthenticationException;
  5. import org.springframework.security.web.AuthenticationEntryPoint;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. /**
  11.  * 未登录或者登录过期时,返回自定义JSON格式
  12.  */
  13. public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
  14.     @Override
  15.     public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
  16.         response.setHeader("Access-Control-Allow-Origin""*");
  17.         response.setHeader("Cache-Control","no-cache");
  18.         response.setCharacterEncoding("UTF-8");
  19.         response.setContentType("application/json");
  20.         response.getWriter().println(JSONUtil.parse(CommonResult.unauthorized(authException.getMessage())));
  21.         response.getWriter().flush();
  22.     }
  23. }

添加SpringSecurity核心接口,获取用户信息

  1. package com.cn.mymes.domain;
  2. import com.cn.mymes.mgb.model.UmsAdmin;
  3. import com.cn.mymes.mgb.model.UmsResource;
  4. import org.springframework.security.core.GrantedAuthority;
  5. import org.springframework.security.core.authority.SimpleGrantedAuthority;
  6. import org.springframework.security.core.userdetails.UserDetails;
  7. import java.util.Collection;
  8. import java.util.List;
  9. import java.util.stream.Collectors;
  10. /**
  11.  * SpringSecurity核心,获取用户信息
  12.  *
  13.  */
  14. public class AdminUserDetails implements UserDetails {
  15.     private UmsAdmin umsAdmin;
  16.     private List<UmsResource> resourceList;
  17.     public AdminUserDetails(UmsAdmin umsAdmin, List<UmsResource> resourceList) {
  18.         this.umsAdmin = umsAdmin;
  19.         this.resourceList = resourceList;
  20.     }
  21.     @Override
  22.     public Collection<? extends GrantedAuthoritygetAuthorities() {
  23.         //返回当前用户的角色
  24.         return resourceList.stream()
  25.                 .map(role ->new SimpleGrantedAuthority(role.getId()+":"+role.getName()))
  26.                 .collect(Collectors.toList());
  27.     }
  28.     @Override
  29.     public String getPassword() {
  30.         return umsAdmin.getPassword();
  31.     }
  32.     @Override
  33.     public String getUsername() {
  34.         return umsAdmin.getUsername();
  35.     }
  36.     @Override
  37.     public boolean isAccountNonExpired() {
  38.         return true;
  39.     }
  40.     @Override
  41.     public boolean isAccountNonLocked() {
  42.         return true;
  43.     }
  44.     @Override
  45.     public boolean isCredentialsNonExpired() {
  46.         return true;
  47.     }
  48.     @Override
  49.     public boolean isEnabled() {
  50.         return umsAdmin.getStatus().equals(1);
  51.     }
  52. }

明天讲MyMes中SpringSecurity项目权限管理中动态管理部分的实现

公众号https://mp.weixin.qq.com/s/nfat2WWWUXdmfUGFBAVEuA

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/262948
推荐阅读
相关标签
  

闽ICP备14008679号