用到的技术:
后台: java (springboot+shiro) 。创建项目-可参考
前台: vue-admin-template (前台权限参考vue-element-admin)。下载配置-可参考
编辑器:
后台:IntelliJ IDEA
前台:Visual Studio Code
后台:
第一步:打印日志 &确认前台传过来的参数:账号密码
这里我使用fastjson的方法 获取用户密码,代码如下
pom:
com.alibaba
fastjson
1.2.47
View Code
登陆打印结果:
第二步: 这里我们先创建三张表:
因为只是登陆 还没到权限所以 主要是用户表: 存一些基本信息如 账号 密码 头像 密码盐(如果需要的话) 角色id
sys_user 用户
sys_role 角色
sys_permission 权限
用户表:
CREATE TABLE`sys_user` (
`user_id` bigint NOT NULL COMMENT '主键id',
`avatar`varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '头像',
`account`varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '账号',
`password`varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '密码',
`salt`varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '密码盐',
`name`varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '名字',
`birthday`datetime DEFAULT NULL COMMENT '生日',
`sex`varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '性别',
`email`varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '邮箱',
`phone`varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '电话',
`role_ids`varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '角色id(多个逗号隔开)',
`create_time`datetime DEFAULT NULL COMMENT '创建时间',
`create_user`bigint DEFAULT NULL COMMENT '创建人',
`update_time`datetime DEFAULT NULL COMMENT '更新时间',
`update_user`bigint DEFAULT NULL COMMENT '更新人',PRIMARY KEY (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户表';
View Code
角色表:
CREATE TABLE`sys_role` (
`role_id`bigint NOT NULL COMMENT '主键id',
`pid`bigint DEFAULT NULL COMMENT '父角色id',
`name`varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '角色名称',
`description`varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '描述',
`sort`int DEFAULT NULL COMMENT '序号',
`create_time`datetime DEFAULT NULL COMMENT '创建时间',
`update_time`datetime DEFAULT NULL COMMENT '修改时间',
`create_user`bigint DEFAULT NULL COMMENT '创建用户',
`update_user`bigint DEFAULT NULL COMMENT '修改用户',
`deleted`tinyint(1) DEFAULT '0' COMMENT '逻辑删除',PRIMARY KEY(`role_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='角色表';
View Code
权限表:
CREATE TABLE`sys_permission` (
`id`int NOT NULLAUTO_INCREMENT,
`role_id`int DEFAULT NULL COMMENT '角色ID',
`permission`varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '权限',
`create_time`datetime DEFAULT NULL COMMENT '创建时间',
`update_time`datetime DEFAULT NULL COMMENT '更新时间',
`deleted`tinyint(1) DEFAULT '0' COMMENT '逻辑删除',PRIMARY KEY(`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=COMPACT COMMENT='权限表';
View Code
第三步:shiro 权限认证
1.pom:
org.apache.shiro
shiro-spring-boot-web-starter
1.4.0
2.自定义Realm 主要作用有:验证登陆人的账号密码是否正确、验证账号的权限信息等等
extends AuthorizingRealm 重写两个方法:
doGetAuthorizationInfo(PrincipalCollection principalCollection)
doGetAuthenticationInfo(AuthenticationToken authenticationToken)
KingRealm
第一个方法:授权:这里需要写一些方法->通过角色id 获取角色名称 和 权限信息
/*** 权限认证
*@paramprincipalCollection
*@return
*/@OverrideprotectedAuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {//获取用户
User user =(User) principalCollection.getPrimaryPrincipal();
String roleIds=user.getRoleIds();//通过角色id获取用户权限
Set roles =roleService.getRolesByRoleIds(roleIds);
Set permissions =permissionService.getPermissionsByRoleIds(roleIds);
SimpleAuthorizationInfo info= newSimpleAuthorizationInfo();
info.setRoles(roles);
info.setStringPermissions(permissions);returninfo;
}
service
public SetgetPermissionsByRoleIds(String roleIds) {
Set permissions = new HashSet();if(StringUtils.isEmpty(roleIds)) {returnpermissions;
}
List permissionList =permissionMapper.getPermissionsByRoleIds(roleIds);for(Permission permission : permissionList) {
permissions.add(permission.getPermission());
}returnpermissio