前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot+MyBatis+Shiro 搭建杂谈

SpringBoot+MyBatis+Shiro 搭建杂谈

作者头像
好好学java
发布2020-03-10 12:01:45
8790
发布2020-03-10 12:01:45
举报

点击上方 好好学java ,选择 星标 公众号

代码语言:javascript
复制
重磅资讯、干货,第一时间送达今日推荐:用好Java中的枚举,真的没有那么简单!个人原创+1博客:点击前往,查看更多
代码语言:javascript
复制
链接:https://www.cnblogs.com/deng-cc/p/9415279.html

0、写在前面的话

一直想能仿公司框架的形式,着手做一个简单的脚手架,一来是带着目标性能更好地学习,接触新的技术,另外自己如果有什么想要实现的简单需求,就可以进行快速开发,主要还是希望能在权限上有所控制,所以最花时间的还是在Shiro上。

其实目标在github已经有不少大佬的参考物了:

  • zheng(https://gitee.com/shuzheng/zheng) 基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构,提供整套公共微服务服务模块
  • ES(https://github.com/zhangkaitao/es) JavaEE企业级项目的快速开发的脚手架,提供了底层抽象和通用功能,拿来即用
  • renren-security(https://www.renren.io/) 轻量级权限管理系统
  • lenos(https://gitee.com/bweird/lenosp) 快速开发模块化脚手架

我自己也试着搭建了最简单的包含权限的后端,主要是为了走通整个流程,之后也会慢慢试着参考大佬们做一款自己的架子。在整个集成过程中,当然不免遇到了各种奇奇怪怪的问题,这里做一些简单的经验记录,避免旧坑重踩。

1、技术框架整合

1.1 Maven多模块项目的搭建

参考链接:

  • 为什么要搭建多模块项目?
  • Maven最佳实践:划分模块(http://juvenshun.iteye.com/blog/305865)
  • maven构建企业级多模块项目(最好的划分模块方式)(https://blog.csdn.net/program_guys/article/details/76407360)
  • 多模块项目如何搭建?
  • Maven的多模块 Spring MVC + Spring + Mybatis 项目的搭建(http://www.leeyom.top/2017/08/01/tech-maven-multi-module-ssm/)
  • SpringBoot多模块项目实践(Multi-Module)(https://segmentfault.com/a/1190000011367492)

1.2 SpringBoot-MyBatis集成

参考链接:

  • Spring Boot 集成MyBatis(https://blog.csdn.net/isea533/article/details/50359390)
  • mybatis-spring-boot-autoconfigure(http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/)

1.3 SpringBoot-Shiro集成

参考链接:

  • Shiro用starter方式优雅整合到SpringBoot中(https://segmentfault.com/a/1190000014479154#articleHeader0)
  • Spring Boot 集成-Shiro
  • Shiro下简单的RBAC(Realm及相关对象)(http://jinnianshilongnian.iteye.com/blog/2022468)

2、踩坑警告

  • SpringBoot 版本:2.0.3.RELEASE
  • JUnit 版本:4.12
  • SpringBoot-MyBatis 版本:1.3.2
  • SpringBoot-Shiro 版本:1.4.0-RC2

2.1 多模块带来的注意事项

SpringBoot 多模块的单元测试需要指定注解 @SpringBootTest(classes = {Application.class}),这里的 Application.class 即你的SpringBoot启动类,这也就意味着你其他模块的测试也只能在 Application.class 所在的模块中进行,否则编译无法通过因为其他模块找不到 Application.class,当然这是因为其他模块中的依赖问题导致的。

另外需要注意的是,SpringBoot中 的 Bean 扫描默认为 Application.java 所在包及子包,所以哪怕是多模块,也请注意包名的问题,并调整 Application.java 的位置,否则很容易出现找不到 Bean 注入的情况。

如果你还使用了 MyBatis-generator,同样其对于数据源的配置文件,因为多模块的缘故,你可能也无法直接使用 SpringBoot 中 application.properties 的配置,需要单独写一个配置文件在 MyBatis-generator 使用的那个模块下。

2.2 SpringBoot+MyBatis与单元测试

如果在单元测试时发现 xxxMapper 或 xxxDao 的 Bean 无法注入,那么请注意你使用的注解了。在持久层接口上注解使用 @Mapper,而不是仅仅使用 @Repository。实际上哪怕不使用 @Repository 也可以注入持久层的 Bean,但是IDE会在Service类中报红提醒 xxxDao 没有注册 Bean,所以最好还是加上 @Repository,尽管去掉也没有什么影响。

代码语言:javascript
复制
@Repository
@Mapper
public interface RoleDao {
    int deleteByPrimaryKey(Long id);
    int insert(Role record);
    int insertSelective(Role record);
    Role selectByPrimaryKey(Long id);
    int updateByPrimaryKeySelective(Role record);
    int updateByPrimaryKey(Role record);
    Set<Role> findAll();
    Set<Role> findByUserId(Long userId);
}

2.3 Shiro中自定义Realm的Bean注册

在 SpringBoot 和 Shiro 的集成中,Shiro的配置通常是使用一个自定义配置类,通过在方法上使用 @Bean 注解来将配置注册成 Bean,如下:

代码语言:javascript
复制
@Configuration
public class ShiroConfig {
@Bean
public Realm realm() {
 return new MyRealm();
 }

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
  DefaultShiroFilterChainDefinition chain = new DefaultShiroFilterChainDefinition();
 //todo "/anon" not useful
 chain.addPathDefinition("/anon/*", "anon");
 chain.addPathDefinition("/authc/*", "authc");
 return chain;
 }
}

那么在自定义的Realm中还需要单独的注解(如 @Component)标记吗?答案是不需要。如下,哪怕它之中还需要用到其他的 Bean 组件,也不需要再单独做组件注解了(加上反而因为和 @Bean 的方式冲突报错):

代码语言:javascript
复制
 //无需 @Component
public class MyRealm extends AuthorizingRealm {

 @Autowired
 private UserService userService;

 @Override
 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

 return null;
 }

 @Override
 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {

 //...
 return null;
 }
}

另外需要注意的是,在配置url访问权限时,如下两种写法请注意:

  • chain.addPathDefinition("/anon", "anon"); //无效
  • chain.addPathDefinition("/anon/*", "anon"); //有效

3、Demo源码

  • deng-cc / baseMan-demo-init
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 好好学java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0、写在前面的话
  • 1、技术框架整合
  • 1.1 Maven多模块项目的搭建
  • 1.2 SpringBoot-MyBatis集成
  • 1.3 SpringBoot-Shiro集成
  • 2、踩坑警告
  • 2.1 多模块带来的注意事项
  • 2.2 SpringBoot+MyBatis与单元测试
  • 2.3 Shiro中自定义Realm的Bean注册
  • 3、Demo源码
相关产品与服务
项目管理
CODING 项目管理(CODING Project Management,CODING-PM)工具包含迭代管理、需求管理、任务管理、缺陷管理、文件/wiki 等功能,适用于研发团队进行项目管理或敏捷开发实践。结合敏捷研发理念,帮助您对产品进行迭代规划,让每个迭代中的需求、任务、缺陷无障碍沟通流转, 让项目开发过程风险可控,达到可持续性快速迭代。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档