框架定义
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。
MyBatis是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
ApacheShiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
以上是这三个框架的定义,搭建一个包含以上三个框架的空白项目,可以便于快速开始开发。
Step1.获取一个裸Spring boot项目
前往springboot官网https://start.spring.io/,该地址允许我们自定义依赖并生成一个简易的springboot项目
![1bb90457949f098678385d824ec434c0.png](https://i-blog.csdnimg.cn/blog_migrate/8305cb33e8c5c2e926380a0c19c7c585.jpeg)
此时的架构如图
![915f89828a71ff413a1fa06d25a4d0c5.png](https://i-blog.csdnimg.cn/blog_migrate/0804a14224a5eb47e8f627c95eb723db.jpeg)
Step2.引入Spring web模块
1.只需在pom中添加一个依赖spring-boot-starter-web即可
<!--
2. 创建一个controller即可实现rest-service
![c0c12d0a4706b7d6ab47cb31659dc158.png](https://i-blog.csdnimg.cn/blog_migrate/164800fc9196dc3931f5e168baa0d132.jpeg)
访问测试地址的返回如下:
![128f8f854acae248212ea222d970ab31.png](https://i-blog.csdnimg.cn/blog_migrate/6243aca521b92ed313c051f484a2b359.jpeg)
Step3.添加mybatis支持
此步骤需要引入3个依赖
1.mysql-connector-java用于建立jdbc驱动
2.mybatis-spring-boot-starter用于快速导入mybatis
3.tk.mybatis(可选),用于提供默认sql以加快开发效率
!--mybatis导入-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.2</version>
</dependency>
数据源配置信息则置于application.properties文档中即可,如下
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.101.72:3306/ssc_dev?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root
mybatis的详细配置应新建mybatis-config.xml置于resource目录下,此处不赘述
此时项目架构如下
![5e226af6510ac643fa7478b7d004c062.png](https://i-blog.csdnimg.cn/blog_migrate/58e7025c40165cd045bbd868897777c1.jpeg)
Tips:为了能自动注入生成的Mapper到service层,Application中应添加@MapperScan("com.ttt.springbootdemo.dao.mapper")注解。
Mybatis导入测试如图:
![652f894e52b756cd980dd958d83634c0.png](https://i-blog.csdnimg.cn/blog_migrate/cc1613eb932fa51c03b04a461aff6144.png)
tips:mybatis的mapper.xml放在resource目录下,路径设置在application.properties中
mybatis.mapper-locations=classpath:static/Mapper/*.xml
Step4.添加日志支持
Spring-boot-starter已经提供了基本的日子功能,剩下的是日志的配置,
简单粗暴的办法,在application.properties中加入log参数
logging.level.root=DEBUG
更合理的做法则是新增一个logback.xml文件到resoucre目录下,用于精细配置,如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<!--<include resource="org/springframework/boot/logging/logback/base.xml"/>-->
<property name="LOG_PATH" value="${user.home}/OMS"/>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
<charset>${file.encoding}</charset>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_PATH}/running.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/running/running.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>5MB</maxFileSize>
</rollingPolicy>
<encoder>
<pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
<charset>${file.encoding}</charset>
</encoder>
<!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
<!--<maxFileSize>5MB</maxFileSize>-->
<!--</triggeringPolicy>-->
</appender>
<!-- <logger name="com.dabay.oms.dao.mapper" level="DEBUG" additivity="false">
<appender-ref ref="console"/>
</logger>-->
<logger name="org.springframework" level="error"/>
<logger name="org.apache" level="error"/>
<logger name="com.alibaba.druid" level="error"/>
<logger name="com.alibaba.dubbo" level="info"/>
<logger name="com.dabay.oms.dao" level="error"/>
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>
Step5.引入redis缓存
1. 需要引入的依赖为spring-boot-starter-data-redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. Redis相关的配置可以放到application里
# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=192.168.101.72
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=3000
3. 需要一个配置类以提供redisTemplate
@Configuration
@EnableCaching
public class RedisConfig {
@Bean(name = "redisTemplate")
RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
Step6.引入shiro进行权限管理(可选)
1.需要引入的依赖为shiro-spring
<!--shiro导入-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
2.需要新建一个config类来配置shiro的行动模式,以下讲解shiroConfig中每个bean的作用
(1).ShiroFilterFactoryBean类继承了FactoryBean,能够作为工厂类生成shiro自己的SpringShiroFilter,而shiro代理了servlet的filterChain,在处理请求时先走Shiro 自己的 Filter 体系,然后才会委托给 Servlet 容器的 FilterChain 进行 Servlet 容器级别的 Filter 链执行;
对应的代码为
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/logout", "logout");
filterChainDefinitionMap.put("/favicon.ico", "anon");
filterChainDefinitionMap.put("/druid/**", "anon"); // druid登录交给druid自己
filterChainDefinitionMap.put("/**", "authc");
//authc表示需要验证身份才能访问,还有一些比如anon表示不需要验证身份就能访问等。
shiroFilterFactoryBean.setLoginUrl("/login");
shiroFilterFactoryBean.setSuccessUrl("/index");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
如上,filterChainDefinitionMap设定了不同url请求使用的拦截器,具体规则如下:
![9db93b3d9b24e320e71d8cf4d0547c65.png](https://i-blog.csdnimg.cn/blog_migrate/9ea45687f4f789144b87ee7d60a63421.jpeg)
详情见https://blog.csdn.net/Angel_G/article/details/53993877
(2)shiroRealm(域),也可以认为是shiro的权限数据源,该bean用于连接数据库中权限表与shiro,需要继承shiro的realm并手动实现doGetAuthenticationInfo方法以验证用户,以及doGetAuthorizationInfo方法以向用户授权,简易代码如下:
@Bean
public AuthorizingRealm myShiroRealm(HashedCredentialsMatcher hashedCredentialsMatcher) {
AuthorizingRealm myShiroRealm = new AuthorizingRealm() {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
MyUserNamePassWordToken namePassWordToken = (MyUserNamePassWordToken) token;
SysUser sysUser = new SysUser();
sysUser.setUsername(namePassWordToken.getUsername());
sysUser = sysUserService.findUser(sysUser);
if (sysUser == null) {
throw new UnknownAccountException();
}
return new SimpleAuthenticationInfo(namePassWordToken.getUsername(), "cdas", "dsdv");
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
LOGGER.info("权限配置 --> MyShiroRealm.doGetAuthorizationInfo()");
SysUser user = new SysUser();
user = sy
sUserService.findUser(user);
SimpleAuthorizationInfo simpleAuthorInfo = new SimpleAuthorizationInfo();
simpleAuthorInfo.addRole(user.getUserid().toString());
return simpleAuthorInfo;
}
};
myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher); //设置加密规则
myShiroRealm.setCachingEnabled(true);
myShiroRealm.setAuthorizationCachingEnabled(true);
myShiroRealm.setAuthenticationCachingEnabled(true);
return myShiroRealm;
}
(3)securityManager是shrio框架的核心与管理者,web项目通常使用DefaultWebSecurityManager,并将刚才声明的realm 注入,(可选)也可以通过配置catchManager的方式将shiro的缓存放到redis中
@Bean
public SecurityManager securityManager(AuthorizingRealm myShiroRealm, CacheManager shiroRedisCacheManager) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setCacheManager(shiroRedisCacheManager);
securityManager.setRememberMeManager(cookieRememberMeManager());
securityManager.setRealm(myShiroRealm);
return securityManager;
}
以上是将数据库中的用户User-权限Role关联作为shiro数据源的配置,按自己的需求配置数据库及对应的realm之后shiro的配置就成功了。
源代码地址
hatemyselfandyouall/spring-boot-demo