springbootjwttoken前后端分离_4⼩时开发⼀个
SpringBoot+vue。。。
前后端分离项⽬
⽂章总体分为2⼤部分,Java后端接⼝和vue前端页⾯,⽐较长,因为不想分开发布,真正想你4⼩时学会,哈哈。
先看效果:
不多说,开始敲代码。
Java后端接⼝开发
1、前⾔
从零开始搭建⼀个项⽬⾻架,最好选择合适,熟悉的技术,并且在未来易拓展,适合微服务化体系等。所以⼀般以Springboot作为我们的框架基础,这是离不开的了。
然后数据层,我们常⽤的是Mybatis,易上⼿,⽅便维护。但是单表操作⽐较困难,特别是添加字段或减少字段的时候,⽐较繁琐,所以这⾥我推荐使⽤Mybatis Plus(mp.baomidou/),为简化开发⽽⽣,只… CRUD 操作,从⽽节省⼤量时间。
作为⼀个项⽬⾻架,权限也是我们不能忽略的,Shiro配置简单,使⽤也简单,所以使⽤Shiro作为我们的的权限。
考虑到项⽬可能需要部署多台,这时候我们的会话等信息需要共享,Redis是现在主流的缓存中间件,也适合我们的项⽬。
然后因为前后端分离,所以我们使⽤jwt作为我们⽤户⾝份凭证。
ok,我们现在就开始搭建我们的项⽬脚⼿架!
技术栈:
SpringBoot
mybatis plus
shiro
lombok
redis
hibernate validatior
jwt
导图:www.markerhub/map/131
2、新建Springboot项⽬
这⾥,我们使⽤IDEA来开发我们项⽬,新建步骤⽐较简单,我们就不截图了。
开发⼯具与环境:
idea
mysql
jdk 8
maven3.3.9
新建好的项⽬结构如下,SpringBoot版本使⽤的⽬前最新的2.2.6.RELEASE版本
pom的jar包导⼊如下:
org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-devtoolsruntimetrueorg.projectlomboklomboktrue复制代码
devtools:项⽬的热加载重启插件
lombok:简化代码的⼯具
3、整合mybatis plus
接下来,我们来整合mybatis plus,让项⽬能完成基本的增删改查操作。步骤很简单:可以去官⽹看看:
mp.baomidou/guide/insta…
第⼀步:导⼊jar包
pom中导⼊mybatis plus的jar包,因为后⾯会涉及到代码⽣成,所以我们还需要导⼊页⾯模板引擎,这⾥我们⽤的是freemarker。
com.baomidou mybatis-plus-boot-starter 3.2.0org.springframework.boot spring-boot-starter-freemarkermysql mysql-connector-java runtimecom.
第⼆步:然后去写配置⽂件
# DataSource Configspring: datasource: driver-class-name: sql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/vueblog?useUnicode=true&useS
上⾯除了配置数据库的信息,还配置了myabtis plus的mapper的xml⽂件的扫描路径,这⼀步不要忘记了。 第三步:开启mapper接⼝扫描,添加分页插件
新建⼀个包:通过@mapperScan注解指定要变成实现类的接⼝所在的包,然后包下⾯的所有接⼝在编译之后都会⽣成相应的实现类。PaginationInterceptor是⼀个分页插件。
fig.MybatisPlusConfig
@Configuration@EnableTransactionManagement@MapperScan("com.markerhub.mapper")public class MybatisPlusConfig { @Bean public Pagination 第四步:代码⽣成
如果你没再⽤其他插件,那么现在就已经可以使⽤mybatis plus了,官⽅给我们提供了⼀个代码⽣成器,然后我写上⾃⼰的参数之后,就可以直接根据数据库表信息⽣成entity、service、mapper等接⼝和实现类。
com.markerhub.CodeGenerator
因为代码⽐较长,就不贴出来了,在代码仓库上看哈!
⾸先我在数据库中新建了⼀个user表:
CREATE TABLE `m_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(64) DEFAULT NULL, `avatar` varchar(255) DEFAULT N 运⾏CodeGenerator的main⽅法,输⼊表名:m_user,⽣成结果如下:
得到:
简洁!⽅便!经过上⾯的步骤,基本上我们已经把mybatis plus框架集成到项⽬中了。
ps:额,注意⼀下m_blog表的代码也⽣成⼀下哈。
在UserController中写个测试:
@RestController@RequestMapping("/user")public class UserController { @Autowired UserService userService; @GetMapping("/{id}") public Objec
3、统⼀结果封装
这⾥我们⽤到了⼀个Result的类,这个⽤于我们的异步统⼀返回的结果封装。⼀般来说,结果⾥⾯有⼏个要素必要的是否成功,可⽤code表⽰(如200表⽰成功,400表⽰异常)
结果消息
结果数据
所以可得到封装如下:
com.markerhubmon.lang.Result
@Datapublic class Result implements Serializable { private String code; private String msg; private Object data; public static Result succ(Object da
4、整合shiro+jwt,并会话共享
考虑到后⾯可能需要做集、负载均衡等,所以就需要会话共享,⽽shiro的缓存和会话信息,我们⼀般考虑使⽤redis来存储这些数据,所
以,我们不仅仅需要整合shiro,同时也需要整合redis。在开源的项⽬中,我们到了⼀个starter可以快速整合shiro-redis,配置简单,
这⾥也推荐⼤家使⽤。
⽽因为我们需要做的是前后端分离项⽬的⾻架,所以⼀般我们会采⽤token或者jwt作为跨域⾝份验证解决⽅案。所以整合shiro的过程中,
我们需要引⼊jwt的⾝份验证过程。
那么我们就开始整合:
我们使⽤⼀个shiro-redis-spring-boot-starter的jar包,具体教程可以看官⽅⽂档:github/alexxiyang/…
第⼀步:导⼊shiro-redis的starter包:还有jwt的⼯具包,以及为了简化开发,我引⼊了hutool⼯具包。
第⼆步:编写配置:
ShiroConfig
fig.ShiroConfig
/** * shiro启⽤注解拦截控制器 */@Configurationpublic class ShiroConfig { @Autowired JwtFilter jwtFilter; @Bean public SessionManager sessionManager(R 上⾯ShiroConfig,我们主要做了⼏件事情:
1. 引⼊RedisSessionDAO和RedisCacheManager,为了解决shiro的权限数据和会话信息能保存到redis中,实现会话共享。
2. 重写了SessionManager和DefaultWebSecurityManager,同时在DefaultWebSecurityManager中为了关闭shiro⾃带的session
⽅式,我们需要设置为false,这样⽤户就不再能通过session⽅式登录shiro。后⾯将采⽤jwt凭证登录。
3. 在ShiroFilterChainDefinition中,我们不再通过编码形式拦截Controller访问路径,⽽是所有的路由都需要经过JwtFilter这个过滤
器,然后判断请求头中是否含有jwt的信息,有就登录,没有就跳过。跳过之后,有Controller中的shiro注解进⾏再次拦截,⽐如
@RequiresAuthentication,这样控制权限访问。
那么,接下来,我们聊聊ShiroConfig中出现的AccountRealm,还有JwtFilter。
AccountRealm
AccountRealm是shiro进⾏登录或者权限校验的逻辑所在,算是核⼼了,我们需要重写3个⽅法,分别是
supports:为了让realm⽀持jwt的凭证校验
doGetAuthorizationInfo:权限校验
doGetAuthenticationInfo:登录认证校验
我们先来总体看看AccountRealm的代码,然后逐个分析:
com.markerhub.shiro.AccountRealm
@Slf4j@Componentpublic class AccountRealm extends AuthorizingRealm { @Autowired JwtUtils jwtUtils; @Autowired UserService userService;
其实主要就是doGetAuthenticationInfo登录认证这个⽅法,可以看到我们通过jwt获取到⽤户信息,判断⽤户的状态,最后异常就抛出对
应的异常信息,否者封装成SimpleAuthenticationInfo返回给shiro。 接下来我们逐步分析⾥⾯出现的新类:
1、shiro默认supports的是UsernamePasswordToken,⽽我们现在采⽤了jwt的⽅式,所以这⾥我们⾃定义⼀个JwtToken,来完成
shiro的supports⽅法。
JwtToken
com.markerhub.shiro.JwtToken
public class JwtToken implements AuthenticationToken { private String token; public JwtToken(String token) { ken = token; } @Override
2、JwtUtils是个⽣成和校验jwt的⼯具类,其中有些jwt相关的密钥信息是从项⽬配置⽂件中配置的:
@Component@ConfigurationProperties(prefix = "markerhub.jwt")public class JwtUtils { private String secret; private long expire; private String heade
3、⽽在AccountRealm我们还⽤到了AccountProfile,这是为了登录成功之后返回的⼀个⽤户信息的载体,
AccountProfile
com.markerhub.shiro.AccountProfile
@Datapublic class AccountProfile implements Serializable { private Long id; private String username; private String avatar;}复制代码jquery框架定义
第三步,ok,基本的校验的路线完成之后,我们需要少量的基本信息配置:
shiro-redis: enabled: true redis-manager: host: 127.0.0.1:6379markerhub: jwt: # 加密秘钥 secret: f4e2e52034348f86b67cde581c0f9eb5 # token有效时长
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论