本次创建项目分成下面几个步骤介绍
(1)创建springboot项目;
(2)整合mybatis,搭建数据访问层框架
(3)整合shiro搭建权限验证框架;
(4)自动生成代码;
(5)整合logger搭建日志框架
上一篇我们介绍了如何整和mybatis,搭建数据访问层框架,这一篇我们介绍如何整合shiro,整合权限验证框架。
准备工作:
第一步:pom文件添加依赖,如下添加shiro的依赖包和junit的依赖包,junit的依赖包让我们方便测试;
<!-- shiro start -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- shiro end -->
<!--添加junit环境的jar包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
第二步:数据库中创建相关表,下面贴出的sql脚本可直接复制到数据库中执行;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`uid` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '主键',
`username` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户名',
`password` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '密码',
`password_salt` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '盐值',
`user_identify` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '标识',
`realname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '真实姓名',
`user_status` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '状态',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
SET FOREIGN_KEY_CHECKS = 1;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_permision
-- ----------------------------
DROP TABLE IF EXISTS `sys_permision`;
CREATE TABLE `sys_permision` (
`uid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`permision_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '权限名称',
`permision_parent_uid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '上层权限uid',
`permision_type` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '权限类型',
`permision_sort` int(10) DEFAULT NULL COMMENT '排序',
`permision_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '权限url',
`permision_related_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '关联权限路径',
`permision_desc` text COLLATE utf8_unicode_ci COMMENT '描述',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
`uid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`role_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色名称',
`role_desc` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色描述',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Table structure for sys_role_permision
-- ----------------------------
DROP TABLE IF EXISTS `sys_role_permision`;
CREATE TABLE `sys_role_permision` (
`uid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`role_uid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色uid',
`permision_uid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '权限uid',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Table structure for sys_user_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_user_role`;
CREATE TABLE `sys_user_role` (
`uid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`user_uid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`role_uid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
SET FOREIGN_KEY_CHECKS = 1;
二、下面我们将配置shiro的相关属性:
第一步:新建ajax返回值的结果类AjaxResult.java;
package com.itwopqq.springboot.config;
import java.io.Serializable;
/**
* @author fanzhen
* @desx
* @date 2020-04-03
*/
public class AjaxResult implements Serializable {
/***
* @desc success or error 返回结果状态值
*/
private String status;
/***
* @desc 返回结果提示信息
*/
private String msg;
/***
* @desc 结果数据
*/
private Object data;
/***
* @desc 成功返回的数据
*/
public static AjaxResult success(String msg, Object data){
AjaxResult result = new AjaxResult();
result.setStatus("success");
result.setMsg(msg);
result.setData(data);
return result;
}
/***
* @desc 失败返回的数据
*/
public static AjaxResult error(String msg){
AjaxResult result = new AjaxResult();
result.setStatus("error");
result.setMsg(msg);
return result;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
@Override
public String toString() {
return "AjaxResult{" +
"status='" + status + '\'' +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
第二步:新建shiro的验证过滤器,我们新建了perms的过滤器PermissionsAuthorizationExtendFilter.java,新建的过滤器需要继承PermissionsAuthorizationFilter.java类,重写PermissionsAuthorizationFilter.java的isAccessAllowed()方法和onAccessDenied()方法,其中isAccessAllowed()方法判断是否拦截,而onAccessDenied()方法表示当isAccessAllowed()返回false后(拦截)后,我们做的处理;
package com.itwopqq.springboot.config;
import com.itwopqq.springboot.system.util.WebUtils;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;
import org.thymeleaf.util.StringUtils;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author fanzhen
* @desx perm权限过滤器
* @date 2020-04-01
*/
public class PermissionsAuthorizationExtendFilter extends PermissionsAuthorizationFilter {
/***
* @desc //判断是否拦截,false为拦截,true为允许
* @author fanzhen
* @date 2020-04-01 16:21
* @param request, response, mappedValue
* @return boolean
*/
@Override
public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
return super.isAccessAllowed(request, response, mappedValue);
}
/***
* @desc //上面的方法返回false后(被拦截),会进入这个方法;这个方法返回false表示处理完毕(不放行);返回true表示需要继续处理(放行)
* @author fanzhen
* @date 2020-04-01 16:21
* @param request, response, mappedValue
* @return boolean
*/
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
String requestURI = httpServletRequest.getRequestURI();
System.out.println("Access Forbidden URI:"+ requestURI);
Subject subject = this.getSubject(httpServletRequest, httpServletResponse);
AjaxResult result;
if(subject.getPrincipal() == null){
if(WebUtils.isAjax(httpServletRequest)){
//执行ajax请求返回的错误返回值
result = AjaxResult.error("您尚未登录或登录时间过长,请重新登录!");
WebUtils.writeJson(httpServletResponse, result.toString(), 401);
return false;
}else {
this.saveRequestAndRedirectToLogin(httpServletRequest ,httpServletResponse);
}
}else if(WebUtils.isAjax(httpServletRequest)){
//执行ajax请求返回的错误返回值
result = AjaxResult.error("您没有足够的权限执行该操作!");
WebUtils.writeJson(httpServletResponse, result.toString(), 401);
return false;
}else{
String unauthorizedUrl = this.getUnauthorizedUrl();
if(!StringUtils.isEmpty(unauthorizedUrl)){
org.apache.shiro.web.util.WebUtils.issueRedirect(httpServletRequest, httpServletResponse, unauthorizedUrl);
}else{
org.apache.shiro.web.util.WebUtils.toHttp(response).sendError(401);
}
}
return false;
}
}
第三步:自定义realm文件,realm文件需要继承父类AuthorizingRealm.java,并重写其父类的两个方法,doGetAuthorizationInfo()和doGetAuthenticationInfo(),doGetAuthorizationInfo()方法功能为授权,doGetAuthenticationInfo()方法功能为认证,我们需要按照我们的逻辑重写我们的授权和认证功能;
package com.itwopqq.springboot.config;
import com.itwopqq.springboot.system.dto.SysRoleDto;
import com.itwopqq.springboot.system.dto.SysUserDto;
import com.itwopqq.springboot.system.model.SysPermision;
import com.itwopqq.springboot.system.service.ILoginService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @desc 自定义realm
* @author fanzhen
* @desx
* @date 2020-03-29
*/
public class BootingRealm extends AuthorizingRealm {
/***
* 正常流程:先认证,在授权
*/
@Autowired
private ILoginService loginService;
/****
* 授权
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String)principals.getPrimaryPrincipal();
SysUserDto sysUserDto = loginService.selectByUsername(username);
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
Set<String> perms = new HashSet<>();
List<SysRoleDto> roles = sysUserDto.getRoles();
for(SysRoleDto sysRoleDto: roles){
simpleAuthorizationInfo.addRole(sysRoleDto.getRoleName());
List<SysPermision> sysPermisions = sysRoleDto.getPerms();
for(SysPermision sysPermision: sysPermisions){
perms.add(sysPermision.getPermisionUrl());
}
}
simpleAuthorizationInfo.setStringPermissions(perms);
return simpleAuthorizationInfo;
}
/****
* 认证
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
if(token.getPrincipal() == null){
return null;
}
String username = token.getPrincipal().toString();
SysUserDto sysUser = loginService.selectByUsername(username);
if(sysUser == null){
return null;
}
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(sysUser.getUsername(), sysUser.getPassword(), sysUser.getRealname());
simpleAuthenticationInfo.setCredentialsSalt(ByteSource.Util.bytes(sysUser.getPasswordSalt()));
return simpleAuthenticationInfo;
}
}
第四步:新建ShiroConfig.java类,ShiroConfig是我们的shiro配置类,会配置我们的认证realm和拦截路径已经加密方法、session管理等属性,下面贴出代码一一介绍:
package com.itwopqq.springboot.config;
import com.itwopqq.springboot.system.model.SysPermision;
import com.itwopqq.springboot.system.service.ISysPermisionService;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.thymeleaf.util.StringUtils;
import javax.servlet.Filter;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
@Configuration
public class ShiroConfig {
private static final String DEFAULT_PREMISSION_STRING = "perms[{0}]";
/***
* 自定义realm:重写了验证和授权方法
*/
@Bean("bootingRealm")
public BootingRealm myShiroRealm(){
BootingRealm bootingRealm = new BootingRealm();
bootingRealm.setCredentialsMatcher(hashedCredentialsMatcher());
return bootingRealm;
}
/***
* 凭证匹配器
* setHashIterations(2);//hash的次数 比如这里的2就代表这 md5(md5(""))
*/
@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher(){
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
hashedCredentialsMatcher.setHashIterations(2);
hashedCredentialsMatcher.setHashAlgorithmName("md5");
return hashedCredentialsMatcher;
}
/***
* @desc shiro生命周期处理器
* @author fanzhen
* @date 2020-04-01 14:39
* @param
* @return org.apache.shiro.spring.LifecycleBeanPostProcessor
*/
@Bean("lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor getlifecycleBeanPostProcessor(){
return new LifecycleBeanPostProcessor();
}
/***
* 权限管理,配置realm的权限认证
*/
@Bean("securityManager")
public SecurityManager getSecurityManager(DefaultWebSessionManager sessionManager){
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
defaultWebSecurityManager.setRealm(myShiroRealm());
//设置session管理器
defaultWebSecurityManager.setSessionManager(sessionManager);
return defaultWebSecurityManager;
}
/***
* Filter工厂,设置对应的过滤条件和跳转条件
* 这里相当于springmvc里面web.xml的配置
*/
@Bean("shiroFilter")
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager, ISysPermisionService sysPermisionService){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
shiroFilterFactoryBean.setLoginUrl("/system/sysUser/login");
shiroFilterFactoryBean.setSuccessUrl("/system/sysUser/admin");
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
loadShiroFilterChain(shiroFilterFactoryBean, sysPermisionService);
/**设置自定义拦截器,当访问某些自定义url时,使用这个filter进行验证**/
/**如果map里面key值为authc,表示所有名为authc的过滤条件使用这个自定义的filter
map里面key值为perms,表示所有名为perms的过滤条件使用这个自定义的filter,具体见下方**/
Map<String, Filter> filter = new HashMap<>();
filter.put("perms", new PermissionsAuthorizationExtendFilter());
shiroFilterFactoryBean.setFilters(filter);
return shiroFilterFactoryBean;
}
/***
* @desc 为某个实例的某个方法的返回值注入为bean的实例
* Spring静态注入
*/
@Bean
public MethodInvokingFactoryBean getMethodInvokingFactoryBean(DefaultWebSessionManager sessionManager) {
MethodInvokingFactoryBean methodInvokingFactoryBean=new MethodInvokingFactoryBean();
methodInvokingFactoryBean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager");
methodInvokingFactoryBean.setArguments(getSecurityManager(sessionManager));
return methodInvokingFactoryBean;
}
/***
* @desc 加载shiro权限控制规则(从数据库表中读取)
*/
public void loadShiroFilterChain(ShiroFilterFactoryBean shiroFilterFactoryBean,ISysPermisionService sysPermisionService) {
System.out.println("===========================================");
System.out.println(sysPermisionService);
System.out.println("===========================================");
List<SysPermision> sysPermisions = sysPermisionService.selectAll();
Map<String, String> map = new HashMap<>();
// map.put("/**", "anno");
for(SysPermision sysPermision: sysPermisions){
String url = sysPermision.getPermisionUrl();
String relatedUrl = sysPermision.getPermisionRelatedUrl();
if(!StringUtils.isEmpty(url)){
map.put(url, MessageFormat.format(DEFAULT_PREMISSION_STRING, url));
}
if(!StringUtils.isEmpty(relatedUrl)){
String[] relatedUrls = relatedUrl.split(";");
for(String relatedurl: relatedUrls){
map.put(relatedurl, MessageFormat.format(DEFAULT_PREMISSION_STRING, relatedurl));
}
}
}
System.out.println("======================load shiro filter chain start==========================");
Set<String> keys = map.keySet();
for(String key: keys){
System.out.println("================== url:" + key + "," + map.get(key));
}
System.out.println("======================load shiro filter chain end==========================");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
}
/***
* @desc 开启shiro aop直接支持 使用代理方式
*/
@Bean("authorizationAttributeSourceAdvisor")
public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(SecurityManager securityManager){
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
@Bean("defaultAdvisorAutoProxyCreator")
public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
return defaultAdvisorAutoProxyCreator;
}
/***
* @desc 会话ID生成器
*/
@Bean(name = "sessionIdGenerator")
public JavaUuidSessionIdGenerator javaUuidSessionIdGenerator(){
JavaUuidSessionIdGenerator uuid = new JavaUuidSessionIdGenerator();
return uuid;
}
@Bean(name = "sessionIdCookie")
public SimpleCookie getSessionIdCookie(){
SimpleCookie simpleCookie = new SimpleCookie("sid");
simpleCookie.setHttpOnly(true);
simpleCookie.setMaxAge(-1);
return simpleCookie;
}
/***
* @desc 会话DAO
*/
@Bean(name = "sessionDAO")
public EnterpriseCacheSessionDAO enterpriseCacheSessionDAO(){
EnterpriseCacheSessionDAO sessionDAO = new EnterpriseCacheSessionDAO();
sessionDAO.setSessionIdGenerator(javaUuidSessionIdGenerator());
sessionDAO.setActiveSessionsCacheName("shiro_session_cache");
return sessionDAO;
}
@Bean(name = "sessionValidationScheduler")
public ExecutorServiceSessionValidationScheduler executorServiceSessionValidationScheduler(){
ExecutorServiceSessionValidationScheduler scheduler = new ExecutorServiceSessionValidationScheduler();
scheduler.setInterval(3*60*1000);
return scheduler;
}
@Bean(name = "sessionManager")
public DefaultWebSessionManager sessionManager(EnterpriseCacheSessionDAO enterpriseCacheSessionDAO){
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setGlobalSessionTimeout(30*10*60*1000);
sessionManager.setDeleteInvalidSessions(true);
sessionManager.setSessionValidationSchedulerEnabled(true);
sessionManager.setSessionValidationScheduler(executorServiceSessionValidationScheduler());
sessionManager.setSessionDAO(enterpriseCacheSessionDAO);
sessionManager.setSessionIdCookieEnabled(true);
sessionManager.setSessionIdCookie(getSessionIdCookie());
return sessionManager;
}
}
第五步:编写代码查询数据库信息;
model包:
a)、SysUser.java
package com.itwopqq.springboot.system.model;
import java.io.Serializable;
import java.util.Date;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
public class SysUser implements Serializable {
private String uid;
/***
* 用户名
*/
private String username;
/***
* 密码
*/
private String password;
/***
* 盐值
*/
private String passwordSalt;
/***
* 标识位
*/
private String userIdentify;
/***
* 真实姓名
*/
private String realname;
/***
* 创建时间
*/
private Date createTime;
/***
* 用户状态
*/
private String userStatus;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPasswordSalt() {
return passwordSalt;
}
public void setPasswordSalt(String passwordSalt) {
this.passwordSalt = passwordSalt;
}
public String getUserIdentify() {
return userIdentify;
}
public void setUserIdentify(String userIdentify) {
this.userIdentify = userIdentify;
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getUserStatus() {
return userStatus;
}
public void setUserStatus(String userStatus) {
this.userStatus = userStatus;
}
}
b)、SysPermision.java
package com.itwopqq.springboot.system.model;
import java.io.Serializable;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
public class SysPermision implements Serializable {
private String uid;
/***
* 权限名称
*/
private String permisionName;
/***
* 上级权限名称
*/
private String permisionParentUid;
/***
* 权限类型
*/
private String permisionType;
/***
* 权限排序
*/
private Integer permisionSort;
/***
* 权限路径
*/
private String permisionUrl;
/***
* 权限关联路径
*/
private String permisionRelatedUrl;
/***
* 权限描述
*/
private String permisionDesc;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getPermisionName() {
return permisionName;
}
public void setPermisionName(String permisionName) {
this.permisionName = permisionName;
}
public String getPermisionParentUid() {
return permisionParentUid;
}
public void setPermisionParentUid(String permisionParentUid) {
this.permisionParentUid = permisionParentUid;
}
public String getPermisionType() {
return permisionType;
}
public void setPermisionType(String permisionType) {
this.permisionType = permisionType;
}
public Integer getPermisionSort() {
return permisionSort;
}
public void setPermisionSort(Integer permisionSort) {
this.permisionSort = permisionSort;
}
public String getPermisionUrl() {
return permisionUrl;
}
public void setPermisionUrl(String permisionUrl) {
this.permisionUrl = permisionUrl;
}
public String getPermisionRelatedUrl() {
return permisionRelatedUrl;
}
public void setPermisionRelatedUrl(String permisionRelatedUrl) {
this.permisionRelatedUrl = permisionRelatedUrl;
}
public String getPermisionDesc() {
return permisionDesc;
}
public void setPermisionDesc(String permisionDesc) {
this.permisionDesc = permisionDesc;
}
}
c)、SysRole.java
package com.itwopqq.springboot.system.model;
import java.io.Serializable;
import java.util.Date;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
public class SysRole implements Serializable {
/****
* 角色uid
*/
private String uid;
/****
* 角色名称
*/
private String roleName;
/****
* 角色描述
*/
private String roleDesc;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getRoleDesc() {
return roleDesc;
}
public void setRoleDesc(String roleDesc) {
this.roleDesc = roleDesc;
}
}
d)、SysPermision.java
package com.itwopqq.springboot.system.model;
import java.io.Serializable;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
public class SysPermision implements Serializable {
private String uid;
/***
* 权限名称
*/
private String permisionName;
/***
* 上级权限名称
*/
private String permisionParentUid;
/***
* 权限类型
*/
private String permisionType;
/***
* 权限排序
*/
private Integer permisionSort;
/***
* 权限路径
*/
private String permisionUrl;
/***
* 权限关联路径
*/
private String permisionRelatedUrl;
/***
* 权限描述
*/
private String permisionDesc;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getPermisionName() {
return permisionName;
}
public void setPermisionName(String permisionName) {
this.permisionName = permisionName;
}
public String getPermisionParentUid() {
return permisionParentUid;
}
public void setPermisionParentUid(String permisionParentUid) {
this.permisionParentUid = permisionParentUid;
}
public String getPermisionType() {
return permisionType;
}
public void setPermisionType(String permisionType) {
this.permisionType = permisionType;
}
public Integer getPermisionSort() {
return permisionSort;
}
public void setPermisionSort(Integer permisionSort) {
this.permisionSort = permisionSort;
}
public String getPermisionUrl() {
return permisionUrl;
}
public void setPermisionUrl(String permisionUrl) {
this.permisionUrl = permisionUrl;
}
public String getPermisionRelatedUrl() {
return permisionRelatedUrl;
}
public void setPermisionRelatedUrl(String permisionRelatedUrl) {
this.permisionRelatedUrl = permisionRelatedUrl;
}
public String getPermisionDesc() {
return permisionDesc;
}
public void setPermisionDesc(String permisionDesc) {
this.permisionDesc = permisionDesc;
}
}
e)、SysRolePermision.java
package com.itwopqq.springboot.system.model;
import java.io.Serializable;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
public class SysRolePermision implements Serializable {
private String uid;
/***
* 角色uid
*/
private String roleUid;
/***
* 权限uid
*/
private String permisionUid;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getRoleUid() {
return roleUid;
}
public void setRoleUid(String roleUid) {
this.roleUid = roleUid;
}
public String getPermisionUid() {
return permisionUid;
}
public void setPermisionUid(String permisionUid) {
this.permisionUid = permisionUid;
}
}
dto 包
f)、SysRoleDto.java
package com.itwopqq.springboot.system.dto;
import com.itwopqq.springboot.system.model.SysPermision;
import com.itwopqq.springboot.system.model.SysRole;
import java.util.List;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
public class SysRoleDto extends SysRole {
private List<SysPermision> perms;
public List<SysPermision> getPerms() {
return perms;
}
public void setPerms(List<SysPermision> perms) {
this.perms = perms;
}
}
g)、SysUserDto.java
package com.itwopqq.springboot.system.dto;
import com.itwopqq.springboot.system.model.SysUser;
import java.util.List;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
public class SysUserDto extends SysUser {
private List<SysRoleDto> roles;
public List<SysRoleDto> getRoles() {
return roles;
}
public void setRoles(List<SysRoleDto> roles) {
this.roles = roles;
}
}
mapper包
h)、SysUserMapper.java
package com.itwopqq.springboot.system.mapper;
import com.itwopqq.springboot.system.dto.SysUserDto;
import com.itwopqq.springboot.system.model.SysUser;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
@Repository
public interface SysUserMapper {
/***
* @desc 获取所有用户
* @author fanzhen
* @date 2020-03-29 16:04
* @return SysUser
*/
List<SysUser> selectAll();
SysUserDto selectByUsername(@Param(value = "username") String username);
int insertOneModel(SysUserDto sysUserDto);
}
i)、SysPermisionMapper.java
package com.itwopqq.springboot.system.mapper;
import com.itwopqq.springboot.system.model.SysPermision;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
@Repository
public interface SysPermisionMapper {
List<SysPermision> selectByRoleId(@Param(value = "roleId") String roleId);
List<SysPermision> selectAll();
int insertOneModel(SysPermision sysPermision);
}
j)、SysRoleMapper.java
package com.itwopqq.springboot.system.mapper;
import com.itwopqq.springboot.system.dto.SysRoleDto;
import com.itwopqq.springboot.system.model.SysRole;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
@Repository
public interface SysRoleMapper {
List<SysRoleDto> selectRolesByUserId(@Param(value = "userId") String userId);
int insertOneModel(SysRole sysRole);
}
k)、SysUserRoleMapper.java
package com.itwopqq.springboot.system.mapper;
import com.itwopqq.springboot.system.dto.SysUserDto;
import org.springframework.stereotype.Repository;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
@Repository
public interface SysUserRoleMapper {
int insertBatch(SysUserDto sysUserDto);
}
l)、SysRolePermisionMapper.java
package com.itwopqq.springboot.system.mapper;
import com.itwopqq.springboot.system.dto.SysRoleDto;
import org.springframework.stereotype.Repository;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
@Repository
public interface SysRolePermisionMapper {
int insertBatch(SysRoleDto sysRoleDto);
}
mapping包
m)、SysUserMapping.xml
<?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.itwopqq.springboot.system.mapper.SysUserMapper">
<resultMap id="BaseResultMap" type="com.itwopqq.springboot.system.model.SysUser">
<result column="uid" jdbcType="VARCHAR" property="uid" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="password_salt" jdbcType="VARCHAR" property="passwordSalt" />
<result column="user_identify" jdbcType="VARCHAR" property="userIdentify" />
<result column="realname" jdbcType="VARCHAR" property="realname" />
<result column="user_status" jdbcType="VARCHAR" property="userStatus" />
<result column="create_time" jdbcType="VARCHAR" property="createTime" />
</resultMap>
<resultMap id="DtoBaseResultMap" type="com.itwopqq.springboot.system.dto.SysUserDto" extends="BaseResultMap">
</resultMap>
<select id="selectAll" resultMap="BaseResultMap">
SELECT uid, username, password, password_salt, user_identify, realname, user_status, create_time
FROM sys_user
</select>
<select id="selectByUsername" parameterType="java.lang.String" resultMap="DtoBaseResultMap">
SELECT uid, username, password, password_salt, user_identify, realname, user_status, create_time
FROM sys_user
WHERE username = #{username}
LIMIT 1
</select>
<insert id="insertOneModel" parameterType="com.itwopqq.springboot.system.dto.SysUserDto">
INSERT INTO sys_user(uid, username, password, password_salt, user_identify, realname, user_status, create_time)
VALUES
(#{uid}, #{username}, #{password}, #{passwordSalt}, #{userIdentify}, #{realname}, #{userStatus}, #{createTime});
</insert>
</mapper>
n)、SysPermisionMapping.xml
<?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.itwopqq.springboot.system.mapper.SysPermisionMapper">
<resultMap id="BaseResultMap" type="com.itwopqq.springboot.system.model.SysPermision">
<result column="uid" jdbcType="VARCHAR" property="uid" />
<result column="permision_name" jdbcType="VARCHAR" property="permisionName" />
<result column="permision_parent_uid" jdbcType="VARCHAR" property="permisionParentUid" />
<result column="permision_type" jdbcType="VARCHAR" property="permisionType" />
<result column="permision_sort" jdbcType="INTEGER" property="permisionSort" />
<result column="permision_url" jdbcType="VARCHAR" property="permisionUrl" />
<result column="permision_related_url" jdbcType="VARCHAR" property="permisionRelatedUrl" />
<result column="permision_desc" jdbcType="VARCHAR" property="permisionDesc" />
</resultMap>
<select id="selectByRoleId" parameterType="java.lang.String" resultMap="BaseResultMap">
SELECT B.uid, B.permision_name, B.permision_parent_uid, B.permision_type, B.permision_sort, B.permision_url, B.permision_related_url, B.permision_desc
FROM sys_role_permision A LEFT JOIN sys_permision B
ON A.permision_uid = B.uid
WHERE A.role_uid = #{roleId}
</select>
<select id="selectAll" resultMap="BaseResultMap">
select uid, permision_name, permision_parent_uid, permision_type, permision_sort, permision_url, permision_related_url, permision_desc
FROM sys_permision
</select>
<insert id="insertOneModel" parameterType="com.itwopqq.springboot.system.model.SysPermision">
INSERT INTO sys_permision(uid, permision_name, permision_parent_uid, permision_type, permision_sort, permision_url, permision_related_url, permision_desc)
VALUES(#{uid}, #{permisionName}, #{permisionParentUid}, #{permisionType}, #{permisionSort}, #{permisionUrl}, #{permisionRelatedUrl}, #{permisionDesc})
</insert>
</mapper>
o)、SysRoleMapping.xml
<?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.itwopqq.springboot.system.mapper.SysRoleMapper">
<resultMap id="BaseResultMap" type="com.itwopqq.springboot.system.model.SysRole">
<result column="uid" jdbcType="VARCHAR" property="uid" />
<result column="role_name" jdbcType="VARCHAR" property="roleName" />
<result column="role_desc" jdbcType="VARCHAR" property="roleDesc" />
</resultMap>
<resultMap id="DtoBaseResultMap" type="com.itwopqq.springboot.system.dto.SysRoleDto" extends="BaseResultMap">
</resultMap>
<select id="selectRolesByUserId" parameterType="java.lang.String" resultMap="DtoBaseResultMap">
SELECT B.uid, B.role_name, B.role_desc FROM sys_user_role A LEFT JOIN sys_role B ON A.role_uid = B.uid
WHERE A.user_uid = #{userId}
</select>
<insert id="insertOneModel" parameterType="com.itwopqq.springboot.system.model.SysRole">
INSERT INTO sys_role(uid, role_name, role_desc)
VALUES (#{uid}, #{roleName}, #{roleDesc})
</insert>
</mapper>
p)、SysUserRoleMapping.xml
<?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.itwopqq.springboot.system.mapper.SysUserRoleMapper">
<resultMap id="BaseResultMap" type="com.itwopqq.springboot.system.model.SysUserRole">
<result column="uid" jdbcType="VARCHAR" property="uid" />
<result column="user_uid" jdbcType="VARCHAR" property="userUid" />
<result column="role_uid" jdbcType="VARCHAR" property="roleUid" />
</resultMap>
<insert id="insertBatch" parameterType="com.itwopqq.springboot.system.dto.SysUserDto">
INSERT INTO sys_user_role(uid, user_uid, role_uid) VALUES
<foreach collection="roles" item="item" separator=",">
(REPLACE(uuid(),'-',''), #{uid}, #{item.uid})
</foreach>
</insert>
</mapper>
q)、SysRolePermisionMapping.xml
<?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.itwopqq.springboot.system.mapper.SysUserRoleMapper">
<resultMap id="BaseResultMap" type="com.itwopqq.springboot.system.model.SysUserRole">
<result column="uid" jdbcType="VARCHAR" property="uid" />
<result column="user_uid" jdbcType="VARCHAR" property="userUid" />
<result column="role_uid" jdbcType="VARCHAR" property="roleUid" />
</resultMap>
<insert id="insertBatch" parameterType="com.itwopqq.springboot.system.dto.SysUserDto">
INSERT INTO sys_user_role(uid, user_uid, role_uid) VALUES
<foreach collection="roles" item="item" separator=",">
(REPLACE(uuid(),'-',''), #{uid}, #{item.uid})
</foreach>
</insert>
</mapper>
service包
r)、ILoginService.java
package com.itwopqq.springboot.system.service;
import com.itwopqq.springboot.system.dto.SysUserDto;
public interface ILoginService {
/***
* @desc 通过用户名称查询一条数据
* @author fanzhen
* @date 2020-03-29 21:46
* @return com.itwopqq.springboot.system.model.SysUser
*/
SysUserDto selectByUsername(String username);
}
s)、ISysPermisionService.java
package com.itwopqq.springboot.system.service;
import com.itwopqq.springboot.system.model.SysPermision;
import java.util.List;
public interface ISysPermisionService {
/***
* @desc 查询所有的有效的权限数据
* @author fanzhen
* @date 2020-03-30 20:33
* @return java.util.List<com.itwopqq.springboot.system.model.SysPermision>
*/
List<SysPermision> selectAll();
/***
* @desc 插入一条权限数据
* @author fanzhen
* @date 2020-03-30 20:33
* @return java.util.List<com.itwopqq.springboot.system.model.SysPermision>
*/
int insertOneModel(SysPermision sysPermision);
}
t)、ISysRolePermisionService.java
package com.itwopqq.springboot.system.service;
import com.itwopqq.springboot.system.dto.SysRoleDto;
public interface ISysRolePermisionService {
int insertBatch(SysRoleDto sysRoleDto);
}
u)、ISysRoleService.java
package com.itwopqq.springboot.system.service;
import com.itwopqq.springboot.system.model.SysRole;
public interface ISysRoleService {
int insertOneModel(SysRole sysRole);
}
v)、ISysUserRoleService.java
package com.itwopqq.springboot.system.service;
import com.itwopqq.springboot.system.dto.SysUserDto;
public interface ISysUserRoleService {
int insertBatch(SysUserDto sysUserDto);
}
w)、ISysUserService.java
package com.itwopqq.springboot.system.service;
import com.itwopqq.springboot.system.dto.SysUserDto;
import com.itwopqq.springboot.system.model.SysUser;
import java.util.List;
public interface ISysUserService {
List<SysUser> selectAll();
int insertOneModel(SysUserDto sysUserDto);
}
serviceimpl包
x)、LoginServiceimpl.java
package com.itwopqq.springboot.system.serviceimpl;
import com.itwopqq.springboot.system.dto.SysRoleDto;
import com.itwopqq.springboot.system.dto.SysUserDto;
import com.itwopqq.springboot.system.mapper.SysPermisionMapper;
import com.itwopqq.springboot.system.mapper.SysRoleMapper;
import com.itwopqq.springboot.system.mapper.SysUserMapper;
import com.itwopqq.springboot.system.model.SysPermision;
import com.itwopqq.springboot.system.model.SysUser;
import com.itwopqq.springboot.system.service.ILoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
@Service
public class LoginServiceimpl implements ILoginService {
@Autowired
SysUserMapper sysUserMapper;
@Autowired
SysRoleMapper sysRoleMapper;
@Autowired
SysPermisionMapper sysPermisionMapper;
@Override
public SysUserDto selectByUsername(String username) {
SysUserDto sysUserDto = sysUserMapper.selectByUsername(username);
if(sysUserDto == null){
return null;
}
List<SysRoleDto> sysRoleDtos = sysRoleMapper.selectRolesByUserId(sysUserDto.getUid());
for(SysRoleDto sysRoleDto:sysRoleDtos){
List<SysPermision> sysPermisions = sysPermisionMapper.selectByRoleId(sysRoleDto.getUid());
sysRoleDto.setPerms(sysPermisions);
}
sysUserDto.setRoles(sysRoleDtos);
return sysUserDto;
}
}
y)、SysPermisionServiceImpl.java
package com.itwopqq.springboot.system.serviceimpl;
import com.itwopqq.springboot.system.mapper.SysPermisionMapper;
import com.itwopqq.springboot.system.model.SysPermision;
import com.itwopqq.springboot.system.service.ISysPermisionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
@Service
public class SysPermisionServiceImpl implements ISysPermisionService {
@Autowired
SysPermisionMapper sysPermisionMapper;
@Override
public List<SysPermision> selectAll() {
return sysPermisionMapper.selectAll();
}
@Override
public int insertOneModel(SysPermision sysPermision) {
return sysPermisionMapper.insertOneModel(sysPermision);
}
}
z)、SysRolePermisionServiceImpl.java
package com.itwopqq.springboot.system.serviceimpl;
import com.itwopqq.springboot.system.dto.SysRoleDto;
import com.itwopqq.springboot.system.mapper.SysRolePermisionMapper;
import com.itwopqq.springboot.system.service.ISysRolePermisionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
@Service
public class SysRolePermisionServiceImpl implements ISysRolePermisionService {
@Autowired
SysRolePermisionMapper sysRolePermisionMapper;
@Override
public int insertBatch(SysRoleDto sysRoleDto) {
if(sysRoleDto == null || sysRoleDto.getPerms() == null ||sysRoleDto.getPerms().size()==0){
return 0;
}
return sysRolePermisionMapper.insertBatch(sysRoleDto);
}
}
aa)、SysRoleServiceImpl.java
package com.itwopqq.springboot.system.serviceimpl;
import com.itwopqq.springboot.system.mapper.SysRoleMapper;
import com.itwopqq.springboot.system.model.SysRole;
import com.itwopqq.springboot.system.service.ISysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
@Service
public class SysRoleServiceImpl implements ISysRoleService {
@Autowired
SysRoleMapper sysRoleMapper;
@Override
public int insertOneModel(SysRole sysRole) {
return sysRoleMapper.insertOneModel(sysRole);
}
}
bb)、SysUserRoleServiceImpl.java
package com.itwopqq.springboot.system.serviceimpl;
import com.itwopqq.springboot.system.dto.SysUserDto;
import com.itwopqq.springboot.system.mapper.SysUserRoleMapper;
import com.itwopqq.springboot.system.model.SysUserRole;
import com.itwopqq.springboot.system.service.ISysUserRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
@Service
public class SysUserRoleServiceImpl implements ISysUserRoleService {
@Autowired
SysUserRoleMapper sysUserRoleMapper;
@Override
public int insertBatch(SysUserDto sysUserDto){
return sysUserRoleMapper.insertBatch(sysUserDto);
}
}
cc)、SysUserServiceImpl.java
package com.itwopqq.springboot.system.serviceimpl;
import com.itwopqq.springboot.system.dto.SysUserDto;
import com.itwopqq.springboot.system.mapper.SysUserMapper;
import com.itwopqq.springboot.system.model.SysUser;
import com.itwopqq.springboot.system.service.ISysUserService;
import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
@Service
public class SysUserServiceImpl implements ISysUserService {
@Autowired
public SysUserMapper sysUserMapper;
@Override
public List<SysUser> selectAll() {
return sysUserMapper.selectAll();
}
@Override
public int insertOneModel(SysUserDto sysUserDto) {
String salt = new SecureRandomNumberGenerator().nextBytes().toHex();
sysUserDto.setPasswordSalt(salt);
SimpleHash simpleHash = new SimpleHash("md5", sysUserDto.getPassword(), salt, 2);
sysUserDto.setPassword(simpleHash.toHex());
return sysUserMapper.insertOneModel(sysUserDto);
}
}
controller包:
dd)、LoginController.java
package com.itwopqq.springboot.system.controller;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
/**
* @author fanzhen
* @desx
* @date 2020-03-31
*/
@RequestMapping("/system/sysUser")
@Controller
public class LoginController {
@GetMapping("/loginss")
@ResponseBody
public String login(String username, String password){
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
Subject subject = SecurityUtils.getSubject();
try {
subject.login(token);
}catch (Exception ex){
ex.printStackTrace();
}
return "success";
}
@GetMapping("/openstank")
@ResponseBody
public String openstank(){
System.out.println("1111");
System.out.println("2222");
return "success";
}
@GetMapping("/openstank2")
@ResponseBody
public String openstanks(){
System.out.println("1111");
System.out.println("2222");
return "success";
}
@RequestMapping("/login")
public ModelAndView login(){
ModelAndView mav = new ModelAndView("login");
return mav;
}
@RequestMapping("/admin")
public ModelAndView admin(){
ModelAndView mav = new ModelAndView("admin");
return mav;
}
}
ee)、SysUserController.java
package com.itwopqq.springboot.system.controller;
import com.itwopqq.springboot.system.model.SysUser;
import com.itwopqq.springboot.system.service.ISysUserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author fanzhen
* @desx
* @date 2020-03-29
*/
@RestController
@RequestMapping("/system/sysUser")
public class SysUserController {
@Autowired
public ISysUserService sysUserService;
@GetMapping("/selectAll")
public List<SysUser> selectAll(){
List<SysUser> sysUsers = sysUserService.selectAll();
return sysUsers;
}
}
PageController.java
package com.itwopqq.booting;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.HashMap;
import java.util.Map;
/**
* @author fanzhen
* @desx
* @date 2020-03-23
*/
@RequestMapping("/page")
@Controller
public class PageController {
@RequestMapping("/userinfo")
public ModelAndView userinfo(String name, String age) throws Exception{
Map<String, Object> user = new HashMap<>();
user.put("name", name);
user.put("age", age);
ModelAndView mav = new ModelAndView("userinfo");
mav.addObject("user", user);
return mav;
}
}
页面:
login.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>userinfo</title>
</head>
<body>
<p>用户名:<input type="text" name="username"></p>
<p>密码:<input type="text" name="password"></p>
</body>
</html>
userinfo.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:java="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>userinfo</title>
<input type="button" value="测试ajax请求" id="test_ajax" />
</head>
<body>
<b>用户名:<b th:text="${user.name}"></b></b>
<b>年龄:<b th:text="${user.age}"></b></b>
</body>
<script src="/js/jquery-1.12.3.min.js"></script>
<script>
$(function () {
$.ajax({
url: '/system/sysUser/openstank2',
success: function (json) {
console.log(json);
},
error: function (json) {
console.log(json);
console.log(json.responseText);
}
})
})
</script>
</html>
welcome.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>welcome</title>
</head>
<body>
<b>hello, world!</b>
</body>
</html>
上面代码列出完毕,整体的包结构图如下:
接下来我们来校验我们的shiro搭建的情况:
首先我们通过junit来插入相关测试数据:
插入4条权限数据:
‘/system/sysUser/openstank’;
‘/system/sysUser/openWatch’;
‘/system/sysUser/openstank2’;
‘/system/sysUser/openWatch2’;
插入两条角色数据:
‘管理员’;
‘查询员’;
插入两条用户数据:
‘admin’;
‘fanzhen’;
SpringbootApplicationTests.java
package com.itwopqq.booting;
import com.itwopqq.booting.system.dto.SysRoleDto;
import com.itwopqq.booting.system.dto.SysUserDto;
import com.itwopqq.booting.system.model.SysPermision;
import com.itwopqq.booting.system.service.*;
import com.itwopqq.booting.system.util.UUIDUtil;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
class bootingApplicationTests {
@Autowired
public ISysUserService sysUserService;
@Autowired
private ISysRoleService sysRoleService;
@Autowired
private ISysUserRoleService sysUserRoleService;
@Autowired
private ISysPermisionService sysPermisionService;
@Autowired
private ISysRolePermisionService sysRolePermisionService;
@Test
void contextLoads() {
System.out.println("=============junit test start===============");
SysPermision sysPermision = new SysPermision();
sysPermision.setUid(UUIDUtil.getUUID());
sysPermision.setPermisionUrl("/system/sysUser/openstank");
sysPermision.setPermisionName("stank管理");
sysPermision.setPermisionType("1");
sysPermision.setPermisionSort(1);
SysPermision sysPermision1 = new SysPermision();
sysPermision1.setUid(UUIDUtil.getUUID());
sysPermision1.setPermisionUrl("/system/sysUser/openWatch");
sysPermision1.setPermisionName("watch管理");
sysPermision1.setPermisionType("1");
sysPermision1.setPermisionSort(2);
sysPermisionService.insertOneModel(sysPermision);
sysPermisionService.insertOneModel(sysPermision1);
List<SysPermision> sysPermisionList = new ArrayList<>();
sysPermisionList.add(sysPermision);
sysPermisionList.add(sysPermision1);
SysRoleDto sysRoleDto = new SysRoleDto();
sysRoleDto.setUid(UUIDUtil.getUUID());
sysRoleDto.setRoleName("管理员");
sysRoleDto.setRoleDesc("管理员角色");
sysRoleDto.setPerms(sysPermisionList);
sysRoleService.insertOneModel(sysRoleDto);
sysRolePermisionService.insertBatch(sysRoleDto);
List<SysRoleDto> sysRoleDtoList = new ArrayList<>();
sysRoleDtoList.add(sysRoleDto);
SysUserDto sysUserDto = new SysUserDto();
sysUserDto.setUid(UUIDUtil.getUUID());
sysUserDto.setUsername("admin");
sysUserDto.setPassword("123456");
sysUserDto.setRealname("管理员");
sysUserDto.setCreateTime(new Date());
sysUserDto.setUserIdentify("1");
sysUserDto.setUserStatus("1");
sysUserDto.setRoles(sysRoleDtoList);
sysUserService.insertOneModel(sysUserDto);
sysUserRoleService.insertBatch(sysUserDto);
System.out.println("=============junit test end===============");
}
@Test
public void test2(){
System.out.println("=============junit test start===============");
SysPermision sysPermision = new SysPermision();
sysPermision.setUid(UUIDUtil.getUUID());
sysPermision.setPermisionUrl("/system/sysUser/openstank2");
sysPermision.setPermisionName("stank查询");
sysPermision.setPermisionType("1");
sysPermision.setPermisionSort(1);
SysPermision sysPermision1 = new SysPermision();
sysPermision1.setUid(UUIDUtil.getUUID());
sysPermision1.setPermisionUrl("/system/sysUser/openWatch2");
sysPermision1.setPermisionName("watch查询");
sysPermision1.setPermisionType("1");
sysPermision1.setPermisionSort(2);
sysPermisionService.insertOneModel(sysPermision);
sysPermisionService.insertOneModel(sysPermision1);
List<SysPermision> sysPermisionList = new ArrayList<>();
sysPermisionList.add(sysPermision);
sysPermisionList.add(sysPermision1);
SysRoleDto sysRoleDto = new SysRoleDto();
sysRoleDto.setUid(UUIDUtil.getUUID());
sysRoleDto.setRoleName("查询员");
sysRoleDto.setRoleDesc("查询员角色");
sysRoleDto.setPerms(sysPermisionList);
sysRoleService.insertOneModel(sysRoleDto);
sysRolePermisionService.insertBatch(sysRoleDto);
List<SysRoleDto> sysRoleDtoList = new ArrayList<>();
sysRoleDtoList.add(sysRoleDto);
SysUserDto sysUserDto = new SysUserDto();
sysUserDto.setUid(UUIDUtil.getUUID());
sysUserDto.setUsername("fanzhen");
sysUserDto.setPassword("123456");
sysUserDto.setRealname("查询员");
sysUserDto.setCreateTime(new Date());
sysUserDto.setUserIdentify("1");
sysUserDto.setUserStatus("1");
sysUserDto.setRoles(sysRoleDtoList);
sysUserService.insertOneModel(sysUserDto);
sysUserRoleService.insertBatch(sysUserDto);
System.out.println("=============junit test end===============");
}
}
启动程序:
/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:62251,suspend=y,server=n -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:/Users/fanzhen/Library/Caches/IntelliJIdea2019.1/captureAgent/debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/tools.jar:/Users/fanzhen/Documents/ideaworkspaces/booting/target/classes:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-web/2.2.6.RELEASE/spring-boot-starter-web-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter/2.2.6.RELEASE/spring-boot-starter-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot/2.2.6.RELEASE/spring-boot-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-autoconfigure/2.2.6.RELEASE/spring-boot-autoconfigure-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-logging/2.2.6.RELEASE/spring-boot-starter-logging-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/Users/fanzhen/Documents/local-repository/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/Users/fanzhen/Documents/local-repository/org/apache/logging/log4j/log4j-to-slf4j/2.12.1/log4j-to-slf4j-2.12.1.jar:/Users/fanzhen/Documents/local-repository/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar:/Users/fanzhen/Documents/local-repository/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar:/Users/fanzhen/Documents/local-repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar:/Users/fanzhen/Documents/local-repository/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-json/2.2.6.RELEASE/spring-boot-starter-json-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/jackson/core/jackson-databind/2.10.3/jackson-databind-2.10.3.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/jackson/core/jackson-core/2.10.3/jackson-core-2.10.3.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.3/jackson-datatype-jdk8-2.10.3.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.3/jackson-datatype-jsr310-2.10.3.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.10.3/jackson-module-parameter-names-2.10.3.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-tomcat/2.2.6.RELEASE/spring-boot-starter-tomcat-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/apache/tomcat/embed/tomcat-embed-core/9.0.33/tomcat-embed-core-9.0.33.jar:/Users/fanzhen/Documents/local-repository/org/apache/tomcat/embed/tomcat-embed-el/9.0.33/tomcat-embed-el-9.0.33.jar:/Users/fanzhen/Documents/local-repository/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.33/tomcat-embed-websocket-9.0.33.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-validation/2.2.6.RELEASE/spring-boot-starter-validation-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar:/Users/fanzhen/Documents/local-repository/org/hibernate/validator/hibernate-validator/6.0.18.Final/hibernate-validator-6.0.18.Final.jar:/Users/fanzhen/Documents/local-repository/org/jboss/logging/jboss-logging/3.4.1.Final/jboss-logging-3.4.1.Final.jar:/Users/fanzhen/Documents/local-repository/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-web/5.2.5.RELEASE/spring-web-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-beans/5.2.5.RELEASE/spring-beans-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-webmvc/5.2.5.RELEASE/spring-webmvc-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-aop/5.2.5.RELEASE/spring-aop-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-context/5.2.5.RELEASE/spring-context-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-expression/5.2.5.RELEASE/spring-expression-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/mybatis/spring/boot/mybatis-spring-boot-starter/1.3.3/mybatis-spring-boot-starter-1.3.3.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-jdbc/2.2.6.RELEASE/spring-boot-starter-jdbc-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/com/zaxxer/HikariCP/3.4.2/HikariCP-3.4.2.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-jdbc/5.2.5.RELEASE/spring-jdbc-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-tx/5.2.5.RELEASE/spring-tx-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/1.3.3/mybatis-spring-boot-autoconfigure-1.3.3.jar:/Users/fanzhen/Documents/local-repository/org/mybatis/mybatis/3.4.6/mybatis-3.4.6.jar:/Users/fanzhen/Documents/local-repository/org/mybatis/mybatis-spring/1.3.2/mybatis-spring-1.3.2.jar:/Users/fanzhen/Documents/local-repository/mysql/mysql-connector-java/8.0.19/mysql-connector-java-8.0.19.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-starter-test/2.2.6.RELEASE/spring-boot-starter-test-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-test/2.2.6.RELEASE/spring-boot-test-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/boot/spring-boot-test-autoconfigure/2.2.6.RELEASE/spring-boot-test-autoconfigure-2.2.6.RELEASE.jar:/Users/fanzhen/Documents/local-repository/com/jayway/jsonpath/json-path/2.4.0/json-path-2.4.0.jar:/Users/fanzhen/Documents/local-repository/net/minidev/json-smart/2.3/json-smart-2.3.jar:/Users/fanzhen/Documents/local-repository/net/minidev/accessors-smart/1.2/accessors-smart-1.2.jar:/Users/fanzhen/Documents/local-repository/org/ow2/asm/asm/5.0.4/asm-5.0.4.jar:/Users/fanzhen/Documents/local-repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.3/jakarta.xml.bind-api-2.3.3.jar:/Users/fanzhen/Documents/local-repository/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2.jar:/Users/fanzhen/Documents/local-repository/org/junit/jupiter/junit-jupiter/5.5.2/junit-jupiter-5.5.2.jar:/Users/fanzhen/Documents/local-repository/org/junit/jupiter/junit-jupiter-api/5.5.2/junit-jupiter-api-5.5.2.jar:/Users/fanzhen/Documents/local-repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar:/Users/fanzhen/Documents/local-repository/org/junit/platform/junit-platform-commons/1.5.2/junit-platform-commons-1.5.2.jar:/Users/fanzhen/Documents/local-repository/org/junit/jupiter/junit-jupiter-params/5.5.2/junit-jupiter-params-5.5.2.jar:/Users/fanzhen/Documents/local-repository/org/junit/jupiter/junit-jupiter-engine/5.5.2/junit-jupiter-engine-5.5.2.jar:/Users/fanzhen/Documents/local-repository/org/junit/vintage/junit-vintage-engine/5.5.2/junit-vintage-engine-5.5.2.jar:/Users/fanzhen/Documents/local-repository/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar:/Users/fanzhen/Documents/local-repository/org/junit/platform/junit-platform-engine/1.5.2/junit-platform-engine-1.5.2.jar:/Users/fanzhen/Documents/local-repository/junit/junit/4.12/junit-4.12.jar:/Users/fanzhen/Documents/local-repository/org/mockito/mockito-junit-jupiter/3.1.0/mockito-junit-jupiter-3.1.0.jar:/Users/fanzhen/Documents/local-repository/org/assertj/assertj-core/3.13.2/assertj-core-3.13.2.jar:/Users/fanzhen/Documents/local-repository/org/hamcrest/hamcrest/2.1/hamcrest-2.1.jar:/Users/fanzhen/Documents/local-repository/org/mockito/mockito-core/3.1.0/mockito-core-3.1.0.jar:/Users/fanzhen/Documents/local-repository/net/bytebuddy/byte-buddy/1.10.8/byte-buddy-1.10.8.jar:/Users/fanzhen/Documents/local-repository/net/bytebuddy/byte-buddy-agent/1.10.8/byte-buddy-agent-1.10.8.jar:/Users/fanzhen/Documents/local-repository/org/objenesis/objenesis/2.6/objenesis-2.6.jar:/Users/fanzhen/Documents/local-repository/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0.jar:/Users/fanzhen/Documents/local-repository/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-core/5.2.5.RELEASE/spring-core-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-jcl/5.2.5.RELEASE/spring-jcl-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/springframework/spring-test/5.2.5.RELEASE/spring-test-5.2.5.RELEASE.jar:/Users/fanzhen/Documents/local-repository/org/xmlunit/xmlunit-core/2.6.4/xmlunit-core-2.6.4.jar:/Users/fanzhen/Documents/local-repository/org/apache/shiro/shiro-core/1.3.2/shiro-core-1.3.2.jar:/Users/fanzhen/Documents/local-repository/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar:/Users/fanzhen/Documents/local-repository/commons-beanutils/commons-beanutils/1.8.3/commons-beanutils-1.8.3.jar:/Users/fanzhen/Documents/local-repository/org/apache/shiro/shiro-spring/1.3.2/shiro-spring-1.3.2.jar:/Users/fanzhen/Documents/local-repository/org/apache/shiro/shiro-web/1.3.2/shiro-web-1.3.2.jar:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar" com.itwopqq.booting.BootingApplication
Connected to the target VM, address: '127.0.0.1:62251', transport: 'socket'
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.2.6.RELEASE)
2020-04-06 21:02:14.842 INFO 7720 --- [ main] com.itwopqq.booting.BootingApplication : Starting BootingApplication on fanzhendeAir.bbrouter with PID 7720 (/Users/fanzhen/Documents/ideaworkspaces/booting/target/classes started by fanzhen in /Users/fanzhen/Documents/ideaworkspaces/booting)
2020-04-06 21:02:14.854 INFO 7720 --- [ main] com.itwopqq.booting.BootingApplication : The following profiles are active: dev
2020-04-06 21:02:16.472 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'shiroConfig' of type [com.itwopqq.booting.config.ShiroConfig$$EnhancerBySpringCGLIB$$5b577a0] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.530 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sessionIdGenerator' of type [org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.532 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sessionDAO' of type [org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.535 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sessionValidationScheduler' of type [org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.539 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sessionIdCookie' of type [org.apache.shiro.web.servlet.SimpleCookie] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.543 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sessionManager' of type [org.apache.shiro.web.session.mgt.DefaultWebSessionManager] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.812 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'hashedCredentialsMatcher' of type [org.apache.shiro.authc.credential.HashedCredentialsMatcher] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.858 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'mybatis-org.mybatis.spring.boot.autoconfigure.MybatisProperties' of type [org.mybatis.spring.boot.autoconfigure.MybatisProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.864 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration' of type [org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration$$EnhancerBySpringCGLIB$$4d033398] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.866 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari' of type [org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.876 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'spring.datasource-org.springframework.boot.autoconfigure.jdbc.DataSourceProperties' of type [org.springframework.boot.autoconfigure.jdbc.DataSourceProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:16.905 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'dataSource' of type [com.zaxxer.hikari.HikariDataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.238 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sqlSessionFactory' of type [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.244 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sqlSessionTemplate' of type [org.mybatis.spring.SqlSessionTemplate] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.246 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sysUserMapper' of type [org.mybatis.spring.mapper.MapperFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.248 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sysUserMapper' of type [com.sun.proxy.$Proxy63] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.251 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sysRoleMapper' of type [org.mybatis.spring.mapper.MapperFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.253 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sysRoleMapper' of type [com.sun.proxy.$Proxy64] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.255 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sysPermisionMapper' of type [org.mybatis.spring.mapper.MapperFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.256 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sysPermisionMapper' of type [com.sun.proxy.$Proxy65] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.256 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'loginServiceimpl' of type [com.itwopqq.booting.system.serviceimpl.LoginServiceimpl] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.256 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'bootingRealm' of type [com.itwopqq.booting.config.BootingRealm] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.259 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'securityManager' of type [org.apache.shiro.web.mgt.DefaultWebSecurityManager] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.262 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'getMethodInvokingFactoryBean' of type [org.springframework.beans.factory.config.MethodInvokingFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:17.265 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sysPermisionServiceImpl' of type [com.itwopqq.booting.system.serviceimpl.SysPermisionServiceImpl] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
===========================================
com.itwopqq.booting.system.serviceimpl.SysPermisionServiceImpl@51a6cc2a
===========================================
2020-04-06 21:02:17.288 INFO 7720 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-04-06 21:02:17.639 INFO 7720 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
======================load shiro filter chain start==========================
================== url:/system/sysUser/openWatch,perms[/system/sysUser/openWatch]
================== url:/system/sysUser/openWatch2,perms[/system/sysUser/openWatch2]
================== url:/system/sysUser/openstank,perms[/system/sysUser/openstank]
================== url:/system/sysUser/openstank2,perms[/system/sysUser/openstank2]
======================load shiro filter chain end==========================
2020-04-06 21:02:17.807 INFO 7720 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'authorizationAttributeSourceAdvisor' of type [org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-04-06 21:02:18.322 INFO 7720 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2020-04-06 21:02:18.336 INFO 7720 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2020-04-06 21:02:18.337 INFO 7720 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.33]
2020-04-06 21:02:18.453 INFO 7720 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2020-04-06 21:02:18.453 INFO 7720 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 3487 ms
2020-04-06 21:02:18.809 INFO 7720 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2020-04-06 21:02:19.171 INFO 7720 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2020-04-06 21:02:19.176 INFO 7720 --- [ main] com.itwopqq.booting.BootingApplication : Started BootingApplication in 5.316 seconds (JVM running for 6.961)
启动日志中下面这段输出的是我们需要访问验证的权限路径:
======================load shiro filter chain start==========================
================== url:/system/sysUser/openWatch,perms[/system/sysUser/openWatch]
================== url:/system/sysUser/openWatch2,perms[/system/sysUser/openWatch2]
================== url:/system/sysUser/openstank,perms[/system/sysUser/openstank]
================== url:/system/sysUser/openstank2,perms[/system/sysUser/openstank2]
======================load shiro filter chain end==========================
验证:
在我们没有登录过的情况下,我们输入
http://localhost:8080/page/userinfo?name=fanzhen&&age=2访问,
可以看到console打印了下面这句话;
AjaxResult{status='error', msg='您尚未登录或登录时间过长,请重新登录!', data=null}
这是因为userinfo.html页面中另有ajax的请求,该请求被我们的自定义拦截器(PermissionsAuthorizationExtendFilter.java)拦截了,并返回了我们错误的异常信息;
我们用前面创建的账号模拟登录,访问路径如下
http://localhost:8080/system/sysUser/loginss?username=admin&&password=123456
在访问之前的路径
http://localhost:8080/page/userinfo?name=fanzhen&&age=2;控制台未打印未登录的日志信息;
好了,接下来我们来试着访问没有权限的页面;
因为前面我们刚模拟登录了有权限的页面;
第一步:访问有权限的页面:/system/sysUser/openstank2
第二步:访问无权限(/system/sysUser/openstank)的页面,系统将会根据我们在ShiroConfig.java类里面的约束跳转到/403页面
如下,因为我们未设置/403映射的页面,所以页面会报错。