0%

spring-security结合jwt和umi(react前端框架)企业级框架之前后端分离最佳实战(表单模式登录)(二)

前言

上一篇文章已经搭好了基本框架,现在进行spring-security结合的讲解

核心内容

在这里插入图片描述
上面一张图是我基于debug模式跑的,有什么不足的地方,请多多指正。

  • 配置SecurityConfig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package com.wyl.springbootjwt.security;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.core.GrantedAuthorityDefaults;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

import javax.annotation.Resource;

/**
* @Description SecurityConfig 安全配置
* @Author YiLong Wu
* @Date 2020/2/28 14:51
* @Version 1.0.0
*/
@EnableWebSecurity
@Slf4j
@EnableGlobalMethodSecurity(prePostEnabled = true) // 开启方法权限控制
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Resource(name = "tokenExceptionHandler")
private TokenExceptionHandler tokenExceptionHandler;

@Resource(name = "accessDeniedException")
private AccessDeniedException accessDeniedException;

@Resource(name = "jwtAuthenticationFilter")
private JwtAuthenticationFilter jwtAuthenticationFilter;

@Resource(name = "myUserDetailsService")
private MyUserDetailsService myUserDetailsService;

@Resource(name = "myAuthenticationSuccessHandler")
private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler;

@Resource(name = "myAuthenticationFailHandler")
private MyAuthenticationFailHandler myAuthenticationFailHandler;

@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

@Bean
GrantedAuthorityDefaults grantedAuthorityDefaults() {
return new GrantedAuthorityDefaults(""); // 移除ROLE_后缀
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http
// 表示前端必须使用form表单的提交形式
.formLogin()
.successHandler(myAuthenticationSuccessHandler)
.failureHandler(myAuthenticationFailHandler)
.and()
// 让跨域配置被使用
.cors()
.and()
.csrf().disable()
// 添加异常处理
.exceptionHandling()
.authenticationEntryPoint(tokenExceptionHandler)
.accessDeniedHandler(accessDeniedException)
.and()
//关闭session
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
// 拦截所有请求
.authorizeRequests().anyRequest().authenticated();
// 替换过滤器
http.addFilterAt(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
}
}

相关解析:
TokenExceptionHandler: 用户认证失异常理器
AccessDeniedException:访问控制异常处理器
JwtAuthenticationFilter:认证过滤器
MyUserDetailsService *:自定义UserDatailsService用于返回UserDetails
*
MyAuthenticationSuccessHandler *: 登录成功处理器
*
MyAuthenticationFailHandler
:登录失败处理器
PasswordEncoder: 密码编码器,这个可以自定义
GrantedAuthorityDefaults:因为角色权限控制会带用前缀,因此可以使用这个bean去掉

后面的就是拦截配置了,有注释。

关于前端

在这里插入图片描述
在这里插入图片描述

其他的就不一一列出来了,有关代码请在我的github上下载查看即可。

项目代码:spring-security-jwt-umi
在这里插入图片描述

-------------本文结束感谢你的阅读---------