您的位置:首页 > 编程语言 > Java开发

springboot整合mybatis-plus,shiro,swagger

2019-01-25 17:14 921 查看

springboot整合mybatis-plus,shiro,swagger

  1. springboot整合mybatis-plus
  2. springboot整合swagger
  3. springboot整合shiro

环境:jdk1.8,IDEA,mysql5.6
工程结构:

项目已传到github
https://github.com/yuld/springboot-shiro-mybatisplus-swagger2.git

1 mybatis-plus对mybatis做了增强,上手简单,加快开发效率
官网地址:https://mp.baomidou.com/
官网首页是在这样介绍的:

1.1 建表

CREATE TABLE `t_user` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`USERNAME` varchar(50) DEFAULT NULL,
`PASSWORD` varchar(50) DEFAULT NULL,
`EMAIL` varchar(20) DEFAULT NULL,
`CREATETIME` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

插入一些数据

1.2 创建springboot项目并添加依赖,其中lombok是一款插件,需要下载然后添加依赖,使用它的注解可以省去get/set方法,若不使用则显式生成get/set方法,具体使用请查阅相关资料。

<!-- mybatisplus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.3</version>
</dependency>
<!-- druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

1.3创建实体类

package com.dbzq.entity;

import com.baomidou.mybatisplus.annotations.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;

@TableName("t_user")
@Data
@EqualsAndHashCode(callSuper = false)
public class User {
private Integer id;
private String username;
private String password;
private String email;
private Date createtime;
}

1.4创建UserMaper

package com.dbzq.springboot.mapper;

import com.dbzq.springboot.entity.User;
import com.baomidou.mybatisplus.mapper.BaseMapper;

public interface UserMapper extends BaseMapper<User> {

}

1.5创建UserService和UserServiceImpl

UserService:

package com.dbzq.springboot.service;

import com.dbzq.springboot.entity.User;
import com.baomidou.mybatisplus.service.IService;

public interface UserService extends IService<User> {

}

UserServiceImpl:

package com.dbzq.springboot.service.impl;

import com.dbzq.springboot.entity.User;
import com.dbzq.springboot.mapper.UserMapper;
import com.dbzq.springboot.service.UserService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

}

1.6创建UserController,做一个简单的根据ID查询用户

package com.dbzq.springboot.controller;

import com.dbzq.springboot.entity.User;
import com.dbzq.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
public class UserController {

@Autowired
private UserService service;

@GetMapping("/user/{id}")
public User findUserById(@PathVariable("id") Integer id){
User user = service.selectById(id);
return user;
}
}

1.7配置文件

server.port=9090
server.servlet.context-path=/dbzq
#mysql
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

#mybatis-plus:
mybatis-plus.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis-plus.type-aliases-package=com.dbzq.springboot.entity
#开启驼峰命名规则
mybatis-plus.global-config.db-column-underline=true
#控制台打印sql输出
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

#jackson,返回json的时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

启动项目访问:

测试成功,MP整合完成!
mpbatis-plus有很多强大的功能,比如条件构造器和代码生成器,相应的代码请从文章开头的github连接下载

2 swagger:接口的文档在线自动生成,方便接口调试

2.1 添加依赖,不同版本生成的文档界面有所不同

<!-- swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>

2.2 配置swagger

package com.dbzq.springboot.config.swagger;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.dbzq.springboot.controller"))
.paths(PathSelectors.any())
.build();
}

private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("接口文档")
.description("在此页面做接口测试")
.version("1.0.0")
.build();
}
}

2.3 在刚才的controller方法上添加

**@ApiOperation(value="根据id查看用户", notes="根据id查看用户")**
@GetMapping("/user/{id}")
public User findUserById(@PathVariable("id") Integer id){
User user = service.selectById(id);
return user ;
}

2.4 启动项目,访问:http://localhost:9090/dbzq/swagger-ui.html

找到根据id查询用户接口,点击Try it out

输入id=1查询得到:

swagger整合完成

3 shiro,认证授权框架,这里整合后只是简单的完成了认证功能,授权功能没有加上

3.1添加依赖

<!-- shiro -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>

3.2 自定义relam

package com.dbzq.springboot.shiro;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.dbzq.springboot.entity.User;
import com.dbzq.springboot.service.UserService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

public class UserRealm extends AuthorizingRealm {

@Autowired
private UserService userService;

/**
* 认证
* @param token
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//得到用户名
String username = (String) token.getPrincipal();
Wrapper<User> wrapper = new EntityWrapper<User>();
wrapper.eq("username", username);
User user = userService.selectOne(wrapper);
if(user==null){
return null;
}
String password = user.getPassword();
//盐,未添加
//String salt = user.getSalt();
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
user, password,null, this.getName());
return simpleAuthenticationInfo;
}

/**
* 授权
* @param principals
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
}

3.3 shiro配置类

package com.dbzq.springboot.config.shrio;

import com.dbzq.springboot.shiro.UserRealm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShrioConfig {

/**
* 自定义的realm
* @return
*/
@Bean
public UserRealm myShiroRealm() {
UserRealm userRealm = new UserRealm();
return userRealm;
}

/**
* 安全管理器
* @return
*/
@Bean
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(myShiroRealm());
return securityManager;
}

/**
* 过滤链
* @param securityManager
* @return
*/
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
Map<String,String> map = new LinkedHashMap<>();
//登出
map.put("/logout","logout");
//登录请求不拦截
map.put("/login","anon");
//swagger页面不拦截
map.put("/swagger-ui.html", "anon");
map.put("/webjars/**", "anon");
map.put("/v2/**", "anon");
map.put("/swagger-resources/**", "anon");
//拦截所有
map.put("/**","authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
return shiroFilterFactoryBean;
}
}

3.4 LoginController:

package com.dbzq.springboot.controller;

import com.dbzq.springboot.entity.User;
import com.dbzq.springboot.utils.JsonMessage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* @author yuld
*/
@RestController
@Api(value="LoginController",tags={"登录相关接口"})
public class LoginController {

@ApiOperation(value="登录", notes="需要用户名loginacct和密码userpswd")
@PostMapping("/login")
public JsonMessage login(User user) {
JsonMessage message = new JsonMessage();
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(),user.getPassword());
try {
//没有异常则登录成功
subject.login(token);
message.setSuccess(true);
} catch (UnknownAccountException e) {
message.setSuccess(false);
e.printStackTrace();
}catch (IncorrectCredentialsException e) {
message.setSuccess(false);
e.printStackTrace();
}
return message;
}
}

3.5 启动项目到swagger进行测试,输入错误的密码

后台报错:认证未通过

输入不存在的用户名:

shiro整合完毕!

该文章只贴出了部分关键的代码,完整的工程请到github下载
https://github.com/yuld/springboot-shiro-mybatisplus-swagger2.git
若出现错误或者代码有不合理的地方请在评论留言!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: