1,背景
先了解其原理:https://www.cnblogs.com/tangyongle/p/7499787.html
基于:MySQL的的
2,设计权限表
- 1.系统管理登录表--sys_user
- 2.管理员权限分配表--sys_user_role
- 3.权限表
- 4.菜单表
- 5.菜单权限分配表
关联关系表
3.具体实现代码
省略实体类代码编写,直接上道层和控制器代码
- DAO层
/**
* 系统管理登录表
*/
@Mapper
public interface UserMapper {
//相对应SQL:select * from sys_user where 1 = 1 and login_name = #{loginName}
User findByName(String loginName);
}
2。
/**
* 系统管理登录权限表
*/
@Mapper
public interface UserRoleMapper {
//相对应sql:SELECT role_id from sys_user_role where user_id = #{userId}
Integer findByRoleId (Integer userId);
}
3。
/**
* 角色表
*/
@Mapper
public interface RoleMapper {
//相对应的SQL:select t.* from sys_role t
List<Role> findAll();
}
4。
/**
* 菜单层技树表
*/
@Mapper
public interface resourceMapper {
//相对应的SQL:select t.* from sys_resource t where t.resource_id=#{resourceId}
List<Resource> findById(Integer resourceId);
}
5。
/**
* 权限相对应的列表
*/
@Mapper
public interface RoleResourceMapper {
//相对应的SQL:SELECT t.resource_id from sys_role_resource where resource=#{roleId}
Integer findByResource(Integer roleId);
}
- 枚举
/**
* 验证状态机
*/
public enum VerificationCode {
error(500,"密码错误"),success(200,"登录成功"),cannotfind(404,"账号错误");
private int status; //状态码
private String prompt; //提示
VerificationCode(int i,String s){
this.status = i;
this.prompt = s;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getPrompt() {
return prompt;
}
public void setPrompt(String prompt) {
this.prompt = prompt;
}
}
- 控制器类
@Controller @RequestMapping("/admin") public class UserController { @Resource private UserService userService; @Resource private UserRoleMapper userRoleMapper; @Resource private RoleMapper roleMapper; @Resource private RoleResourceMapper roleResourceMapper; @Resource private ResourceMapper resourceMapper; /** * 验证登录 */ @RequestMapping("/login") public @ResponseBody List<com.taoban.background.resource.entity.Resource> verification(User quser){ User user = this.userService.verificationLogin(quser); //用来装状态机 Map<Integer,String> map = new HashMap<>(); //用来装最后结果集 List<com.taoban.background.resource.entity.Resource> list = new ArrayList<>(); if(user !=null ) if(user.getPassword() =="" || user.getPassword() != quser.getPassword()) //失败的情况比较多,所以放前面验证 map.put(VerificationCode.error.getStatus(),VerificationCode.error.getPrompt()); else //登录成功,开始权限转换 if(1 == 1) { //用来装系统后台管理权限 List<Role> role = new ArrayList<>(); //用来装角色的列表权限 List<RoleResource> resources = new ArrayList<>(); Map<Integer,Integer> re = new HashMap<>(); Integer roleId = this.userRoleMapper.findByRoleId(user.getUserId()); List<Role> listRole = this.roleMapper.findAll(); //获取该角色所有权限 for(Role r : listRole) if((roleId & r.getRoleId()) > 0) role.add(r); List<RoleResource> roleResourceList = this.roleResourceMapper.findAll(); for(RoleResource r : roleResourceList){ for(Role r1 :role) if((r.getRoleId() & r1.getRoleId()) > 0) resources.add(r); } //去重 for(RoleResource rs : resources) re.put(rs.getResourceId(),rs.getRoleId()); //得到该权限所有列表的信息 for(Integer i : re.keySet()) if( this.resourceMapper.findById(i) != null)list.add(this.resourceMapper.findById(i)); map.put(VerificationCode.success.getStatus(),VerificationCode.success.getPrompt()); } else map.put(VerificationCode.cannotfind.getStatus(),VerificationCode.cannotfind.getPrompt()); return list; } }