@@ -25,8 +25,10 @@ | |||||
<module>../spring-boot-demo-orm-mybatis</module> | <module>../spring-boot-demo-orm-mybatis</module> | ||||
<module>../spring-boot-demo-cache-redis</module> | <module>../spring-boot-demo-cache-redis</module> | ||||
<module>../spring-boot-demo-swagger</module> | <module>../spring-boot-demo-swagger</module> | ||||
<module>../spring-boot-demo-rabc-shiro-mybatis</module> | |||||
<module>../spring-boot-demo-ureport2</module> | <module>../spring-boot-demo-ureport2</module> | ||||
<module>../spring-boot-demo-war</module> | <module>../spring-boot-demo-war</module> | ||||
<module>../spring-boot-demo-util</module> | |||||
</modules> | </modules> | ||||
<parent> | <parent> | ||||
@@ -0,0 +1,118 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<artifactId>spring-boot-demo-rabc-shiro-mybatis</artifactId> | |||||
<version>0.0.1-SNAPSHOT</version> | |||||
<packaging>jar</packaging> | |||||
<name>spring-boot-demo-rabc-shiro-mybatis</name> | |||||
<description>Demo project for Spring Boot</description> | |||||
<parent> | |||||
<groupId>com.xkcoding</groupId> | |||||
<artifactId>spring-boot-demo-parent</artifactId> | |||||
<version>0.0.1-SNAPSHOT</version> | |||||
<relativePath>../spring-boot-demo-parent</relativePath> | |||||
</parent> | |||||
<properties> | |||||
<shiro.version>1.3.2</shiro.version> | |||||
<shiro.redis.version>2.4.2.1-RELEASE</shiro.redis.version> | |||||
<mybatis.starter.version>1.3.1</mybatis.starter.version> | |||||
<druid.starter.version>1.1.5</druid.starter.version> | |||||
<mapper.version>1.1.1</mapper.version> | |||||
<pagehelper.version>1.1.0</pagehelper.version> | |||||
<!-- MyBatis Generator --> | |||||
<!-- Java接口和实体类 --> | |||||
<targetJavaProject>${basedir}/src/main/java</targetJavaProject> | |||||
<targetMapperPackage>com.xkcoding.springbootdemorabcshiromybatis.dao</targetMapperPackage> | |||||
<targetModelPackage>com.xkcoding.springbootdemorabcshiromybatis.model</targetModelPackage> | |||||
<!-- XML生成路径 --> | |||||
<targetResourcesProject>${basedir}/src/main/resources</targetResourcesProject> | |||||
<targetXMLPackage>mapper</targetXMLPackage> | |||||
<!-- 依赖版本 --> | |||||
<mapper.generator.version>3.4.0</mapper.generator.version> | |||||
<mysql.version>5.1.29</mysql.version> | |||||
</properties> | |||||
<dependencies> | |||||
<!--mybatis--> | |||||
<dependency> | |||||
<groupId>org.mybatis.spring.boot</groupId> | |||||
<artifactId>mybatis-spring-boot-starter</artifactId> | |||||
<version>${mybatis.starter.version}</version> | |||||
</dependency> | |||||
<!--druid--> | |||||
<dependency> | |||||
<groupId>com.alibaba</groupId> | |||||
<artifactId>druid-spring-boot-starter</artifactId> | |||||
<version>${druid.starter.version}</version> | |||||
</dependency> | |||||
<!--通用 Mapper--> | |||||
<dependency> | |||||
<groupId>tk.mybatis</groupId> | |||||
<artifactId>mapper-spring-boot-starter</artifactId> | |||||
<version>${mapper.version}</version> | |||||
</dependency> | |||||
<!--PageHelper--> | |||||
<dependency> | |||||
<groupId>com.github.pagehelper</groupId> | |||||
<artifactId>pagehelper-spring-boot-starter</artifactId> | |||||
<version>${pagehelper.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.shiro</groupId> | |||||
<artifactId>shiro-spring</artifactId> | |||||
<version>${shiro.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.crazycake</groupId> | |||||
<artifactId>shiro-redis</artifactId> | |||||
<version>${shiro.redis.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.xkcoding</groupId> | |||||
<artifactId>spring-boot-demo-util</artifactId> | |||||
<version>0.0.1-SNAPSHOT</version> | |||||
<exclusions> | |||||
<exclusion> | |||||
<groupId>com.xiaoleilu</groupId> | |||||
<artifactId>hutool-all</artifactId> | |||||
</exclusion> | |||||
</exclusions> | |||||
</dependency> | |||||
</dependencies> | |||||
<build> | |||||
<plugins> | |||||
<plugin> | |||||
<groupId>org.mybatis.generator</groupId> | |||||
<artifactId>mybatis-generator-maven-plugin</artifactId> | |||||
<version>1.3.2</version> | |||||
<configuration> | |||||
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile> | |||||
<overwrite>true</overwrite> | |||||
<verbose>true</verbose> | |||||
</configuration> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>mysql</groupId> | |||||
<artifactId>mysql-connector-java</artifactId> | |||||
<version>${mysql.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>tk.mybatis</groupId> | |||||
<artifactId>mapper</artifactId> | |||||
<version>${mapper.generator.version}</version> | |||||
</dependency> | |||||
</dependencies> | |||||
</plugin> | |||||
</plugins> | |||||
<finalName>spring-boot-demo-rabc-shiro-mybatis</finalName> | |||||
</build> | |||||
</project> |
@@ -0,0 +1,17 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.mybatis.spring.annotation.MapperScan; | |||||
import org.springframework.boot.SpringApplication; | |||||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||||
@SpringBootApplication | |||||
@MapperScan(basePackages = {"com.xkcoding.springbootdemorabcshiromybatis.dao"}) | |||||
@Slf4j | |||||
public class SpringBootDemoRabcShiroMybatisApplication { | |||||
public static void main(String[] args) { | |||||
SpringApplication.run(SpringBootDemoRabcShiroMybatisApplication.class, args); | |||||
log.info("SpringBootDemoRabcShiroMybatisApplication 启动成功。。。。"); | |||||
} | |||||
} |
@@ -0,0 +1,30 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.config; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.boot.CommandLineRunner; | |||||
import org.springframework.stereotype.Component; | |||||
/** | |||||
* <p> | |||||
* 数据初始化,实现 CommandLineRunner 接口,启动 springboot 后自动执行,如果有多个这个类可以根据 @Order 来指定执行顺序 | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.springbootdemorabcshiromybatis | |||||
* @description: 数据初始化 | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/11/29 下午4:32 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
@Component | |||||
@Slf4j | |||||
public class DBInitConfig implements CommandLineRunner { | |||||
@Override | |||||
public void run(String... strings) throws Exception { | |||||
log.info("正在初始化数据。。。"); | |||||
log.info("数据初始化完成。。。"); | |||||
} | |||||
} |
@@ -0,0 +1,78 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.config; | |||||
import com.google.common.collect.Maps; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.shiro.MyShiroRealm; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.shiro.mgt.DefaultSecurityManager; | |||||
import org.apache.shiro.mgt.SecurityManager; | |||||
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.Map; | |||||
/** | |||||
* Shiro 配置 | |||||
* | |||||
* @package: com.xkcoding.springbootdemorabcshiromybatis.config | |||||
* @description: Shiro 配置 | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/11/29 下午3:24 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
@Configuration | |||||
@Slf4j | |||||
public class ShiroConfig { | |||||
@Bean | |||||
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { | |||||
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); | |||||
// 必须设置 securityManager | |||||
shiroFilterFactoryBean.setSecurityManager(securityManager); | |||||
// 设置登录页面,默认是 Web 工程目录下的"/login.jsp" | |||||
shiroFilterFactoryBean.setLoginUrl("/login"); | |||||
// 设置登陆成功后的页面 | |||||
shiroFilterFactoryBean.setSuccessUrl("/index"); | |||||
// 设置未授权页面 | |||||
shiroFilterFactoryBean.setUnauthorizedUrl("/403"); | |||||
// 配置拦截器链,注意配置的顺序,很关键 | |||||
// 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 | |||||
// authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问 | |||||
Map<String, String> filterChainDefinitionMap = Maps.newLinkedHashMap(); | |||||
// 配置可以被匿名访问的地址 | |||||
filterChainDefinitionMap.put("/static/**", "anon"); | |||||
filterChainDefinitionMap.put("/ajaxLogin", "anon"); | |||||
// 配置 logout,登出部分逻辑由 shiro 为我们实现 | |||||
filterChainDefinitionMap.put("/logout", "logout"); | |||||
// 配置自定义权限 | |||||
filterChainDefinitionMap.put("/add", "perms[权限添加]"); | |||||
filterChainDefinitionMap.put("/**", "authc"); | |||||
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); | |||||
log.info("ShiroFilterFactoryBean 注入成功"); | |||||
return shiroFilterFactoryBean; | |||||
} | |||||
@Bean | |||||
public SecurityManager securityManager(MyShiroRealm myShiroRealm) { | |||||
DefaultWebSecurityManager defaultSecurityManager = new DefaultWebSecurityManager(); | |||||
// 设置 Realm | |||||
// 在 shiro 中,最终是通过 Realm 来获取应用程序中的用户、角色及权限信息的。 | |||||
// 通常情况下,在 Realm 中会直接从我们的数据源中获取 shiro 需要的验证信息。 | |||||
// 可以说,Realm 是专用于安全框架的 DAO。 | |||||
defaultSecurityManager.setRealm(myShiroRealm); | |||||
return defaultSecurityManager; | |||||
} | |||||
@Bean | |||||
public MyShiroRealm myShiroRealm() { | |||||
return new MyShiroRealm(); | |||||
} | |||||
} |
@@ -0,0 +1,124 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.constrant.factory; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 常量生产工厂的接口 | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.springbootdemorabcshiromybatis.constrant.factory | |||||
* @description: 常量生产工厂的接口 | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/12/6 下午3:51 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
public interface Constant { | |||||
String ADMIN_NAME = "超级管理员"; | |||||
String COMMA = ","; | |||||
String SEMI = ";"; | |||||
String SEPARATE = "|"; | |||||
String PATH_SEPARATE = "/"; | |||||
String PERCENT = "%"; | |||||
/** | |||||
* 根据用户id获取用户名称 | |||||
* | |||||
* @param userId 用户id | |||||
* @return 用户名称 | |||||
*/ | |||||
String getRealNameById(Integer userId); | |||||
/** | |||||
* 根据用户id获取用户账号 | |||||
* | |||||
* @param userId 用户id | |||||
* @return 用户账号 | |||||
*/ | |||||
String getUsernameById(Integer userId); | |||||
/** | |||||
* 根据角色id获取角色名称 | |||||
* | |||||
* @param roleId 角色id | |||||
* @return 角色名称 | |||||
*/ | |||||
String getRoleName(Integer roleId); | |||||
/** | |||||
* 根据角色id列表获取角色名称列表 | |||||
* | |||||
* @param roleIds 角色id列表 | |||||
* @return 角色名称列表 | |||||
*/ | |||||
List<String> getRoleNames(List<Integer> roleIds); | |||||
/** | |||||
* 根据用户id获取角色id列表 | |||||
* | |||||
* @param userId 用户id | |||||
* @return 角色id列表 | |||||
*/ | |||||
List<Integer> getRoleIds(Integer userId); | |||||
/** | |||||
* 根据部门id获取部门名称 | |||||
* | |||||
* @param deptId 部门id | |||||
* @return 部门名称 | |||||
*/ | |||||
String getDeptName(Integer deptId); | |||||
/** | |||||
* 根据权限id获取权限名称 | |||||
* | |||||
* @param aclId 权限id | |||||
* @return 权限名称 | |||||
*/ | |||||
String getAclName(Integer aclId); | |||||
/** | |||||
* 根据权限编号获取权限名称 | |||||
* | |||||
* @param code 权限编号 | |||||
* @return 权限名称 | |||||
*/ | |||||
String getAclNameByCode(String code); | |||||
/** | |||||
* 根据状态码获取用户登录状态 | |||||
* | |||||
* @param code 状态码 | |||||
* @return 状态 | |||||
*/ | |||||
String getUserStatusName(Integer code); | |||||
/** | |||||
* 根据状态码获取权限状态 | |||||
* | |||||
* @param code 状态码 | |||||
* @return 状态 | |||||
*/ | |||||
String getAclStatusName(Integer code); | |||||
/** | |||||
* 获取子部门id | |||||
* | |||||
* @param deptId 当前部门id | |||||
* @return 所有子部门id | |||||
*/ | |||||
List<Integer> getSubDeptId(Integer deptId); | |||||
/** | |||||
* 获取所有父部门id | |||||
* | |||||
* @param deptId 当前部门id | |||||
* @return 所有父部门id | |||||
*/ | |||||
List<Integer> getParentDeptIds(Integer deptId); | |||||
} |
@@ -0,0 +1,157 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.constrant.factory; | |||||
import com.google.common.collect.Lists; | |||||
import com.xiaoleilu.hutool.util.StrUtil; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.dao.*; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.enums.AclStatusEnum; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.enums.UserStatusEnum; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.model.*; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.util.SpringContextHolder; | |||||
import org.springframework.context.annotation.DependsOn; | |||||
import org.springframework.stereotype.Component; | |||||
import tk.mybatis.mapper.entity.Example; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* <p> | |||||
* 常量的生产工厂 | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.springbootdemorabcshiromybatis.constrant.factory | |||||
* @description: 常量的生产工厂 | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/12/6 下午4:01 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
@Component | |||||
@DependsOn("springContextHolder") | |||||
public class ConstantFactory implements Constant { | |||||
private MybatisShiroAclMapper aclMapper = SpringContextHolder.getBean(MybatisShiroAclMapper.class); | |||||
private MybatisShiroDeptMapper deptMapper = SpringContextHolder.getBean(MybatisShiroDeptMapper.class); | |||||
private MybatisShiroUserMapper userMapper = SpringContextHolder.getBean(MybatisShiroUserMapper.class); | |||||
private MybatisShiroRoleMapper roleMapper = SpringContextHolder.getBean(MybatisShiroRoleMapper.class); | |||||
private MybatisShiroRoleUserMapper roleUserMapper = SpringContextHolder.getBean(MybatisShiroRoleUserMapper.class); | |||||
public static Constant me() { | |||||
return SpringContextHolder.getBean("constantFactory"); | |||||
} | |||||
@Override | |||||
public String getRealNameById(Integer userId) { | |||||
MybatisShiroUser user = userMapper.selectByPrimaryKey(userId); | |||||
if (user != null) { | |||||
return user.getRealname(); | |||||
} | |||||
return null; | |||||
} | |||||
@Override | |||||
public String getUsernameById(Integer userId) { | |||||
MybatisShiroUser user = userMapper.selectByPrimaryKey(userId); | |||||
if (user != null && StrUtil.isNotEmpty(user.getUsername())) { | |||||
return user.getUsername(); | |||||
} | |||||
return null; | |||||
} | |||||
@Override | |||||
public String getRoleName(Integer roleId) { | |||||
MybatisShiroRole role = roleMapper.selectByPrimaryKey(roleId); | |||||
if (role != null && StrUtil.isNotEmpty(role.getName())) { | |||||
return role.getName(); | |||||
} | |||||
return null; | |||||
} | |||||
@Override | |||||
public List<String> getRoleNames(List<Integer> roleIds) { | |||||
return roleIds.stream().map(id -> getRoleName(id)).collect(Collectors.toList()); | |||||
} | |||||
@Override | |||||
public List<Integer> getRoleIds(Integer userId) { | |||||
MybatisShiroRoleUser param = new MybatisShiroRoleUser(); | |||||
param.setUserId(userId); | |||||
List<MybatisShiroRoleUser> roleUser = roleUserMapper.select(param); | |||||
return roleUser.stream().map(v -> v.getRoleId()).collect(Collectors.toList()); | |||||
} | |||||
@Override | |||||
public String getDeptName(Integer deptId) { | |||||
MybatisShiroDept dept = deptMapper.selectByPrimaryKey(deptId); | |||||
if (dept != null && StrUtil.isNotEmpty(dept.getName())) { | |||||
return dept.getName(); | |||||
} | |||||
return null; | |||||
} | |||||
@Override | |||||
public String getAclName(Integer aclId) { | |||||
MybatisShiroAcl acl = aclMapper.selectByPrimaryKey(aclId); | |||||
if (acl != null && StrUtil.isNotEmpty(acl.getName())) { | |||||
return acl.getName(); | |||||
} | |||||
return null; | |||||
} | |||||
@Override | |||||
public String getAclNameByCode(String code) { | |||||
if (StrUtil.isNotBlank(code)) { | |||||
return null; | |||||
} else { | |||||
MybatisShiroAcl param = new MybatisShiroAcl(); | |||||
param.setCode(code); | |||||
MybatisShiroAcl acl = aclMapper.selectOne(param); | |||||
if (acl != null && StrUtil.isNotEmpty(acl.getName())) { | |||||
return acl.getName(); | |||||
} | |||||
return null; | |||||
} | |||||
} | |||||
@Override | |||||
public String getUserStatusName(Integer code) { | |||||
return UserStatusEnum.valueOf(code); | |||||
} | |||||
@Override | |||||
public String getAclStatusName(Integer code) { | |||||
return AclStatusEnum.valueOf(code); | |||||
} | |||||
@Override | |||||
public List<Integer> getSubDeptId(Integer deptId) { | |||||
Example example = new Example(MybatisShiroDept.class); | |||||
example.createCriteria().andLike("level", "%" + deptId + "%"); | |||||
List<MybatisShiroDept> deptList = deptMapper.selectByExample(example); | |||||
ArrayList<Integer> deptIds = Lists.newArrayList(); | |||||
if (deptList != null || deptList.size() > 0) { | |||||
for (MybatisShiroDept dept : deptList) { | |||||
deptIds.add(dept.getId()); | |||||
} | |||||
} | |||||
return deptIds; | |||||
} | |||||
@Override | |||||
public List<Integer> getParentDeptIds(Integer deptId) { | |||||
MybatisShiroDept dept = deptMapper.selectByPrimaryKey(deptId); | |||||
String level = dept.getLevel(); | |||||
ArrayList<Integer> parentIds = Lists.newArrayList(); | |||||
for (String parentId : level.split(COMMA)) { | |||||
parentIds.add(Integer.valueOf(parentId)); | |||||
} | |||||
return parentIds; | |||||
} | |||||
} |
@@ -0,0 +1,18 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroAcl; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.List; | |||||
@Component | |||||
public interface MybatisShiroAclMapper extends MyMapper<MybatisShiroAcl> { | |||||
/** | |||||
* 根据角色id获取权限列表 | |||||
* | |||||
* @param roleId 角色id | |||||
* @return 权限列表 | |||||
*/ | |||||
List<String> getResUrlsByRoleId(Integer roleId); | |||||
} |
@@ -0,0 +1,9 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroDept; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||||
import org.springframework.stereotype.Component; | |||||
@Component | |||||
public interface MybatisShiroDeptMapper extends MyMapper<MybatisShiroDept> { | |||||
} |
@@ -0,0 +1,9 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroLog; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||||
import org.springframework.stereotype.Component; | |||||
@Component | |||||
public interface MybatisShiroLogMapper extends MyMapper<MybatisShiroLog> { | |||||
} |
@@ -0,0 +1,9 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroRoleAcl; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||||
import org.springframework.stereotype.Component; | |||||
@Component | |||||
public interface MybatisShiroRoleAclMapper extends MyMapper<MybatisShiroRoleAcl> { | |||||
} |
@@ -0,0 +1,9 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroRole; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||||
import org.springframework.stereotype.Component; | |||||
@Component | |||||
public interface MybatisShiroRoleMapper extends MyMapper<MybatisShiroRole> { | |||||
} |
@@ -0,0 +1,9 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroRoleUser; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||||
import org.springframework.stereotype.Component; | |||||
@Component | |||||
public interface MybatisShiroRoleUserMapper extends MyMapper<MybatisShiroRoleUser> { | |||||
} |
@@ -0,0 +1,16 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroUser; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||||
import org.springframework.stereotype.Component; | |||||
@Component | |||||
public interface MybatisShiroUserMapper extends MyMapper<MybatisShiroUser> { | |||||
/** | |||||
* 根据用户账号获得用户信息 | |||||
* | |||||
* @param username 用户账号 | |||||
* @return 用户对象 | |||||
*/ | |||||
MybatisShiroUser findByUsername(String username); | |||||
} |
@@ -0,0 +1,48 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.enums; | |||||
import lombok.Getter; | |||||
/** | |||||
* <p> | |||||
* 权限状态的枚举类 | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.springbootdemorabcshiromybatis.enums | |||||
* @description: 权限状态的枚举类 | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/12/6 下午3:38 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
@Getter | |||||
public enum AclStatusEnum { | |||||
DISABLE(0, "禁用"), ENABLE(1, "启用"); | |||||
private Integer code; | |||||
private String message; | |||||
AclStatusEnum(Integer code, String message) { | |||||
this.code = code; | |||||
this.message = message; | |||||
} | |||||
/** | |||||
* 根据状态码返回状态 | |||||
* | |||||
* @param code 状态码 | |||||
* @return 状态 | |||||
*/ | |||||
public static String valueOf(Integer code) { | |||||
if (code == null) { | |||||
return null; | |||||
} else { | |||||
for (AclStatusEnum statusEnum : AclStatusEnum.values()) { | |||||
if (statusEnum.getCode().equals(code)) { | |||||
return statusEnum.getMessage(); | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,48 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.enums; | |||||
import lombok.Getter; | |||||
/** | |||||
* <p> | |||||
* 用户状态的枚举类 | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.springbootdemorabcshiromybatis.enums | |||||
* @description: 用户状态的枚举类 | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/12/6 下午3:38 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
@Getter | |||||
public enum UserStatusEnum { | |||||
DELETED(-1, "已删除"), DISABLE(0, "禁用"), ENABLE(1, "启用"); | |||||
private Integer code; | |||||
private String message; | |||||
UserStatusEnum(Integer code, String message) { | |||||
this.code = code; | |||||
this.message = message; | |||||
} | |||||
/** | |||||
* 根据状态码返回状态 | |||||
* | |||||
* @param code 状态码 | |||||
* @return 状态 | |||||
*/ | |||||
public static String valueOf(Integer code) { | |||||
if (code == null) { | |||||
return null; | |||||
} else { | |||||
for (UserStatusEnum statusEnum : UserStatusEnum.values()) { | |||||
if (statusEnum.getCode().equals(code)) { | |||||
return statusEnum.getMessage(); | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,334 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||||
import java.util.Date; | |||||
import javax.persistence.*; | |||||
@Table(name = "mybatis_shiro_acl") | |||||
public class MybatisShiroAcl { | |||||
/** | |||||
* 权限id | |||||
*/ | |||||
@Id | |||||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||||
private Integer id; | |||||
/** | |||||
* 权限编号 | |||||
*/ | |||||
private String code; | |||||
/** | |||||
* 权限名称 | |||||
*/ | |||||
private String name; | |||||
/** | |||||
* 权限图标 | |||||
*/ | |||||
private String icon; | |||||
/** | |||||
* 上级权限id | |||||
*/ | |||||
@Column(name = "parent_id") | |||||
private Integer parentId; | |||||
/** | |||||
* 权限层级,默认为0,层级直接用逗号(半角)隔开 | |||||
*/ | |||||
private String level; | |||||
/** | |||||
* 权限的url, 可以填正则表达式 | |||||
*/ | |||||
private String url; | |||||
/** | |||||
* 类型,1:菜单,2:按钮,3:其他 | |||||
*/ | |||||
private Integer type; | |||||
/** | |||||
* 状态,0:冻结,1:正常 | |||||
*/ | |||||
private Integer status; | |||||
/** | |||||
* 权限在当前层级下的顺序,由小到大 | |||||
*/ | |||||
private Integer seq; | |||||
/** | |||||
* 备注 | |||||
*/ | |||||
private String remark; | |||||
/** | |||||
* 操作者 | |||||
*/ | |||||
private String operator; | |||||
/** | |||||
* 最后一次更新时间 | |||||
*/ | |||||
@Column(name = "operate_time") | |||||
private Date operateTime; | |||||
/** | |||||
* 最后一次更新操作者的ip地址 | |||||
*/ | |||||
@Column(name = "operate_ip") | |||||
private String operateIp; | |||||
/** | |||||
* 获取权限id | |||||
* | |||||
* @return id - 权限id | |||||
*/ | |||||
public Integer getId() { | |||||
return id; | |||||
} | |||||
/** | |||||
* 设置权限id | |||||
* | |||||
* @param id 权限id | |||||
*/ | |||||
public void setId(Integer id) { | |||||
this.id = id; | |||||
} | |||||
/** | |||||
* 获取权限编号 | |||||
* | |||||
* @return code - 权限编号 | |||||
*/ | |||||
public String getCode() { | |||||
return code; | |||||
} | |||||
/** | |||||
* 设置权限编号 | |||||
* | |||||
* @param code 权限编号 | |||||
*/ | |||||
public void setCode(String code) { | |||||
this.code = code; | |||||
} | |||||
/** | |||||
* 获取权限名称 | |||||
* | |||||
* @return name - 权限名称 | |||||
*/ | |||||
public String getName() { | |||||
return name; | |||||
} | |||||
/** | |||||
* 设置权限名称 | |||||
* | |||||
* @param name 权限名称 | |||||
*/ | |||||
public void setName(String name) { | |||||
this.name = name; | |||||
} | |||||
/** | |||||
* 获取权限图标 | |||||
* | |||||
* @return icon - 权限图标 | |||||
*/ | |||||
public String getIcon() { | |||||
return icon; | |||||
} | |||||
/** | |||||
* 设置权限图标 | |||||
* | |||||
* @param icon 权限图标 | |||||
*/ | |||||
public void setIcon(String icon) { | |||||
this.icon = icon; | |||||
} | |||||
/** | |||||
* 获取上级权限id | |||||
* | |||||
* @return parent_id - 上级权限id | |||||
*/ | |||||
public Integer getParentId() { | |||||
return parentId; | |||||
} | |||||
/** | |||||
* 设置上级权限id | |||||
* | |||||
* @param parentId 上级权限id | |||||
*/ | |||||
public void setParentId(Integer parentId) { | |||||
this.parentId = parentId; | |||||
} | |||||
/** | |||||
* 获取权限层级,默认为0,层级直接用逗号(半角)隔开 | |||||
* | |||||
* @return level - 权限层级,默认为0,层级直接用逗号(半角)隔开 | |||||
*/ | |||||
public String getLevel() { | |||||
return level; | |||||
} | |||||
/** | |||||
* 设置权限层级,默认为0,层级直接用逗号(半角)隔开 | |||||
* | |||||
* @param level 权限层级,默认为0,层级直接用逗号(半角)隔开 | |||||
*/ | |||||
public void setLevel(String level) { | |||||
this.level = level; | |||||
} | |||||
/** | |||||
* 获取权限的url, 可以填正则表达式 | |||||
* | |||||
* @return url - 权限的url, 可以填正则表达式 | |||||
*/ | |||||
public String getUrl() { | |||||
return url; | |||||
} | |||||
/** | |||||
* 设置权限的url, 可以填正则表达式 | |||||
* | |||||
* @param url 权限的url, 可以填正则表达式 | |||||
*/ | |||||
public void setUrl(String url) { | |||||
this.url = url; | |||||
} | |||||
/** | |||||
* 获取类型,1:菜单,2:按钮,3:其他 | |||||
* | |||||
* @return type - 类型,1:菜单,2:按钮,3:其他 | |||||
*/ | |||||
public Integer getType() { | |||||
return type; | |||||
} | |||||
/** | |||||
* 设置类型,1:菜单,2:按钮,3:其他 | |||||
* | |||||
* @param type 类型,1:菜单,2:按钮,3:其他 | |||||
*/ | |||||
public void setType(Integer type) { | |||||
this.type = type; | |||||
} | |||||
/** | |||||
* 获取状态,0:冻结,1:正常 | |||||
* | |||||
* @return status - 状态,0:冻结,1:正常 | |||||
*/ | |||||
public Integer getStatus() { | |||||
return status; | |||||
} | |||||
/** | |||||
* 设置状态,0:冻结,1:正常 | |||||
* | |||||
* @param status 状态,0:冻结,1:正常 | |||||
*/ | |||||
public void setStatus(Integer status) { | |||||
this.status = status; | |||||
} | |||||
/** | |||||
* 获取权限在当前层级下的顺序,由小到大 | |||||
* | |||||
* @return seq - 权限在当前层级下的顺序,由小到大 | |||||
*/ | |||||
public Integer getSeq() { | |||||
return seq; | |||||
} | |||||
/** | |||||
* 设置权限在当前层级下的顺序,由小到大 | |||||
* | |||||
* @param seq 权限在当前层级下的顺序,由小到大 | |||||
*/ | |||||
public void setSeq(Integer seq) { | |||||
this.seq = seq; | |||||
} | |||||
/** | |||||
* 获取备注 | |||||
* | |||||
* @return remark - 备注 | |||||
*/ | |||||
public String getRemark() { | |||||
return remark; | |||||
} | |||||
/** | |||||
* 设置备注 | |||||
* | |||||
* @param remark 备注 | |||||
*/ | |||||
public void setRemark(String remark) { | |||||
this.remark = remark; | |||||
} | |||||
/** | |||||
* 获取操作者 | |||||
* | |||||
* @return operator - 操作者 | |||||
*/ | |||||
public String getOperator() { | |||||
return operator; | |||||
} | |||||
/** | |||||
* 设置操作者 | |||||
* | |||||
* @param operator 操作者 | |||||
*/ | |||||
public void setOperator(String operator) { | |||||
this.operator = operator; | |||||
} | |||||
/** | |||||
* 获取最后一次更新时间 | |||||
* | |||||
* @return operate_time - 最后一次更新时间 | |||||
*/ | |||||
public Date getOperateTime() { | |||||
return operateTime; | |||||
} | |||||
/** | |||||
* 设置最后一次更新时间 | |||||
* | |||||
* @param operateTime 最后一次更新时间 | |||||
*/ | |||||
public void setOperateTime(Date operateTime) { | |||||
this.operateTime = operateTime; | |||||
} | |||||
/** | |||||
* 获取最后一次更新操作者的ip地址 | |||||
* | |||||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public String getOperateIp() { | |||||
return operateIp; | |||||
} | |||||
/** | |||||
* 设置最后一次更新操作者的ip地址 | |||||
* | |||||
* @param operateIp 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public void setOperateIp(String operateIp) { | |||||
this.operateIp = operateIp; | |||||
} | |||||
} |
@@ -0,0 +1,219 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||||
import java.util.Date; | |||||
import javax.persistence.*; | |||||
@Table(name = "mybatis_shiro_dept") | |||||
public class MybatisShiroDept { | |||||
/** | |||||
* 部门id | |||||
*/ | |||||
@Id | |||||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||||
private Integer id; | |||||
/** | |||||
* 部门名称 | |||||
*/ | |||||
private String name; | |||||
/** | |||||
* 上级部门id,顶层是0 | |||||
*/ | |||||
@Column(name = "parent_id") | |||||
private Integer parentId; | |||||
/** | |||||
* 部门层级,默认为0,层级直接用逗号(半角)隔开 | |||||
*/ | |||||
private String level; | |||||
/** | |||||
* 部门在当前层级下的顺序,由小到大 | |||||
*/ | |||||
private Integer seq; | |||||
/** | |||||
* 备注 | |||||
*/ | |||||
private String remark; | |||||
/** | |||||
* 操作者 | |||||
*/ | |||||
private String operator; | |||||
/** | |||||
* 最后一次更新时间 | |||||
*/ | |||||
@Column(name = "operate_time") | |||||
private Date operateTime; | |||||
/** | |||||
* 最后一次更新操作者的ip地址 | |||||
*/ | |||||
@Column(name = "operate_ip") | |||||
private String operateIp; | |||||
/** | |||||
* 获取部门id | |||||
* | |||||
* @return id - 部门id | |||||
*/ | |||||
public Integer getId() { | |||||
return id; | |||||
} | |||||
/** | |||||
* 设置部门id | |||||
* | |||||
* @param id 部门id | |||||
*/ | |||||
public void setId(Integer id) { | |||||
this.id = id; | |||||
} | |||||
/** | |||||
* 获取部门名称 | |||||
* | |||||
* @return name - 部门名称 | |||||
*/ | |||||
public String getName() { | |||||
return name; | |||||
} | |||||
/** | |||||
* 设置部门名称 | |||||
* | |||||
* @param name 部门名称 | |||||
*/ | |||||
public void setName(String name) { | |||||
this.name = name; | |||||
} | |||||
/** | |||||
* 获取上级部门id,顶层是0 | |||||
* | |||||
* @return parent_id - 上级部门id,顶层是0 | |||||
*/ | |||||
public Integer getParentId() { | |||||
return parentId; | |||||
} | |||||
/** | |||||
* 设置上级部门id,顶层是0 | |||||
* | |||||
* @param parentId 上级部门id,顶层是0 | |||||
*/ | |||||
public void setParentId(Integer parentId) { | |||||
this.parentId = parentId; | |||||
} | |||||
/** | |||||
* 获取部门层级,默认为0,层级直接用逗号(半角)隔开 | |||||
* | |||||
* @return level - 部门层级,默认为0,层级直接用逗号(半角)隔开 | |||||
*/ | |||||
public String getLevel() { | |||||
return level; | |||||
} | |||||
/** | |||||
* 设置部门层级,默认为0,层级直接用逗号(半角)隔开 | |||||
* | |||||
* @param level 部门层级,默认为0,层级直接用逗号(半角)隔开 | |||||
*/ | |||||
public void setLevel(String level) { | |||||
this.level = level; | |||||
} | |||||
/** | |||||
* 获取部门在当前层级下的顺序,由小到大 | |||||
* | |||||
* @return seq - 部门在当前层级下的顺序,由小到大 | |||||
*/ | |||||
public Integer getSeq() { | |||||
return seq; | |||||
} | |||||
/** | |||||
* 设置部门在当前层级下的顺序,由小到大 | |||||
* | |||||
* @param seq 部门在当前层级下的顺序,由小到大 | |||||
*/ | |||||
public void setSeq(Integer seq) { | |||||
this.seq = seq; | |||||
} | |||||
/** | |||||
* 获取备注 | |||||
* | |||||
* @return remark - 备注 | |||||
*/ | |||||
public String getRemark() { | |||||
return remark; | |||||
} | |||||
/** | |||||
* 设置备注 | |||||
* | |||||
* @param remark 备注 | |||||
*/ | |||||
public void setRemark(String remark) { | |||||
this.remark = remark; | |||||
} | |||||
/** | |||||
* 获取操作者 | |||||
* | |||||
* @return operator - 操作者 | |||||
*/ | |||||
public String getOperator() { | |||||
return operator; | |||||
} | |||||
/** | |||||
* 设置操作者 | |||||
* | |||||
* @param operator 操作者 | |||||
*/ | |||||
public void setOperator(String operator) { | |||||
this.operator = operator; | |||||
} | |||||
/** | |||||
* 获取最后一次更新时间 | |||||
* | |||||
* @return operate_time - 最后一次更新时间 | |||||
*/ | |||||
public Date getOperateTime() { | |||||
return operateTime; | |||||
} | |||||
/** | |||||
* 设置最后一次更新时间 | |||||
* | |||||
* @param operateTime 最后一次更新时间 | |||||
*/ | |||||
public void setOperateTime(Date operateTime) { | |||||
this.operateTime = operateTime; | |||||
} | |||||
/** | |||||
* 获取最后一次更新操作者的ip地址 | |||||
* | |||||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public String getOperateIp() { | |||||
return operateIp; | |||||
} | |||||
/** | |||||
* 设置最后一次更新操作者的ip地址 | |||||
* | |||||
* @param operateIp 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public void setOperateIp(String operateIp) { | |||||
this.operateIp = operateIp; | |||||
} | |||||
} |
@@ -0,0 +1,221 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||||
import java.util.Date; | |||||
import javax.persistence.*; | |||||
@Table(name = "mybatis_shiro_log") | |||||
public class MybatisShiroLog { | |||||
/** | |||||
* 日志记录id | |||||
*/ | |||||
@Id | |||||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||||
private Integer id; | |||||
/** | |||||
* 权限更新的类型,1:部门,2:用户,3:权限模块,4:权限,5:角色,6:角色用户关系,7:角色权限关系 | |||||
*/ | |||||
private Integer type; | |||||
/** | |||||
* 基于type后指定的对象id,比如用户、权限、角色等表的主键 | |||||
*/ | |||||
@Column(name = "target_id") | |||||
private Integer targetId; | |||||
/** | |||||
* 操作者 | |||||
*/ | |||||
private String operator; | |||||
/** | |||||
* 最后一次更新时间 | |||||
*/ | |||||
@Column(name = "operate_time") | |||||
private Date operateTime; | |||||
/** | |||||
* 最后一次更新操作者的ip地址 | |||||
*/ | |||||
@Column(name = "operate_ip") | |||||
private String operateIp; | |||||
/** | |||||
* 当前是否复原过,0:没有复原过,1:复原过 | |||||
*/ | |||||
private Integer status; | |||||
/** | |||||
* 旧值 | |||||
*/ | |||||
@Column(name = "old_value") | |||||
private String oldValue; | |||||
/** | |||||
* 新值 | |||||
*/ | |||||
@Column(name = "new_value") | |||||
private String newValue; | |||||
/** | |||||
* 获取日志记录id | |||||
* | |||||
* @return id - 日志记录id | |||||
*/ | |||||
public Integer getId() { | |||||
return id; | |||||
} | |||||
/** | |||||
* 设置日志记录id | |||||
* | |||||
* @param id 日志记录id | |||||
*/ | |||||
public void setId(Integer id) { | |||||
this.id = id; | |||||
} | |||||
/** | |||||
* 获取权限更新的类型,1:部门,2:用户,3:权限模块,4:权限,5:角色,6:角色用户关系,7:角色权限关系 | |||||
* | |||||
* @return type - 权限更新的类型,1:部门,2:用户,3:权限模块,4:权限,5:角色,6:角色用户关系,7:角色权限关系 | |||||
*/ | |||||
public Integer getType() { | |||||
return type; | |||||
} | |||||
/** | |||||
* 设置权限更新的类型,1:部门,2:用户,3:权限模块,4:权限,5:角色,6:角色用户关系,7:角色权限关系 | |||||
* | |||||
* @param type 权限更新的类型,1:部门,2:用户,3:权限模块,4:权限,5:角色,6:角色用户关系,7:角色权限关系 | |||||
*/ | |||||
public void setType(Integer type) { | |||||
this.type = type; | |||||
} | |||||
/** | |||||
* 获取基于type后指定的对象id,比如用户、权限、角色等表的主键 | |||||
* | |||||
* @return target_id - 基于type后指定的对象id,比如用户、权限、角色等表的主键 | |||||
*/ | |||||
public Integer getTargetId() { | |||||
return targetId; | |||||
} | |||||
/** | |||||
* 设置基于type后指定的对象id,比如用户、权限、角色等表的主键 | |||||
* | |||||
* @param targetId 基于type后指定的对象id,比如用户、权限、角色等表的主键 | |||||
*/ | |||||
public void setTargetId(Integer targetId) { | |||||
this.targetId = targetId; | |||||
} | |||||
/** | |||||
* 获取操作者 | |||||
* | |||||
* @return operator - 操作者 | |||||
*/ | |||||
public String getOperator() { | |||||
return operator; | |||||
} | |||||
/** | |||||
* 设置操作者 | |||||
* | |||||
* @param operator 操作者 | |||||
*/ | |||||
public void setOperator(String operator) { | |||||
this.operator = operator; | |||||
} | |||||
/** | |||||
* 获取最后一次更新时间 | |||||
* | |||||
* @return operate_time - 最后一次更新时间 | |||||
*/ | |||||
public Date getOperateTime() { | |||||
return operateTime; | |||||
} | |||||
/** | |||||
* 设置最后一次更新时间 | |||||
* | |||||
* @param operateTime 最后一次更新时间 | |||||
*/ | |||||
public void setOperateTime(Date operateTime) { | |||||
this.operateTime = operateTime; | |||||
} | |||||
/** | |||||
* 获取最后一次更新操作者的ip地址 | |||||
* | |||||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public String getOperateIp() { | |||||
return operateIp; | |||||
} | |||||
/** | |||||
* 设置最后一次更新操作者的ip地址 | |||||
* | |||||
* @param operateIp 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public void setOperateIp(String operateIp) { | |||||
this.operateIp = operateIp; | |||||
} | |||||
/** | |||||
* 获取当前是否复原过,0:没有复原过,1:复原过 | |||||
* | |||||
* @return status - 当前是否复原过,0:没有复原过,1:复原过 | |||||
*/ | |||||
public Integer getStatus() { | |||||
return status; | |||||
} | |||||
/** | |||||
* 设置当前是否复原过,0:没有复原过,1:复原过 | |||||
* | |||||
* @param status 当前是否复原过,0:没有复原过,1:复原过 | |||||
*/ | |||||
public void setStatus(Integer status) { | |||||
this.status = status; | |||||
} | |||||
/** | |||||
* 获取旧值 | |||||
* | |||||
* @return old_value - 旧值 | |||||
*/ | |||||
public String getOldValue() { | |||||
return oldValue; | |||||
} | |||||
/** | |||||
* 设置旧值 | |||||
* | |||||
* @param oldValue 旧值 | |||||
*/ | |||||
public void setOldValue(String oldValue) { | |||||
this.oldValue = oldValue; | |||||
} | |||||
/** | |||||
* 获取新值 | |||||
* | |||||
* @return new_value - 新值 | |||||
*/ | |||||
public String getNewValue() { | |||||
return newValue; | |||||
} | |||||
/** | |||||
* 设置新值 | |||||
* | |||||
* @param newValue 新值 | |||||
*/ | |||||
public void setNewValue(String newValue) { | |||||
this.newValue = newValue; | |||||
} | |||||
} |
@@ -0,0 +1,195 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||||
import java.util.Date; | |||||
import javax.persistence.*; | |||||
@Table(name = "mybatis_shiro_role") | |||||
public class MybatisShiroRole { | |||||
/** | |||||
* 角色id | |||||
*/ | |||||
@Id | |||||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||||
private Integer id; | |||||
/** | |||||
* 角色名称 | |||||
*/ | |||||
private String name; | |||||
/** | |||||
* 角色的类型,1:管理员角色,2:其他 | |||||
*/ | |||||
private Integer type; | |||||
/** | |||||
* 状态,0:冻结,1:可用 | |||||
*/ | |||||
private Integer status; | |||||
/** | |||||
* 备注 | |||||
*/ | |||||
private String remark; | |||||
/** | |||||
* 操作者 | |||||
*/ | |||||
private String operator; | |||||
/** | |||||
* 最后一次更新时间 | |||||
*/ | |||||
@Column(name = "operate_time") | |||||
private Date operateTime; | |||||
/** | |||||
* 最后一次更新操作者的ip地址 | |||||
*/ | |||||
@Column(name = "operate_ip") | |||||
private String operateIp; | |||||
/** | |||||
* 获取角色id | |||||
* | |||||
* @return id - 角色id | |||||
*/ | |||||
public Integer getId() { | |||||
return id; | |||||
} | |||||
/** | |||||
* 设置角色id | |||||
* | |||||
* @param id 角色id | |||||
*/ | |||||
public void setId(Integer id) { | |||||
this.id = id; | |||||
} | |||||
/** | |||||
* 获取角色名称 | |||||
* | |||||
* @return name - 角色名称 | |||||
*/ | |||||
public String getName() { | |||||
return name; | |||||
} | |||||
/** | |||||
* 设置角色名称 | |||||
* | |||||
* @param name 角色名称 | |||||
*/ | |||||
public void setName(String name) { | |||||
this.name = name; | |||||
} | |||||
/** | |||||
* 获取角色的类型,1:管理员角色,2:其他 | |||||
* | |||||
* @return type - 角色的类型,1:管理员角色,2:其他 | |||||
*/ | |||||
public Integer getType() { | |||||
return type; | |||||
} | |||||
/** | |||||
* 设置角色的类型,1:管理员角色,2:其他 | |||||
* | |||||
* @param type 角色的类型,1:管理员角色,2:其他 | |||||
*/ | |||||
public void setType(Integer type) { | |||||
this.type = type; | |||||
} | |||||
/** | |||||
* 获取状态,0:冻结,1:可用 | |||||
* | |||||
* @return status - 状态,0:冻结,1:可用 | |||||
*/ | |||||
public Integer getStatus() { | |||||
return status; | |||||
} | |||||
/** | |||||
* 设置状态,0:冻结,1:可用 | |||||
* | |||||
* @param status 状态,0:冻结,1:可用 | |||||
*/ | |||||
public void setStatus(Integer status) { | |||||
this.status = status; | |||||
} | |||||
/** | |||||
* 获取备注 | |||||
* | |||||
* @return remark - 备注 | |||||
*/ | |||||
public String getRemark() { | |||||
return remark; | |||||
} | |||||
/** | |||||
* 设置备注 | |||||
* | |||||
* @param remark 备注 | |||||
*/ | |||||
public void setRemark(String remark) { | |||||
this.remark = remark; | |||||
} | |||||
/** | |||||
* 获取操作者 | |||||
* | |||||
* @return operator - 操作者 | |||||
*/ | |||||
public String getOperator() { | |||||
return operator; | |||||
} | |||||
/** | |||||
* 设置操作者 | |||||
* | |||||
* @param operator 操作者 | |||||
*/ | |||||
public void setOperator(String operator) { | |||||
this.operator = operator; | |||||
} | |||||
/** | |||||
* 获取最后一次更新时间 | |||||
* | |||||
* @return operate_time - 最后一次更新时间 | |||||
*/ | |||||
public Date getOperateTime() { | |||||
return operateTime; | |||||
} | |||||
/** | |||||
* 设置最后一次更新时间 | |||||
* | |||||
* @param operateTime 最后一次更新时间 | |||||
*/ | |||||
public void setOperateTime(Date operateTime) { | |||||
this.operateTime = operateTime; | |||||
} | |||||
/** | |||||
* 获取最后一次更新操作者的ip地址 | |||||
* | |||||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public String getOperateIp() { | |||||
return operateIp; | |||||
} | |||||
/** | |||||
* 设置最后一次更新操作者的ip地址 | |||||
* | |||||
* @param operateIp 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public void setOperateIp(String operateIp) { | |||||
this.operateIp = operateIp; | |||||
} | |||||
} |
@@ -0,0 +1,151 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||||
import java.util.Date; | |||||
import javax.persistence.*; | |||||
@Table(name = "mybatis_shiro_role_acl") | |||||
public class MybatisShiroRoleAcl { | |||||
/** | |||||
* 角色-权限id | |||||
*/ | |||||
@Id | |||||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||||
private Integer id; | |||||
/** | |||||
* 角色id | |||||
*/ | |||||
@Column(name = "role_id") | |||||
private Integer roleId; | |||||
/** | |||||
* 权限id | |||||
*/ | |||||
@Column(name = "acl_id") | |||||
private Integer aclId; | |||||
/** | |||||
* 操作者 | |||||
*/ | |||||
private String operator; | |||||
/** | |||||
* 最后一次更新时间 | |||||
*/ | |||||
@Column(name = "operate_time") | |||||
private Date operateTime; | |||||
/** | |||||
* 最后一次更新操作者的ip地址 | |||||
*/ | |||||
@Column(name = "operate_ip") | |||||
private String operateIp; | |||||
/** | |||||
* 获取角色-权限id | |||||
* | |||||
* @return id - 角色-权限id | |||||
*/ | |||||
public Integer getId() { | |||||
return id; | |||||
} | |||||
/** | |||||
* 设置角色-权限id | |||||
* | |||||
* @param id 角色-权限id | |||||
*/ | |||||
public void setId(Integer id) { | |||||
this.id = id; | |||||
} | |||||
/** | |||||
* 获取角色id | |||||
* | |||||
* @return role_id - 角色id | |||||
*/ | |||||
public Integer getRoleId() { | |||||
return roleId; | |||||
} | |||||
/** | |||||
* 设置角色id | |||||
* | |||||
* @param roleId 角色id | |||||
*/ | |||||
public void setRoleId(Integer roleId) { | |||||
this.roleId = roleId; | |||||
} | |||||
/** | |||||
* 获取权限id | |||||
* | |||||
* @return acl_id - 权限id | |||||
*/ | |||||
public Integer getAclId() { | |||||
return aclId; | |||||
} | |||||
/** | |||||
* 设置权限id | |||||
* | |||||
* @param aclId 权限id | |||||
*/ | |||||
public void setAclId(Integer aclId) { | |||||
this.aclId = aclId; | |||||
} | |||||
/** | |||||
* 获取操作者 | |||||
* | |||||
* @return operator - 操作者 | |||||
*/ | |||||
public String getOperator() { | |||||
return operator; | |||||
} | |||||
/** | |||||
* 设置操作者 | |||||
* | |||||
* @param operator 操作者 | |||||
*/ | |||||
public void setOperator(String operator) { | |||||
this.operator = operator; | |||||
} | |||||
/** | |||||
* 获取最后一次更新时间 | |||||
* | |||||
* @return operate_time - 最后一次更新时间 | |||||
*/ | |||||
public Date getOperateTime() { | |||||
return operateTime; | |||||
} | |||||
/** | |||||
* 设置最后一次更新时间 | |||||
* | |||||
* @param operateTime 最后一次更新时间 | |||||
*/ | |||||
public void setOperateTime(Date operateTime) { | |||||
this.operateTime = operateTime; | |||||
} | |||||
/** | |||||
* 获取最后一次更新操作者的ip地址 | |||||
* | |||||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public String getOperateIp() { | |||||
return operateIp; | |||||
} | |||||
/** | |||||
* 设置最后一次更新操作者的ip地址 | |||||
* | |||||
* @param operateIp 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public void setOperateIp(String operateIp) { | |||||
this.operateIp = operateIp; | |||||
} | |||||
} |
@@ -0,0 +1,151 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||||
import java.util.Date; | |||||
import javax.persistence.*; | |||||
@Table(name = "mybatis_shiro_role_user") | |||||
public class MybatisShiroRoleUser { | |||||
/** | |||||
* 角色-用户id | |||||
*/ | |||||
@Id | |||||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||||
private Integer id; | |||||
/** | |||||
* 角色id | |||||
*/ | |||||
@Column(name = "role_id") | |||||
private Integer roleId; | |||||
/** | |||||
* 用户id | |||||
*/ | |||||
@Column(name = "user_id") | |||||
private Integer userId; | |||||
/** | |||||
* 操作者 | |||||
*/ | |||||
private String operator; | |||||
/** | |||||
* 最后一次更新时间 | |||||
*/ | |||||
@Column(name = "operate_time") | |||||
private Date operateTime; | |||||
/** | |||||
* 最后一次更新操作者的ip地址 | |||||
*/ | |||||
@Column(name = "operate_ip") | |||||
private String operateIp; | |||||
/** | |||||
* 获取角色-用户id | |||||
* | |||||
* @return id - 角色-用户id | |||||
*/ | |||||
public Integer getId() { | |||||
return id; | |||||
} | |||||
/** | |||||
* 设置角色-用户id | |||||
* | |||||
* @param id 角色-用户id | |||||
*/ | |||||
public void setId(Integer id) { | |||||
this.id = id; | |||||
} | |||||
/** | |||||
* 获取角色id | |||||
* | |||||
* @return role_id - 角色id | |||||
*/ | |||||
public Integer getRoleId() { | |||||
return roleId; | |||||
} | |||||
/** | |||||
* 设置角色id | |||||
* | |||||
* @param roleId 角色id | |||||
*/ | |||||
public void setRoleId(Integer roleId) { | |||||
this.roleId = roleId; | |||||
} | |||||
/** | |||||
* 获取用户id | |||||
* | |||||
* @return user_id - 用户id | |||||
*/ | |||||
public Integer getUserId() { | |||||
return userId; | |||||
} | |||||
/** | |||||
* 设置用户id | |||||
* | |||||
* @param userId 用户id | |||||
*/ | |||||
public void setUserId(Integer userId) { | |||||
this.userId = userId; | |||||
} | |||||
/** | |||||
* 获取操作者 | |||||
* | |||||
* @return operator - 操作者 | |||||
*/ | |||||
public String getOperator() { | |||||
return operator; | |||||
} | |||||
/** | |||||
* 设置操作者 | |||||
* | |||||
* @param operator 操作者 | |||||
*/ | |||||
public void setOperator(String operator) { | |||||
this.operator = operator; | |||||
} | |||||
/** | |||||
* 获取最后一次更新时间 | |||||
* | |||||
* @return operate_time - 最后一次更新时间 | |||||
*/ | |||||
public Date getOperateTime() { | |||||
return operateTime; | |||||
} | |||||
/** | |||||
* 设置最后一次更新时间 | |||||
* | |||||
* @param operateTime 最后一次更新时间 | |||||
*/ | |||||
public void setOperateTime(Date operateTime) { | |||||
this.operateTime = operateTime; | |||||
} | |||||
/** | |||||
* 获取最后一次更新操作者的ip地址 | |||||
* | |||||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public String getOperateIp() { | |||||
return operateIp; | |||||
} | |||||
/** | |||||
* 设置最后一次更新操作者的ip地址 | |||||
* | |||||
* @param operateIp 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public void setOperateIp(String operateIp) { | |||||
this.operateIp = operateIp; | |||||
} | |||||
} |
@@ -0,0 +1,382 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||||
import java.util.Date; | |||||
import javax.persistence.*; | |||||
@Table(name = "mybatis_shiro_user") | |||||
public class MybatisShiroUser { | |||||
/** | |||||
* 用户id | |||||
*/ | |||||
@Id | |||||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||||
private Integer id; | |||||
/** | |||||
* 用户名 | |||||
*/ | |||||
private String username; | |||||
/** | |||||
* 加密后的密码 | |||||
*/ | |||||
private String password; | |||||
/** | |||||
* 密码加密的盐值 | |||||
*/ | |||||
private String salt; | |||||
/** | |||||
* 头像 | |||||
*/ | |||||
private String avatar; | |||||
/** | |||||
* 真实姓名 | |||||
*/ | |||||
private String realname; | |||||
/** | |||||
* 手机号 | |||||
*/ | |||||
private String telephone; | |||||
/** | |||||
* 邮箱 | |||||
*/ | |||||
private String mail; | |||||
/** | |||||
* 用户所在部门的id | |||||
*/ | |||||
@Column(name = "dept_id") | |||||
private Integer deptId; | |||||
/** | |||||
* 状态,-1:删除,0:冻结状态,1:正常 | |||||
*/ | |||||
private Integer status; | |||||
/** | |||||
* 备注 | |||||
*/ | |||||
private String remark; | |||||
/** | |||||
* 最后一次登录的时间 | |||||
*/ | |||||
@Column(name = "last_time") | |||||
private Date lastTime; | |||||
/** | |||||
* 最后一次登录的ip地址 | |||||
*/ | |||||
@Column(name = "last_ip") | |||||
private String lastIp; | |||||
/** | |||||
* 操作者 | |||||
*/ | |||||
private String operator; | |||||
/** | |||||
* 最后一次更新时间 | |||||
*/ | |||||
@Column(name = "operate_time") | |||||
private Date operateTime; | |||||
/** | |||||
* 最后一次更新操作者的ip地址 | |||||
*/ | |||||
@Column(name = "operate_ip") | |||||
private String operateIp; | |||||
/** | |||||
* 获取用户id | |||||
* | |||||
* @return id - 用户id | |||||
*/ | |||||
public Integer getId() { | |||||
return id; | |||||
} | |||||
/** | |||||
* 设置用户id | |||||
* | |||||
* @param id 用户id | |||||
*/ | |||||
public void setId(Integer id) { | |||||
this.id = id; | |||||
} | |||||
/** | |||||
* 获取用户名 | |||||
* | |||||
* @return username - 用户名 | |||||
*/ | |||||
public String getUsername() { | |||||
return username; | |||||
} | |||||
/** | |||||
* 设置用户名 | |||||
* | |||||
* @param username 用户名 | |||||
*/ | |||||
public void setUsername(String username) { | |||||
this.username = username; | |||||
} | |||||
/** | |||||
* 获取加密后的密码 | |||||
* | |||||
* @return password - 加密后的密码 | |||||
*/ | |||||
public String getPassword() { | |||||
return password; | |||||
} | |||||
/** | |||||
* 设置加密后的密码 | |||||
* | |||||
* @param password 加密后的密码 | |||||
*/ | |||||
public void setPassword(String password) { | |||||
this.password = password; | |||||
} | |||||
/** | |||||
* 获取密码加密的盐值 | |||||
* | |||||
* @return salt - 密码加密的盐值 | |||||
*/ | |||||
public String getSalt() { | |||||
return salt; | |||||
} | |||||
/** | |||||
* 设置密码加密的盐值 | |||||
* | |||||
* @param salt 密码加密的盐值 | |||||
*/ | |||||
public void setSalt(String salt) { | |||||
this.salt = salt; | |||||
} | |||||
/** | |||||
* 获取头像 | |||||
* | |||||
* @return avatar - 头像 | |||||
*/ | |||||
public String getAvatar() { | |||||
return avatar; | |||||
} | |||||
/** | |||||
* 设置头像 | |||||
* | |||||
* @param avatar 头像 | |||||
*/ | |||||
public void setAvatar(String avatar) { | |||||
this.avatar = avatar; | |||||
} | |||||
/** | |||||
* 获取真实姓名 | |||||
* | |||||
* @return realname - 真实姓名 | |||||
*/ | |||||
public String getRealname() { | |||||
return realname; | |||||
} | |||||
/** | |||||
* 设置真实姓名 | |||||
* | |||||
* @param realname 真实姓名 | |||||
*/ | |||||
public void setRealname(String realname) { | |||||
this.realname = realname; | |||||
} | |||||
/** | |||||
* 获取手机号 | |||||
* | |||||
* @return telephone - 手机号 | |||||
*/ | |||||
public String getTelephone() { | |||||
return telephone; | |||||
} | |||||
/** | |||||
* 设置手机号 | |||||
* | |||||
* @param telephone 手机号 | |||||
*/ | |||||
public void setTelephone(String telephone) { | |||||
this.telephone = telephone; | |||||
} | |||||
/** | |||||
* 获取邮箱 | |||||
* | |||||
* @return mail - 邮箱 | |||||
*/ | |||||
public String getMail() { | |||||
return mail; | |||||
} | |||||
/** | |||||
* 设置邮箱 | |||||
* | |||||
* @param mail 邮箱 | |||||
*/ | |||||
public void setMail(String mail) { | |||||
this.mail = mail; | |||||
} | |||||
/** | |||||
* 获取用户所在部门的id | |||||
* | |||||
* @return dept_id - 用户所在部门的id | |||||
*/ | |||||
public Integer getDeptId() { | |||||
return deptId; | |||||
} | |||||
/** | |||||
* 设置用户所在部门的id | |||||
* | |||||
* @param deptId 用户所在部门的id | |||||
*/ | |||||
public void setDeptId(Integer deptId) { | |||||
this.deptId = deptId; | |||||
} | |||||
/** | |||||
* 获取状态,-1:删除,0:冻结状态,1:正常 | |||||
* | |||||
* @return status - 状态,-1:删除,0:冻结状态,1:正常 | |||||
*/ | |||||
public Integer getStatus() { | |||||
return status; | |||||
} | |||||
/** | |||||
* 设置状态,-1:删除,0:冻结状态,1:正常 | |||||
* | |||||
* @param status 状态,-1:删除,0:冻结状态,1:正常 | |||||
*/ | |||||
public void setStatus(Integer status) { | |||||
this.status = status; | |||||
} | |||||
/** | |||||
* 获取备注 | |||||
* | |||||
* @return remark - 备注 | |||||
*/ | |||||
public String getRemark() { | |||||
return remark; | |||||
} | |||||
/** | |||||
* 设置备注 | |||||
* | |||||
* @param remark 备注 | |||||
*/ | |||||
public void setRemark(String remark) { | |||||
this.remark = remark; | |||||
} | |||||
/** | |||||
* 获取最后一次登录的时间 | |||||
* | |||||
* @return last_time - 最后一次登录的时间 | |||||
*/ | |||||
public Date getLastTime() { | |||||
return lastTime; | |||||
} | |||||
/** | |||||
* 设置最后一次登录的时间 | |||||
* | |||||
* @param lastTime 最后一次登录的时间 | |||||
*/ | |||||
public void setLastTime(Date lastTime) { | |||||
this.lastTime = lastTime; | |||||
} | |||||
/** | |||||
* 获取最后一次登录的ip地址 | |||||
* | |||||
* @return last_ip - 最后一次登录的ip地址 | |||||
*/ | |||||
public String getLastIp() { | |||||
return lastIp; | |||||
} | |||||
/** | |||||
* 设置最后一次登录的ip地址 | |||||
* | |||||
* @param lastIp 最后一次登录的ip地址 | |||||
*/ | |||||
public void setLastIp(String lastIp) { | |||||
this.lastIp = lastIp; | |||||
} | |||||
/** | |||||
* 获取操作者 | |||||
* | |||||
* @return operator - 操作者 | |||||
*/ | |||||
public String getOperator() { | |||||
return operator; | |||||
} | |||||
/** | |||||
* 设置操作者 | |||||
* | |||||
* @param operator 操作者 | |||||
*/ | |||||
public void setOperator(String operator) { | |||||
this.operator = operator; | |||||
} | |||||
/** | |||||
* 获取最后一次更新时间 | |||||
* | |||||
* @return operate_time - 最后一次更新时间 | |||||
*/ | |||||
public Date getOperateTime() { | |||||
return operateTime; | |||||
} | |||||
/** | |||||
* 设置最后一次更新时间 | |||||
* | |||||
* @param operateTime 最后一次更新时间 | |||||
*/ | |||||
public void setOperateTime(Date operateTime) { | |||||
this.operateTime = operateTime; | |||||
} | |||||
/** | |||||
* 获取最后一次更新操作者的ip地址 | |||||
* | |||||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public String getOperateIp() { | |||||
return operateIp; | |||||
} | |||||
/** | |||||
* 设置最后一次更新操作者的ip地址 | |||||
* | |||||
* @param operateIp 最后一次更新操作者的ip地址 | |||||
*/ | |||||
public void setOperateIp(String operateIp) { | |||||
this.operateIp = operateIp; | |||||
} | |||||
} |
@@ -0,0 +1,96 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.shiro; | |||||
import com.google.common.collect.Sets; | |||||
import com.xiaoleilu.hutool.util.StrUtil; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroUserMapper; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroUser; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.shiro.factory.Shiro; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.shiro.factory.ShiroFactroy; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.shiro.authc.*; | |||||
import org.apache.shiro.authc.credential.CredentialsMatcher; | |||||
import org.apache.shiro.authc.credential.HashedCredentialsMatcher; | |||||
import org.apache.shiro.authz.AuthorizationInfo; | |||||
import org.apache.shiro.authz.SimpleAuthorizationInfo; | |||||
import org.apache.shiro.realm.AuthorizingRealm; | |||||
import org.apache.shiro.subject.PrincipalCollection; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import java.util.List; | |||||
import java.util.Set; | |||||
/** | |||||
* shiro 身份校验 | |||||
* | |||||
* @package: com.xkcoding.springbootdemorabcshiromybatis.shiro | |||||
* @description: shiro 身份校验 | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/11/29 下午3:39 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
@Slf4j | |||||
public class MyShiroRealm extends AuthorizingRealm { | |||||
@Autowired | |||||
private MybatisShiroUserMapper mybatisShiroUserMapper; | |||||
/** | |||||
* 身份认证: Authentication 用来验证用户信息 | |||||
* | |||||
* @param authenticationToken | |||||
* @return | |||||
* @throws AuthenticationException | |||||
*/ | |||||
@Override | |||||
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { | |||||
log.info("【身份认证】:进入doGetAuthenticationInfo()"); | |||||
Shiro shiroFactory = ShiroFactroy.me(); | |||||
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; | |||||
MybatisShiroUser user = shiroFactory.user(token.getUsername()); | |||||
ShiroUser shiroUser = shiroFactory.shiroUser(user); | |||||
SimpleAuthenticationInfo info = shiroFactory.info(shiroUser, user, super.getName()); | |||||
return info; | |||||
} | |||||
/** | |||||
* 授权验证 | |||||
* | |||||
* @param principalCollection | |||||
* @return | |||||
*/ | |||||
@Override | |||||
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { | |||||
log.info("【授权验证】:进入doGetAuthorizationInfo()"); | |||||
Shiro shiroFactory = ShiroFactroy.me(); | |||||
ShiroUser shiroUser = (ShiroUser) principalCollection.getPrimaryPrincipal(); | |||||
List<Integer> roleList = shiroUser.getRoleList(); | |||||
Set<String> aclSet = Sets.newHashSet(); | |||||
Set<String> roleNameSet = Sets.newHashSet(shiroUser.getRoleNames()); | |||||
for (Integer roleId : roleList) { | |||||
List<String> acls = shiroFactory.findAclsByRoleId(roleId); | |||||
for (String acl : acls) { | |||||
if (StrUtil.isNotEmpty(acl)) { | |||||
aclSet.add(acl); | |||||
} | |||||
} | |||||
} | |||||
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); | |||||
info.addStringPermissions(aclSet); | |||||
info.addRoles(roleNameSet); | |||||
return info; | |||||
} | |||||
@Override | |||||
public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) { | |||||
HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher(); | |||||
md5CredentialsMatcher.setHashAlgorithmName(ShiroUtil.HASH_ALGORITHM_NAME); | |||||
md5CredentialsMatcher.setHashIterations(ShiroUtil.HASH_ITERATIONS); | |||||
super.setCredentialsMatcher(md5CredentialsMatcher); | |||||
} | |||||
} |
@@ -0,0 +1,34 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.shiro; | |||||
import lombok.Data; | |||||
import java.io.Serializable; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息 | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.springbootdemorabcshiromybatis.shiro | |||||
* @description: 自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息 | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/12/6 下午3:26 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
@Data | |||||
public class ShiroUser implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
private Integer id; | |||||
private String username; | |||||
private String realname; | |||||
private Integer deptId; | |||||
private String deptName; | |||||
private List<Integer> roleList; | |||||
private List<String> roleNames; | |||||
} |
@@ -0,0 +1,270 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.shiro; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.constrant.factory.Constant; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.constrant.factory.ConstantFactory; | |||||
import com.xkcoding.util.T; | |||||
import org.apache.shiro.SecurityUtils; | |||||
import org.apache.shiro.crypto.hash.Md5Hash; | |||||
import org.apache.shiro.crypto.hash.SimpleHash; | |||||
import org.apache.shiro.session.Session; | |||||
import org.apache.shiro.subject.Subject; | |||||
import org.apache.shiro.util.ByteSource; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* shiro 工具类 | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.springbootdemorabcshiromybatis.shiro | |||||
* @description: shiro 工具类 | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/12/1 下午6:02 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
public class ShiroUtil { | |||||
/** | |||||
* 加盐参数 | |||||
*/ | |||||
public final static String HASH_ALGORITHM_NAME = "MD5"; | |||||
/** | |||||
* 循环次数 | |||||
*/ | |||||
public final static int HASH_ITERATIONS = 1; | |||||
/** | |||||
* shiro密码加密工具类 | |||||
* | |||||
* @param credentials 密码 | |||||
* @param saltSource 密码盐 | |||||
* @return 加密后的字符串 | |||||
*/ | |||||
public static String md5(String credentials, String saltSource) { | |||||
ByteSource salt = new Md5Hash(saltSource); | |||||
return new SimpleHash(HASH_ALGORITHM_NAME, credentials, salt, HASH_ITERATIONS).toString(); | |||||
} | |||||
/** | |||||
* 获取随机盐值 | |||||
* | |||||
* @return 获取随机盐值 | |||||
*/ | |||||
public static String getRandomSalt() { | |||||
return T.UUID(); | |||||
} | |||||
/** | |||||
* 获取当前 Subject | |||||
* | |||||
* @return Subject | |||||
*/ | |||||
public static Subject getSubject() { | |||||
return SecurityUtils.getSubject(); | |||||
} | |||||
/** | |||||
* 获取封装的 ShiroUser | |||||
* | |||||
* @return ShiroUser | |||||
*/ | |||||
public static ShiroUser getUser() { | |||||
if (isGuest()) { | |||||
return null; | |||||
} else { | |||||
return (ShiroUser) getSubject().getPrincipals().getPrimaryPrincipal(); | |||||
} | |||||
} | |||||
/** | |||||
* 从shiro获取session | |||||
*/ | |||||
public static Session getSession() { | |||||
return getSubject().getSession(); | |||||
} | |||||
/** | |||||
* 获取shiro指定的sessionKey | |||||
*/ | |||||
@SuppressWarnings("unchecked") | |||||
public static <T> T getSessionAttr(String key) { | |||||
Session session = getSession(); | |||||
return session != null ? (T) session.getAttribute(key) : null; | |||||
} | |||||
/** | |||||
* 设置shiro指定的sessionKey | |||||
*/ | |||||
public static void setSessionAttr(String key, Object value) { | |||||
Session session = getSession(); | |||||
session.setAttribute(key, value); | |||||
} | |||||
/** | |||||
* 移除shiro指定的sessionKey | |||||
*/ | |||||
public static void removeSessionAttr(String key) { | |||||
Session session = getSession(); | |||||
if (session != null) { | |||||
session.removeAttribute(key); | |||||
} | |||||
} | |||||
/** | |||||
* 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用 | |||||
* | |||||
* @param roleName 角色名 | |||||
* @return 属于该角色:true,否则false | |||||
*/ | |||||
public static boolean hasRole(String roleName) { | |||||
return getSubject() != null && roleName != null && roleName.length() > 0 && getSubject().hasRole(roleName); | |||||
} | |||||
/** | |||||
* 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。 | |||||
* | |||||
* @param roleName 角色名 | |||||
* @return 不属于该角色:true,否则false | |||||
*/ | |||||
public static boolean lacksRole(String roleName) { | |||||
return !hasRole(roleName); | |||||
} | |||||
/** | |||||
* 验证当前用户是否属于以下任意一个角色。 | |||||
* | |||||
* @param roleNames 角色列表 | |||||
* @return 属于:true,否则false | |||||
*/ | |||||
public static boolean hasAnyRoles(String roleNames) { | |||||
boolean hasAnyRole = false; | |||||
Subject subject = getSubject(); | |||||
if (subject != null && roleNames != null && roleNames.length() > 0) { | |||||
for (String role : roleNames.split(Constant.COMMA)) { | |||||
if (subject.hasRole(role.trim())) { | |||||
hasAnyRole = true; | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
return hasAnyRole; | |||||
} | |||||
/** | |||||
* 验证当前用户是否属于以下所有角色。 | |||||
* | |||||
* @param roleNames 角色列表 | |||||
* @return 属于:true,否则false | |||||
*/ | |||||
public static boolean hasAllRoles(String roleNames) { | |||||
boolean hasAllRole = true; | |||||
Subject subject = getSubject(); | |||||
if (subject != null && roleNames != null && roleNames.length() > 0) { | |||||
for (String role : roleNames.split(Constant.COMMA)) { | |||||
if (!subject.hasRole(role.trim())) { | |||||
hasAllRole = false; | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
return hasAllRole; | |||||
} | |||||
/** | |||||
* 验证当前用户是否拥有指定权限,使用时与lacksPermission 搭配使用 | |||||
* | |||||
* @param permission 权限名 | |||||
* @return 拥有权限:true,否则false | |||||
*/ | |||||
public static boolean hasPermission(String permission) { | |||||
return getSubject() != null && permission != null && permission.length() > 0 && getSubject().isPermitted(permission); | |||||
} | |||||
/** | |||||
* 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。 | |||||
* | |||||
* @param permission 权限名 | |||||
* @return 拥有权限:true,否则false | |||||
*/ | |||||
public static boolean lacksPermission(String permission) { | |||||
return !hasPermission(permission); | |||||
} | |||||
/** | |||||
* 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。与notAuthenticated搭配使用 | |||||
* | |||||
* @return 通过身份验证:true,否则false | |||||
*/ | |||||
public static boolean isAuthenticated() { | |||||
return getSubject() != null && getSubject().isAuthenticated(); | |||||
} | |||||
/** | |||||
* 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。。 | |||||
* | |||||
* @return 没有通过身份验证:true,否则false | |||||
*/ | |||||
public static boolean notAuthenticated() { | |||||
return !isAuthenticated(); | |||||
} | |||||
/** | |||||
* 认证通过或已记住的用户。与guset搭配使用。 | |||||
* | |||||
* @return 用户:true,否则 false | |||||
*/ | |||||
public static boolean isUser() { | |||||
return getSubject() != null && getSubject().getPrincipal() != null; | |||||
} | |||||
/** | |||||
* 验证当前用户是否为“访客”,即未认证(包含未记住)的用户。用user搭配使用 | |||||
* | |||||
* @return 访客:true,否则false | |||||
*/ | |||||
public static boolean isGuest() { | |||||
return !isUser(); | |||||
} | |||||
/** | |||||
* 输出当前用户信息,通常为登录帐号信息。 | |||||
* | |||||
* @return 当前用户信息 | |||||
*/ | |||||
public static String principal() { | |||||
if (getSubject() != null) { | |||||
Object principal = getSubject().getPrincipal(); | |||||
return principal.toString(); | |||||
} | |||||
return ""; | |||||
} | |||||
/** | |||||
* 获取当前用户的部门数据范围的集合 | |||||
*/ | |||||
public static List<Integer> getDeptDataScope() { | |||||
Integer deptId = getUser().getDeptId(); | |||||
List<Integer> subDeptIds = ConstantFactory.me().getSubDeptId(deptId); | |||||
subDeptIds.add(deptId); | |||||
return subDeptIds; | |||||
} | |||||
/** | |||||
* 判断当前用户是否是超级管理员 | |||||
*/ | |||||
public static boolean isAdmin() { | |||||
List<String> roleNameList = getUser().getRoleNames(); | |||||
for (String roleName : roleNameList) { | |||||
if (roleName.equals(Constant.ADMIN_NAME)) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
} | |||||
@@ -0,0 +1,66 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.shiro.factory; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroUser; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.shiro.ShiroUser; | |||||
import org.apache.shiro.authc.SimpleAuthenticationInfo; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 定义 shiro realm 所需数据的接口 | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.springbootdemorabcshiromybatis.shiro.factory | |||||
* @description: 定义 shiro realm 所需数据的接口 | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/12/6 下午3:24 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
public interface Shiro { | |||||
/** | |||||
* 根据用户名数据库存储的用户信息 | |||||
* | |||||
* @param username 用户名 | |||||
* @return 数据库存储的用户信息 | |||||
*/ | |||||
MybatisShiroUser user(String username); | |||||
/** | |||||
* 根据系统用户获取 shiro 的用户 | |||||
* | |||||
* @param user 数据库保存的用户 | |||||
* @return 自定义的用户对象 | |||||
*/ | |||||
ShiroUser shiroUser(MybatisShiroUser user); | |||||
/** | |||||
* 根据角色id获取权限列表 | |||||
* | |||||
* @param roleId 角色id | |||||
* @return 权限列表 | |||||
*/ | |||||
List<String> findAclsByRoleId(Integer roleId); | |||||
/** | |||||
* 根据角色id获取角色名称 | |||||
* | |||||
* @param roleId 角色id | |||||
* @return 角色名称 | |||||
*/ | |||||
String findRoleNameByRoleId(Integer roleId); | |||||
/** | |||||
* 获取 shiro 的认证信息 | |||||
* | |||||
* @param shiroUser 自定义返回的 user 对象 | |||||
* @param user 数据库保存的 user 对象 | |||||
* @param realmName 真实姓名 | |||||
* @return shiro的认证信息 | |||||
*/ | |||||
SimpleAuthenticationInfo info(ShiroUser shiroUser, MybatisShiroUser user, String realmName); | |||||
} |
@@ -0,0 +1,95 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.shiro.factory; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.constrant.factory.ConstantFactory; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroAclMapper; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroUserMapper; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.enums.UserStatusEnum; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroUser; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.shiro.ShiroUser; | |||||
import com.xkcoding.springbootdemorabcshiromybatis.util.SpringContextHolder; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.shiro.authc.CredentialsException; | |||||
import org.apache.shiro.authc.DisabledAccountException; | |||||
import org.apache.shiro.authc.SimpleAuthenticationInfo; | |||||
import org.apache.shiro.crypto.hash.Md5Hash; | |||||
import org.apache.shiro.util.ByteSource; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.context.annotation.DependsOn; | |||||
import org.springframework.stereotype.Service; | |||||
import java.util.List; | |||||
@Service | |||||
@DependsOn("springContextHolder") | |||||
@Slf4j | |||||
public class ShiroFactroy implements Shiro { | |||||
@Autowired | |||||
private MybatisShiroUserMapper userMapper; | |||||
@Autowired | |||||
private MybatisShiroAclMapper aclMapper; | |||||
public static Shiro me() { | |||||
return SpringContextHolder.getBean(Shiro.class); | |||||
} | |||||
@Override | |||||
public MybatisShiroUser user(String username) { | |||||
MybatisShiroUser user = userMapper.findByUsername(username); | |||||
// 账号不存在 | |||||
if (null == user) { | |||||
log.error("【登录失败】:账号不存在"); | |||||
throw new CredentialsException("账号不存在"); | |||||
} | |||||
// 账号被冻结 | |||||
if (user.getStatus().equals(UserStatusEnum.DISABLE.getCode())) { | |||||
log.error("【登录失败】:用户已被冻结"); | |||||
throw new DisabledAccountException("登录失败,用户已被冻结"); | |||||
} else if (user.getStatus().equals(UserStatusEnum.DELETED.getCode())) { | |||||
log.error("【登录失败】:没有该用户"); | |||||
throw new DisabledAccountException("登录失败,没有该用户"); | |||||
} | |||||
return user; | |||||
} | |||||
@Override | |||||
public ShiroUser shiroUser(MybatisShiroUser user) { | |||||
ShiroUser shiroUser = new ShiroUser(); | |||||
shiroUser.setId(user.getId()); | |||||
shiroUser.setUsername(user.getUsername()); | |||||
shiroUser.setDeptId(user.getDeptId()); | |||||
shiroUser.setDeptName(ConstantFactory.me().getDeptName(user.getDeptId())); | |||||
shiroUser.setRealname(user.getRealname()); | |||||
List<Integer> roleList = ConstantFactory.me().getRoleIds(user.getId()); | |||||
List<String> roleNameList = ConstantFactory.me().getRoleNames(roleList); | |||||
shiroUser.setRoleList(roleList); | |||||
shiroUser.setRoleNames(roleNameList); | |||||
return shiroUser; | |||||
} | |||||
@Override | |||||
public List<String> findAclsByRoleId(Integer roleId) { | |||||
return aclMapper.getResUrlsByRoleId(roleId); | |||||
} | |||||
@Override | |||||
public String findRoleNameByRoleId(Integer roleId) { | |||||
return ConstantFactory.me().getRoleName(roleId); | |||||
} | |||||
@Override | |||||
public SimpleAuthenticationInfo info(ShiroUser shiroUser, MybatisShiroUser user, String realmName) { | |||||
String credentials = user.getPassword(); | |||||
// 密码加盐处理 | |||||
String source = user.getSalt(); | |||||
ByteSource credentialsSalt = new Md5Hash(source); | |||||
return new SimpleAuthenticationInfo(shiroUser, credentials, credentialsSalt, realmName); | |||||
} | |||||
} |
@@ -0,0 +1,7 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.util; | |||||
import tk.mybatis.mapper.common.Mapper; | |||||
import tk.mybatis.mapper.common.MySqlMapper; | |||||
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> { | |||||
} |
@@ -0,0 +1,50 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis.util; | |||||
import org.springframework.beans.BeansException; | |||||
import org.springframework.context.ApplicationContext; | |||||
import org.springframework.context.ApplicationContextAware; | |||||
import org.springframework.stereotype.Component; | |||||
/** | |||||
* <p> | |||||
* Spring 的 ApplicationContext 的持有者,可以用静态方法的方式获取 spring 容器中的 bean | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.springbootdemorabcshiromybatis.util | |||||
* @description: Spring 的 ApplicationContext 的持有者,可以用静态方法的方式获取 spring 容器中的 bean | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/12/1 下午3:47 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
@Component | |||||
public class SpringContextHolder implements ApplicationContextAware { | |||||
private static ApplicationContext applicationContext; | |||||
@Override | |||||
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { | |||||
SpringContextHolder.applicationContext = applicationContext; | |||||
} | |||||
public static ApplicationContext getApplicationContext() { | |||||
assertApplicationContext(); | |||||
return applicationContext; | |||||
} | |||||
public static <T> T getBean(String beanName) { | |||||
assertApplicationContext(); | |||||
return (T) applicationContext.getBean(beanName); | |||||
} | |||||
public static <T> T getBean(Class<T> requiredType) { | |||||
assertApplicationContext(); | |||||
return applicationContext.getBean(requiredType); | |||||
} | |||||
private static void assertApplicationContext() { | |||||
if (SpringContextHolder.applicationContext == null) { | |||||
throw new RuntimeException("applicaitonContext属性为null,请检查是否注入了SpringContextHolder!"); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,70 @@ | |||||
server: | |||||
port: 8080 | |||||
context-path: /demo | |||||
spring: | |||||
jackson: | |||||
time-zone: GMT+8 | |||||
date-format: yyyy-MM-dd HH:mm:ss | |||||
datasource: | |||||
# 启动时自动运行的 SQL 文件 | |||||
schema: classpath:init-sql/shiro.sql | |||||
continue-on-error: true | |||||
druid: | |||||
url: jdbc:mysql://localhost:3306/spring-boot-demo?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false | |||||
username: root | |||||
password: root | |||||
driver-class-name: com.mysql.jdbc.Driver | |||||
# 连接池配置 | |||||
# 初始化大小,最小,最大 | |||||
initialSize: 5 | |||||
minIdle: 5 | |||||
maxActive: 20 | |||||
# 配置获取连接等待超时的时间 | |||||
maxWait: 60000 | |||||
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 | |||||
timeBetweenEvictionRunsMillis: 60000 | |||||
# 配置一个连接在池中最小生存的时间,单位是毫秒 | |||||
minEvictableIdleTimeMillis: 300000 | |||||
validationQuery: SELECT 1 FROM DUAL | |||||
testWhileIdle: true | |||||
testOnBorrow: false | |||||
testOnReturn: false | |||||
# 打开PSCache,并且指定每个连接上PSCache的大小 | |||||
poolPreparedStatements: true | |||||
maxPoolPreparedStatementPerConnectionSize: 20 | |||||
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 | |||||
filters: stat,wall,log4j | |||||
# 监控配置 | |||||
web-stat-filter: | |||||
enabled: true | |||||
url-pattern: /* | |||||
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" | |||||
stat-view-servlet: | |||||
enabled: true | |||||
url-pattern: /sys/druid/* | |||||
reset-enable: fasle | |||||
login-username: xkcoding | |||||
login-password: 123456 | |||||
filter: | |||||
stat: | |||||
log-slow-sql: true | |||||
slow-sql-millis: 5000 | |||||
merge-sql: true | |||||
# mybatis 配置 | |||||
mybatis: | |||||
type-aliases-package: com.xkcoding.springbootdemoormmybatistis.model | |||||
mapper-locations: classpath:mapper/*.xml | |||||
# 配置项:开启下划线到驼峰的自动转换. 作用:将数据库字段根据驼峰规则自动注入到对象属性 | |||||
configuration: | |||||
map-underscore-to-camel-case: true | |||||
# 通用 Mapper 配置 | |||||
mapper: | |||||
not-empty: false | |||||
identity: MYSQL | |||||
mappers: com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper | |||||
# PageHelper 配置 | |||||
pagehelper: | |||||
helper-dialect: mysql | |||||
reasonable: true | |||||
support-methods-arguments: true | |||||
params: count=countSql |
@@ -0,0 +1,8 @@ | |||||
# 数据库配置 | |||||
jdbc.driverClass=com.mysql.jdbc.Driver | |||||
jdbc.url=jdbc:mysql://localhost:3306/spring-boot-demo | |||||
jdbc.user=root | |||||
jdbc.password=root | |||||
# 通用Mapper配置 | |||||
mapper.plugin=tk.mybatis.mapper.generator.MapperPlugin | |||||
mapper.Mapper=com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper |
@@ -0,0 +1,34 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE generatorConfiguration | |||||
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" | |||||
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> | |||||
<generatorConfiguration> | |||||
<properties resource="generator/config.properties"/> | |||||
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"> | |||||
<property name="beginningDelimiter" value="`"/> | |||||
<property name="endingDelimiter" value="`"/> | |||||
<plugin type="${mapper.plugin}"> | |||||
<property name="mappers" value="${mapper.Mapper}"/> | |||||
</plugin> | |||||
<jdbcConnection driverClass="${jdbc.driverClass}" | |||||
connectionURL="${jdbc.url}" | |||||
userId="${jdbc.user}" | |||||
password="${jdbc.password}"> | |||||
</jdbcConnection> | |||||
<javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}"/> | |||||
<sqlMapGenerator targetPackage="${targetXMLPackage}" targetProject="${targetResourcesProject}"/> | |||||
<javaClientGenerator targetPackage="${targetMapperPackage}" targetProject="${targetJavaProject}" | |||||
type="XMLMAPPER"/> | |||||
<table tableName="mybatis_shiro_%"> | |||||
<generatedKey column="id" sqlStatement="Mysql" identity="true"/> | |||||
</table> | |||||
</context> | |||||
</generatorConfiguration> |
@@ -0,0 +1,141 @@ | |||||
-- 建表 -- | |||||
-- 部门表 -- | |||||
DROP TABLE IF EXISTS `mybatis_shiro_dept`; | |||||
CREATE TABLE `mybatis_shiro_dept` ( | |||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '部门id', | |||||
`name` varchar(20) NOT NULL DEFAULT '' COMMENT '部门名称', | |||||
`parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '上级部门id,顶层是0', | |||||
`level` varchar(255) NOT NULL DEFAULT '0' COMMENT '部门层级,默认为0,层级直接用逗号(半角)隔开', | |||||
`seq` int(11) NOT NULL DEFAULT '0' COMMENT '部门在当前层级下的顺序,由小到大', | |||||
`remark` varchar(200) DEFAULT '' COMMENT '备注', | |||||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||||
PRIMARY KEY (`id`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='部门表'; | |||||
INSERT INTO `mybatis_shiro_dept` VALUES (1, '总公司', 0, '0', 0, '总公司', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_dept` VALUES (2, '开发部', 1, '0,1', 0, '开发部', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_dept` VALUES (3, '运营部', 1, '0,1', 1, '运营部', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_dept` VALUES (4, '战略部', 1, '0,1', 2, '战略部', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_dept` VALUES (5, '软件部', 2, '0,1,2', 0, '软件部', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_dept` VALUES (6, '硬件部', 2, '0,1,2', 1, '硬件部', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
-- 用户表 -- | |||||
DROP TABLE IF EXISTS `mybatis_shiro_user`; | |||||
CREATE TABLE `mybatis_shiro_user` ( | |||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id', | |||||
`username` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名', | |||||
`password` varchar(40) NOT NULL DEFAULT '' COMMENT '加密后的密码', | |||||
`salt` varchar(32) NOT NULL DEFAULT '' COMMENT '密码加密的盐值', | |||||
`avatar` varchar(255) DEFAULT NULL COMMENT '头像', | |||||
`realname` varchar(20) NOT NULL DEFAULT '' COMMENT '真实姓名', | |||||
`telephone` varchar(13) NOT NULL DEFAULT '' COMMENT '手机号', | |||||
`mail` varchar(20) NOT NULL DEFAULT '' COMMENT '邮箱', | |||||
`dept_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户所在部门的id', | |||||
`status` int(11) NOT NULL DEFAULT '1' COMMENT '状态,-1:删除,0:冻结状态,1:正常', | |||||
`remark` varchar(200) DEFAULT '' COMMENT '备注', | |||||
`last_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次登录的时间', | |||||
`last_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次登录的ip地址', | |||||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||||
PRIMARY KEY (`id`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT ='用户表'; | |||||
INSERT INTO `mybatis_shiro_user` VALUES (1, 'xkcoding', '29b97b26be547c8442689bdbe6f1efb9', '77798aa08e914989bb588188cb2c0ad4', '','沈扬凯','18601224166','237497819@qq.com',5,1,'本尊','2017-12-01 00:00:00', '127.0.0.1', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_user` VALUES (2, 'test', '29b97b26be547c8442689bdbe6f1efb9', '77798aa08e914989bb588188cb2c0ad4', '','测试用户','18666666666','qaz@qq.com',6,1,'测试用户', '2017-12-01 00:00:00', '127.0.0.1','系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
-- 权限表 -- | |||||
DROP TABLE IF EXISTS `mybatis_shiro_acl`; | |||||
CREATE TABLE `mybatis_shiro_acl` ( | |||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '权限id', | |||||
`code` varchar(20) NOT NULL DEFAULT '' COMMENT '权限编号', | |||||
`name` varchar(20) NOT NULL DEFAULT '' COMMENT '权限名称', | |||||
`icon` varchar(255) DEFAULT NULL COMMENT '权限图标', | |||||
`parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '上级权限id', | |||||
`level` varchar(255) NOT NULL DEFAULT '' COMMENT '权限层级,默认为0,层级直接用逗号(半角)隔开', | |||||
`url` varchar(100) NOT NULL DEFAULT '' COMMENT '权限的url, 可以填正则表达式', | |||||
`type` int(11) NOT NULL DEFAULT '3' COMMENT '类型,1:菜单,2:按钮,3:其他', | |||||
`status` int(11) NOT NULL DEFAULT '1' COMMENT '状态,0:冻结,1:正常', | |||||
`seq` int(11) NOT NULL DEFAULT '0' COMMENT '权限在当前层级下的顺序,由小到大', | |||||
`remark` varchar(200) DEFAULT '' COMMENT '备注', | |||||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||||
PRIMARY KEY (`id`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT ='权限表'; | |||||
INSERT INTO `mybatis_shiro_acl` VALUES (1,'system_mgr','系统管理','',0,'0','/system_mgr/*',1,1,0,'系统管理', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_acl` VALUES (2,'user_mgr','用户管理','',1,'0,1','/system_mgr/user_mgr/*',1,1,0,'用户管理', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_acl` VALUES (3,'user_insert','新增用户','',2,'0,1,2','/user/add',2,1,0,'新增用户','系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_acl` VALUES (4,'user_delete','删除用户','',2,'0,1,2','/user/delete',2,1,1,'删除用户','系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_acl` VALUES (5,'user_update','修改用户','',2,'0,1,2','/user/update',2,1,2,'修改用户','系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_acl` VALUES (6,'user_select','查询用户','',2,'0,1,2','/user/select',2,1,3,'查询用户','系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
-- 角色表 -- | |||||
DROP TABLE IF EXISTS `mybatis_shiro_role`; | |||||
CREATE TABLE `mybatis_shiro_role` ( | |||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色id', | |||||
`name` varchar(20) NOT NULL COMMENT '角色名称', | |||||
`type` int(11) NOT NULL DEFAULT '1' COMMENT '角色的类型,1:管理员角色,2:其他', | |||||
`status` int(11) NOT NULL DEFAULT '1' COMMENT '状态,0:冻结,1:可用', | |||||
`remark` varchar(200) DEFAULT '' COMMENT '备注', | |||||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||||
PRIMARY KEY (`id`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT ='角色表'; | |||||
INSERT INTO `mybatis_shiro_role` VALUES (1,'超级管理员', 1, 1,'超级管理员' ,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_role` VALUES (2, '临时', 2, 1,'临时','系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
-- 角色-用户表 -- | |||||
DROP TABLE IF EXISTS `mybatis_shiro_role_user`; | |||||
CREATE TABLE `mybatis_shiro_role_user` ( | |||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色-用户id', | |||||
`role_id` int(11) NOT NULL COMMENT '角色id', | |||||
`user_id` int(11) NOT NULL COMMENT '用户id', | |||||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||||
PRIMARY KEY (`id`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8; | |||||
INSERT INTO `mybatis_shiro_role_user` VALUES (1, 1, 1,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_role_user` VALUES (2, 2, 2,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
-- 角色-权限表 -- | |||||
DROP TABLE IF EXISTS `mybatis_shiro_role_acl`; | |||||
CREATE TABLE `mybatis_shiro_role_acl` ( | |||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色-权限id', | |||||
`role_id` int(11) NOT NULL COMMENT '角色id', | |||||
`acl_id` int(11) NOT NULL COMMENT '权限id', | |||||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||||
PRIMARY KEY (`id`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8; | |||||
INSERT INTO `mybatis_shiro_role_acl` VALUES (1, 1, 1,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_role_acl` VALUES (2, 1, 2,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_role_acl` VALUES (3, 1, 3,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_role_acl` VALUES (4, 1, 4,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_role_acl` VALUES (5, 1, 5,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_role_acl` VALUES (6, 1, 6,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
INSERT INTO `mybatis_shiro_role_acl` VALUES (7, 2, 6,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||||
-- 日志记录表 -- | |||||
DROP TABLE IF EXISTS `mybatis_shiro_log`; | |||||
CREATE TABLE `mybatis_shiro_log` ( | |||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '日志记录id', | |||||
`type` int(11) NOT NULL DEFAULT '0' COMMENT '权限更新的类型,1:部门,2:用户,3:权限模块,4:权限,5:角色,6:角色用户关系,7:角色权限关系', | |||||
`target_id` int(11) NOT NULL COMMENT '基于type后指定的对象id,比如用户、权限、角色等表的主键', | |||||
`old_value` text COMMENT '旧值', | |||||
`new_value` text COMMENT '新值', | |||||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||||
`status` int(11) NOT NULL DEFAULT '0' COMMENT '当前是否复原过,0:没有复原过,1:复原过', | |||||
PRIMARY KEY (`id`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
@@ -0,0 +1,51 @@ | |||||
<?xml version="1.0" encoding="utf-8" ?> | |||||
<configuration> | |||||
<conversionRule conversionWord="clr" | |||||
converterClass="org.springframework.boot.logging.logback.ColorConverter"/> | |||||
<conversionRule conversionWord="wex" | |||||
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> | |||||
<conversionRule conversionWord="wEx" | |||||
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> | |||||
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender"> | |||||
<layout class="ch.qos.logback.classic.PatternLayout"> | |||||
<pattern>【xkcoding】%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx} | |||||
</pattern> | |||||
</layout> | |||||
</appender> | |||||
<appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||||
<!--滚动策略--> | |||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||||
<!--输出路径--> | |||||
<fileNamePattern>${user.dir}/logs/log/spring-boot-demo-rabc-shiro-mybatis.%d.log</fileNamePattern> | |||||
</rollingPolicy> | |||||
<encoder> | |||||
<pattern>【xkcoding】%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern> | |||||
</encoder> | |||||
</appender> | |||||
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||||
<filter class="ch.qos.logback.classic.filter.LevelFilter"> | |||||
<level>ERROR</level> | |||||
<onMatch>ACCEPT</onMatch> | |||||
<onMismatch>DENY</onMismatch> | |||||
</filter> | |||||
<!--滚动策略--> | |||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||||
<!--输出路径--> | |||||
<fileNamePattern>${user.dir}/logs/error/spring-boot-demo-rabc-shiro-mybatis.%d.error</fileNamePattern> | |||||
</rollingPolicy> | |||||
<encoder> | |||||
<pattern>【xkcoding】%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern> | |||||
</encoder> | |||||
</appender> | |||||
<logger name="com.xkcoding.springbootdemoormmybatis.mapper" level="TRACE"/> | |||||
<root level="info"> | |||||
<appender-ref ref="consoleLog"/> | |||||
<appender-ref ref="fileLog"/> | |||||
<appender-ref ref="fileErrorLog"/> | |||||
</root> | |||||
</configuration> |
@@ -0,0 +1,27 @@ | |||||
<?xml version="1.0" encoding="UTF-8" ?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroAclMapper"> | |||||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroAcl"> | |||||
<id column="id" property="id" jdbcType="INTEGER"/> | |||||
<result column="code" property="code" jdbcType="VARCHAR"/> | |||||
<result column="name" property="name" jdbcType="VARCHAR"/> | |||||
<result column="icon" property="icon" jdbcType="VARCHAR"/> | |||||
<result column="parent_id" property="parentId" jdbcType="INTEGER"/> | |||||
<result column="level" property="level" jdbcType="VARCHAR"/> | |||||
<result column="url" property="url" jdbcType="VARCHAR"/> | |||||
<result column="type" property="type" jdbcType="INTEGER"/> | |||||
<result column="status" property="status" jdbcType="INTEGER"/> | |||||
<result column="seq" property="seq" jdbcType="INTEGER"/> | |||||
<result column="remark" property="remark" jdbcType="VARCHAR"/> | |||||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||||
</resultMap> | |||||
<select id="getResUrlsByRoleId" resultType="string"> | |||||
select url from | |||||
mybatis_shiro_role_acl rel | |||||
inner join mybatis_shiro_acl acl on rel.acl_id = acl.id | |||||
where rel.role_id = #{roleId} | |||||
</select> | |||||
</mapper> |
@@ -0,0 +1,15 @@ | |||||
<?xml version="1.0" encoding="UTF-8" ?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroDeptMapper"> | |||||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroDept"> | |||||
<id column="id" property="id" jdbcType="INTEGER"/> | |||||
<result column="name" property="name" jdbcType="VARCHAR"/> | |||||
<result column="parent_id" property="parentId" jdbcType="INTEGER"/> | |||||
<result column="level" property="level" jdbcType="VARCHAR"/> | |||||
<result column="seq" property="seq" jdbcType="INTEGER"/> | |||||
<result column="remark" property="remark" jdbcType="VARCHAR"/> | |||||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||||
</resultMap> | |||||
</mapper> |
@@ -0,0 +1,15 @@ | |||||
<?xml version="1.0" encoding="UTF-8" ?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroLogMapper"> | |||||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroLog"> | |||||
<id column="id" property="id" jdbcType="INTEGER"/> | |||||
<result column="type" property="type" jdbcType="INTEGER"/> | |||||
<result column="target_id" property="targetId" jdbcType="INTEGER"/> | |||||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||||
<result column="status" property="status" jdbcType="INTEGER"/> | |||||
<result column="old_value" property="oldValue" jdbcType="LONGVARCHAR"/> | |||||
<result column="new_value" property="newValue" jdbcType="LONGVARCHAR"/> | |||||
</resultMap> | |||||
</mapper> |
@@ -0,0 +1,12 @@ | |||||
<?xml version="1.0" encoding="UTF-8" ?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroRoleAclMapper"> | |||||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroRoleAcl"> | |||||
<id column="id" property="id" jdbcType="INTEGER"/> | |||||
<result column="role_id" property="roleId" jdbcType="INTEGER"/> | |||||
<result column="acl_id" property="aclId" jdbcType="INTEGER"/> | |||||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||||
</resultMap> | |||||
</mapper> |
@@ -0,0 +1,14 @@ | |||||
<?xml version="1.0" encoding="UTF-8" ?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroRoleMapper"> | |||||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroRole"> | |||||
<id column="id" property="id" jdbcType="INTEGER"/> | |||||
<result column="name" property="name" jdbcType="VARCHAR"/> | |||||
<result column="type" property="type" jdbcType="INTEGER"/> | |||||
<result column="status" property="status" jdbcType="INTEGER"/> | |||||
<result column="remark" property="remark" jdbcType="VARCHAR"/> | |||||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||||
</resultMap> | |||||
</mapper> |
@@ -0,0 +1,12 @@ | |||||
<?xml version="1.0" encoding="UTF-8" ?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroRoleUserMapper"> | |||||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroRoleUser"> | |||||
<id column="id" property="id" jdbcType="INTEGER"/> | |||||
<result column="role_id" property="roleId" jdbcType="INTEGER"/> | |||||
<result column="user_id" property="userId" jdbcType="INTEGER"/> | |||||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||||
</resultMap> | |||||
</mapper> |
@@ -0,0 +1,28 @@ | |||||
<?xml version="1.0" encoding="UTF-8" ?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroUserMapper"> | |||||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroUser"> | |||||
<id column="id" property="id" jdbcType="INTEGER"/> | |||||
<result column="username" property="username" jdbcType="VARCHAR"/> | |||||
<result column="password" property="password" jdbcType="VARCHAR"/> | |||||
<result column="salt" property="salt" jdbcType="VARCHAR"/> | |||||
<result column="avatar" property="avatar" jdbcType="VARCHAR"/> | |||||
<result column="realname" property="realname" jdbcType="VARCHAR"/> | |||||
<result column="telephone" property="telephone" jdbcType="VARCHAR"/> | |||||
<result column="mail" property="mail" jdbcType="VARCHAR"/> | |||||
<result column="dept_id" property="deptId" jdbcType="INTEGER"/> | |||||
<result column="status" property="status" jdbcType="INTEGER"/> | |||||
<result column="remark" property="remark" jdbcType="VARCHAR"/> | |||||
<result column="last_time" property="lastTime" jdbcType="TIMESTAMP"/> | |||||
<result column="last_ip" property="lastIp" jdbcType="VARCHAR"/> | |||||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||||
</resultMap> | |||||
<select id="findByUsername" resultMap="BaseResultMap"> | |||||
SELECT * | |||||
FROM mybatis_shiro_user | |||||
WHERE username = #{username} | |||||
</select> | |||||
</mapper> |
@@ -0,0 +1,16 @@ | |||||
package com.xkcoding.springbootdemorabcshiromybatis; | |||||
import org.junit.Test; | |||||
import org.junit.runner.RunWith; | |||||
import org.springframework.boot.test.context.SpringBootTest; | |||||
import org.springframework.test.context.junit4.SpringRunner; | |||||
@RunWith(SpringRunner.class) | |||||
@SpringBootTest | |||||
public class SpringBootDemoRabcShiroMybatisApplicationTests { | |||||
@Test | |||||
public void contextLoads() { | |||||
} | |||||
} |
@@ -0,0 +1,34 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project xmlns="http://maven.apache.org/POM/4.0.0" | |||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<groupId>com.xkcoding</groupId> | |||||
<artifactId>spring-boot-demo-util</artifactId> | |||||
<version>0.0.1-SNAPSHOT</version> | |||||
<packaging>jar</packaging> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>com.xiaoleilu</groupId> | |||||
<artifactId>hutool-all</artifactId> | |||||
<version>3.2.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.google.guava</groupId> | |||||
<artifactId>guava</artifactId> | |||||
<version>20.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.projectlombok</groupId> | |||||
<artifactId>lombok</artifactId> | |||||
<version>1.16.18</version> | |||||
</dependency> | |||||
</dependencies> | |||||
<build> | |||||
<finalName>spring-boot-demo-util</finalName> | |||||
</build> | |||||
</project> |
@@ -0,0 +1,127 @@ | |||||
package com.xkcoding.util; | |||||
import java.util.Random; | |||||
/** | |||||
* <p> | |||||
* 得到中文首字母 | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.util | |||||
* @description: 得到中文首字母 | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/12/1 下午3:52 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
public class PingyinUtil { | |||||
public static void main(String[] args) { | |||||
String str = "我是一串中文"; | |||||
System.out.println("我是一串中文:" + getPYIndexStr(str, true)); | |||||
} | |||||
/** | |||||
* 返回首字母 | |||||
* | |||||
* @param strChinese 中文字符串 | |||||
* @param bUpCase 是否为大写 | |||||
* @return 中文字符串的首字母 | |||||
*/ | |||||
public static String getPYIndexStr(String strChinese, boolean bUpCase) { | |||||
try { | |||||
StringBuffer buffer = new StringBuffer(); | |||||
// 把中文转化成byte数组 | |||||
byte b[] = strChinese.getBytes("GBK"); | |||||
for (int i = 0; i < b.length; i++) { | |||||
if ((b[i] & 255) > 128) { | |||||
int char1 = b[i++] & 255; | |||||
// 左移运算符用“<<”表示,是将运算符左边的对象,向左移动运算符右边指定的位数,并且在低位补零。其实,向左移n位,就相当于乘上2的n次方 | |||||
char1 <<= 8; | |||||
int chart = char1 + (b[i] & 255); | |||||
buffer.append(getPYIndexChar((char) chart, bUpCase)); | |||||
continue; | |||||
} | |||||
char c = (char) b[i]; | |||||
// 确定指定字符是否可以是 Java | |||||
if (!Character.isJavaIdentifierPart(c)) { | |||||
// 标识符中首字符以外的部分。 | |||||
c = 'A'; | |||||
} | |||||
buffer.append(c); | |||||
} | |||||
return buffer.toString(); | |||||
} catch (Exception e) { | |||||
System.out.println((new StringBuilder()).append("\u53D6\u4E2D\u6587\u62FC\u97F3\u6709\u9519").append(e.getMessage()).toString()); | |||||
} | |||||
return null; | |||||
} | |||||
/** | |||||
* 得到首字母 | |||||
* | |||||
* @param strChinese 中文字符 | |||||
* @param bUpCase 是否大写 | |||||
* @return 中文字符的首字母 | |||||
*/ | |||||
private static char getPYIndexChar(char strChinese, boolean bUpCase) { | |||||
int charGBK = strChinese; | |||||
char result; | |||||
if (charGBK >= 45217 && charGBK <= 45252) { | |||||
result = 'A'; | |||||
} else if (charGBK >= 45253 && charGBK <= 45760) { | |||||
result = 'B'; | |||||
} else if (charGBK >= 45761 && charGBK <= 46317) { | |||||
result = 'C'; | |||||
} else if (charGBK >= 46318 && charGBK <= 46825) { | |||||
result = 'D'; | |||||
} else if (charGBK >= 46826 && charGBK <= 47009) { | |||||
result = 'E'; | |||||
} else if (charGBK >= 47010 && charGBK <= 47296) { | |||||
result = 'F'; | |||||
} else if (charGBK >= 47297 && charGBK <= 47613) { | |||||
result = 'G'; | |||||
} else if (charGBK >= 47614 && charGBK <= 48118) { | |||||
result = 'H'; | |||||
} else if (charGBK >= 48119 && charGBK <= 49061) { | |||||
result = 'J'; | |||||
} else if (charGBK >= 49062 && charGBK <= 49323) { | |||||
result = 'K'; | |||||
} else if (charGBK >= 49324 && charGBK <= 49895) { | |||||
result = 'L'; | |||||
} else if (charGBK >= 49896 && charGBK <= 50370) { | |||||
result = 'M'; | |||||
} else if (charGBK >= 50371 && charGBK <= 50613) { | |||||
result = 'N'; | |||||
} else if (charGBK >= 50614 && charGBK <= 50621) { | |||||
result = 'O'; | |||||
} else if (charGBK >= 50622 && charGBK <= 50905) { | |||||
result = 'P'; | |||||
} else if (charGBK >= 50906 && charGBK <= 51386) { | |||||
result = 'Q'; | |||||
} else if (charGBK >= 51387 && charGBK <= 51445) { | |||||
result = 'R'; | |||||
} else if (charGBK >= 51446 && charGBK <= 52217) { | |||||
result = 'S'; | |||||
} else if (charGBK >= 52218 && charGBK <= 52697) { | |||||
result = 'T'; | |||||
} else if (charGBK >= 52698 && charGBK <= 52979) { | |||||
result = 'W'; | |||||
} else if (charGBK >= 52980 && charGBK <= 53688) { | |||||
result = 'X'; | |||||
} else if (charGBK >= 53689 && charGBK <= 54480) { | |||||
result = 'Y'; | |||||
} else if (charGBK >= 54481 && charGBK <= 55289) { | |||||
result = 'Z'; | |||||
} else { | |||||
result = (char) (65 + (new Random()).nextInt(25)); | |||||
} | |||||
if (!bUpCase) { | |||||
result = Character.toLowerCase(result); | |||||
} | |||||
return result; | |||||
} | |||||
} |
@@ -0,0 +1,63 @@ | |||||
package com.xkcoding.util; | |||||
import com.google.common.collect.Maps; | |||||
import com.sun.istack.internal.NotNull; | |||||
import com.xiaoleilu.hutool.http.HttpUtil; | |||||
import com.xiaoleilu.hutool.json.JSONObject; | |||||
import com.xiaoleilu.hutool.json.JSONUtil; | |||||
import com.xiaoleilu.hutool.util.RandomUtil; | |||||
import com.xiaoleilu.hutool.util.StrUtil; | |||||
import com.xkcoding.util.domain.ShortUrlRet; | |||||
import java.util.Map; | |||||
/** | |||||
* <p> | |||||
* 高频工具类 | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.util | |||||
* @description: 高频工具类 | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/12/1 下午4:24 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
public class T { | |||||
private static final String URL_SEPARATOR = "//"; | |||||
private static final String URL_PROTOCOL = "http"; | |||||
/** | |||||
* 获取 UUID | |||||
* | |||||
* @return 返回没有“-”的 UUID | |||||
*/ | |||||
public static String UUID() { | |||||
return RandomUtil.randomUUID().replace("-", ""); | |||||
} | |||||
/** | |||||
* 长地址转短地址 | |||||
* | |||||
* @param longUrl 长地址 | |||||
* @return 长地址转化后的短地址 | |||||
*/ | |||||
public static String shortURL(@NotNull String longUrl) { | |||||
Map<String, Object> params = Maps.newHashMap(); | |||||
if (StrUtil.isEmpty(longUrl)) { | |||||
return null; | |||||
} | |||||
if (!longUrl.contains(URL_SEPARATOR)) { | |||||
longUrl = URL_PROTOCOL + ":" + URL_SEPARATOR + longUrl; | |||||
} | |||||
params.put("url", longUrl); | |||||
params.put("email", "ws@parg.co"); | |||||
params.put("api_key", "4786a32f20f79a70b1ced1bf242a120e"); | |||||
String data = HttpUtil.post("https://parg.co/api/shorten", params); | |||||
JSONObject ret = JSONUtil.parseObj(data); | |||||
ShortUrlRet shortUrlRet = ret.toBean(ShortUrlRet.class); | |||||
return shortUrlRet.getShort_url(); | |||||
} | |||||
} |
@@ -0,0 +1,24 @@ | |||||
package com.xkcoding.util.domain; | |||||
import lombok.Data; | |||||
/** | |||||
* <p> | |||||
* 短地址请求返回类型 | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.util.domain | |||||
* @description: 短地址请求返回类型 | |||||
* @author: yangkai.shen | |||||
* @date: Created in 2017/12/4 上午11:29 | |||||
* @copyright: Copyright (c) 2017 | |||||
* @version: 0.0.1 | |||||
* @modified: yangkai.shen | |||||
*/ | |||||
@Data | |||||
public class ShortUrlRet { | |||||
private String short_url; | |||||
private String long_encoded; | |||||
private String long_decoded; | |||||
private String status; | |||||
} |