您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關怎么在Spring Boot 2中利用Spring security 與JWT登錄微信小程序,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
登錄
通過自定義的WxAppletAuthenticationFilter
替換默認的UsernamePasswordAuthenticationFilter
,在UsernamePasswordAuthenticationFilter
中可任意定制自己的登錄方式。
需要結合JWT來實現用戶認證,第一步登錄成功后如何頒發token。
public class CustomAuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Autowired private JwtTokenUtils jwtTokenUtils; @Override public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException { // 使用jwt管理,所以封裝用戶信息生成jwt響應給前端 String token = jwtTokenUtils.generateToken(((WxAppletAuthenticationToken)authentication).getOpenid()); Map<String, Object> result = Maps.newHashMap(); result.put(ConstantEnum.AUTHORIZATION.getValue(), token); httpServletResponse.setContentType(ContentType.JSON.toString()); httpServletResponse.getWriter().write(JSON.toJSONString(result)); } }
第二步,棄用spring security默認的session機制,通過token來管理用戶的登錄狀態。這里有倆段關鍵代碼。
@Override protected void configure(HttpSecurity http) throws Exception { http.csrf() .disable() .sessionManagement() // 不創建Session, 使用jwt來管理用戶的登錄狀態 .sessionCreationPolicy(SessionCreationPolicy.STATELESS) ......; }
第二步,添加token的認證過濾器。
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { @Autowired private AuthService authService; @Autowired private JwtTokenUtils jwtTokenUtils; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { log.debug("processing authentication for [{}]", request.getRequestURI()); String token = request.getHeader(ConstantEnum.AUTHORIZATION.getValue()); String openid = null; if (token != null) { try { openid = jwtTokenUtils.getUsernameFromToken(token); } catch (IllegalArgumentException e) { log.error("an error occurred during getting username from token", e); throw new BasicException(ExceptionEnum.JWT_EXCEPTION.customMessage("an error occurred during getting username from token , token is [%s]", token)); } catch (ExpiredJwtException e) { log.warn("the token is expired and not valid anymore", e); throw new BasicException(ExceptionEnum.JWT_EXCEPTION.customMessage("the token is expired and not valid anymore, token is [%s]", token)); }catch (SignatureException e) { log.warn("JWT signature does not match locally computed signature", e); throw new BasicException(ExceptionEnum.JWT_EXCEPTION.customMessage("JWT signature does not match locally computed signature, token is [%s]", token)); } }else { log.warn("couldn't find token string"); } if (openid != null && SecurityContextHolder.getContext().getAuthentication() == null) { log.debug("security context was null, so authorizing user"); Account account = authService.findAccount(openid); List<Permission> permissions = authService.acquirePermission(account.getAccountId()); List<SimpleGrantedAuthority> authorities = permissions.stream().map(permission -> new SimpleGrantedAuthority(permission.getPermission())).collect(Collectors.toList()); log.info("authorized user [{}], setting security context", openid); SecurityContextHolder.getContext().setAuthentication(new WxAppletAuthenticationToken(openid, authorities)); } filterChain.doFilter(request, response); } }
第一步,開啟注解@EnableGlobalMethodSecurity
。
@SpringBootApplication @EnableGlobalMethodSecurity(prePostEnabled = true) public class JwtSpringSecurityDemoApplication { public static void main(String[] args) { SpringApplication.run(JwtSpringSecurityDemoApplication.class, args); } }
第二部,在需要鑒權的接口上添加@PreAuthorize
注解。
@RestController @RequestMapping("/test") public class TestController { @GetMapping @PreAuthorize("hasAuthority('user:test')") public String test(){ return "test success"; } @GetMapping("/authority") @PreAuthorize("hasAuthority('admin:test')") public String authority(){ return "test authority success"; } }
以上就是怎么在Spring Boot 2中利用Spring security 與JWT登錄微信小程序,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。