java基于二进制位运算的权限管理

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;
        }
    }

 

猜你喜欢

转载自blog.csdn.net/weixin_41999507/article/details/81810376