美文网首页Spring Security Oauth2.0认证授权
20.Spring Security应用详解-授权-连接数据库查

20.Spring Security应用详解-授权-连接数据库查

作者: LANSHENGYANG | 来源:发表于2020-03-27 13:10 被阅读0次

    授权

    • 授权的方式包括web授权和方法授权,web授权是通过url拦截进行授权,方式授权是通过方法拦截进行授权。他们都会调用accessDecisionManager进行授权决策,若为web授权则拦截器为FilterSecurityInterceptor;若为方法授权则拦截器为MethodSecurityInterceptor。如果同时通过web授权和方法授权则先执行web授权,再执行方法授权,最后决策通过,则允许访问资源,否则将禁止访问。
    • 类关系如下:


      image

    准备环境

    数据库环境

    • 在t_user数据库创建如下表:
    • 角色表:
    -- ----------------------------
    -- Table structure for t_role
    -- ----------------------------
    DROP TABLE IF EXISTS `t_role`;
    CREATE TABLE `t_role` (
      `id` varchar(32) NOT NULL,
      `role_name` varchar(255) NOT NULL,
      `description` varchar(255) DEFAULT NULL,
      `create_time` datetime DEFAULT NULL,
      `update_time` datetime DEFAULT NULL,
      `status` char(1) NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `unique_role_name` (`role_name`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    -- ----------------------------
    -- Records of t_role
    -- ----------------------------
    INSERT INTO `t_role` VALUES ('1', '管理员', null, null, null, '');
    
    • 用户角色关系表
    -- ----------------------------
    -- Table structure for t_user_role
    -- ----------------------------
    DROP TABLE IF EXISTS `t_user_role`;
    CREATE TABLE `t_user_role` (
      `user_id` int(11) NOT NULL,
      `role_id` int(11) NOT NULL,
      `create_time` datetime DEFAULT NULL,
      `creator` varchar(255) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    -- ----------------------------
    -- Records of t_user_role
    -- ----------------------------
    INSERT INTO `t_user_role` VALUES ('1', '1', null, null);
    
    • 权限表
    -- ----------------------------
    -- Table structure for t_permission
    -- ----------------------------
    DROP TABLE IF EXISTS `t_permission`;
    CREATE TABLE `t_permission` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `code` varchar(255) DEFAULT NULL,
      `description` varchar(255) DEFAULT NULL,
      `url` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    -- ----------------------------
    -- Records of t_permission
    -- ----------------------------
    INSERT INTO `t_permission` VALUES ('1', 'p1', '测试资源1', '/r/r1');
    INSERT INTO `t_permission` VALUES ('2', 'p2', '测试资源2', '/r/r2');
    
    • 角色权限关系表
    -- ----------------------------
    -- Table structure for t_role_permission
    -- ----------------------------
    DROP TABLE IF EXISTS `t_role_permission`;
    CREATE TABLE `t_role_permission` (
      `role_id` int(11) NOT NULL,
      `permission_id` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    -- ----------------------------
    -- Records of t_role_permission
    -- ----------------------------
    INSERT INTO `t_role_permission` VALUES ('1', '1');
    INSERT INTO `t_role_permission` VALUES ('1', '2');
    

    修改UserDao

    • 获取权限信息
    @Repository
    public class UserDao {
    
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        //根据用户的id查询用户权限
        public List<String> findPermissionByUserId(String userId) {
            String sql = "SELECT * FROM t_permission WHERE id in(SELECT permission_id FROM t_role_permission WHERE role_id in(SELECT role_id FROM t_user_role WHERE user_id=?))";
    
            List<PermissionDto> list = jdbcTemplate.query(sql, new Object[]{userId}, new BeanPropertyRowMapper<>(PermissionDto.class));
            ArrayList<String> permission = new ArrayList<>();
            list.forEach(c->permission.add(c.getCode()));
            return permission;
        }
    }
    

    修改UserDetailService

    • 实现从数据库读取权限
    @Component
    public class SpringDataUserDetailsService implements UserDetailsService {
    
        @Autowired
        UserDao userDao;
    
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            //登录账号
            System.out.println("username="+username);
            //根据账号去数据库查询
            UserDto user = userDao.getUserByUsername(username);
            if (user==null){
                //如果用户查不到,返回null,由provider抛出异常
                return null;
            }
            //根据用户id查询用户的权限
            List<String> permission = userDao.findPermissionByUserId(user.getId());
            
            //将permission转成数组
            String[] permissionArray=new String[permission.size()];
            permission.toArray(permissionArray);
    
            //暂时采用模拟方式
            UserDetails userDetails = User.withUsername(user.getUsername()).password(user.getPassword()).authorities(permissionArray).build();
            return userDetails;
        }
    }
    

    相关文章

      网友评论

        本文标题:20.Spring Security应用详解-授权-连接数据库查

        本文链接:https://www.haomeiwen.com/subject/gwjluhtx.html