首页 > 数据库 >从数据库查询权限信息、自定义失败处理

从数据库查询权限信息、自定义失败处理

时间:2023-04-23 14:35:29浏览次数:35  
标签:自定义 数据库 public role user new 权限 id

从数据库查询权限信息

我们只需要根据用户id去查询到其所对应的权限信息即可。

所以我们可以先定义个mapper,其中提供一个方法可以根据userid查询权限信息。

MenuMapper持久层接口

public interface MenuMapper extends BaseMapper<Menu> {

    List<String> selectPermsByUserId(Long userid);

}

尤其是自定义方法,所以需要创建对应的mapper文件,定义对应的sql语句

MenuMapper.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.example.springsecurity1.mapper.MenuMapper">

    <select id="selectPermsByUserId" resultType="java.lang.String">
        SELECT
            DISTINCT m.`perms`
        FROM
            sys_user_role ur
                LEFT JOIN `sys_role` r ON ur.`role_id` = r.`id`
                LEFT JOIN `sys_role_menu` rm ON ur.`role_id` = rm.`role_id`
                LEFT JOIN `sys_menu` m ON m.`id` = rm.`menu_id`
        WHERE
            user_id = #{userid}
          AND r.`status` = 0
          AND m.`status` = 0
    </select>
    
</mapper>

在application.yml中配置mapperXML文件的位置

application.yml配置文件

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/sg_security?characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  redis:
    host: localhost
    port: 6379
mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml 

然后我们可以在UserDetailsServiceImpl中去调用该mapper的方法查询权限信息封装到LoginUser对象中即可。

UserDetailsServiceImpl实现类

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
 
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private MenuMapper menuMapper;
 
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getUserName,username);
        User user = userMapper.selectOne(wrapper);
        if(Objects.isNull(user)){
            throw new RuntimeException("用户名或密码错误");
        }
//        List<String> list = new ArrayList<>(Arrays.asList("test","admin"));
        List<String> list = menuMapper.selectPermsByUserId(user.getId());
        // 把数据封装成UserDetails返回
        return new LoginUser(user,list);
    }
}

自定义失败处理

我们还希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json,这样可以让前端对响应进行统一的处理。要实现这个功能我们需要知道SpringSecurity的异常处理机制。

在SpringSecurity中,如果我们在认证或者授权的过程中出现了异常会被ExceptionTranslationFilter捕获到。在ExceptionTranslationFilter中判断是认证失败还是授权失败的异常。

如果是认证过程中出现的异常会被封装成AuthenticationException然后调用AuthenticationEntryPoint 对象的方法去进行异常处理。

如果是授权过程中出现的异常会被封装成AuthenticationException然后调用AccessDeniedHandler对象的方法去进行异常处理。

所以如果我们需要自定义异常处理,我们只需要自定义AuthenticationEntryPoint和AccessDeniedHandler然后配置给SpringSecurity即可。

1、创建handler包,在包下创建两个自定义实现类

AccessDeniedHandlerImpl实现类

@Component
public class AccessDeniedHandlerImpl implements AccessDeniedHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        ResponseResult result = new ResponseResult(HttpStatus.FORBIDDEN.value(), "权限不足");
        String json = JSON.toJSONString(result);
        WebUtils.renderString(response,json);
 
    }
}

AuthenticationEntryPointImpl实现类

@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
        ResponseResult result = new ResponseResult(HttpStatus.UNAUTHORIZED.value(), "认证失败请重新登录");
        String json = JSON.toJSONString(result);
        WebUtils.renderString(response,json);
    }
}

2、更改SecurityConfig类的配置

注入对应的处理器

@Autowired
private AuthenticationEntryPoint authenticationEntryPoint;

@Autowired
private AccessDeniedHandler accessDeniedHandler;

配置异常处理器

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                //关闭csrf
                .csrf().disable()
                //不通过Session获取SecurityContext
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                // 对于登录接口 允许匿名访问
                .antMatchers("/user/login").anonymous()
                // 除上面外的所有请求全部需要鉴权认证
                .anyRequest().authenticated();

        // 把token校验过滤器添加到过滤器链中
        http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);

        // 配置异常处理器
        http.exceptionHandling()
                // 配置认证失败处理器
                .authenticationEntryPoint(authenticationEntryPoint)
                .accessDeniedHandler(accessDeniedHandler);
    }

标签:自定义,数据库,public,role,user,new,权限,id
From: https://www.cnblogs.com/wsfj/p/17346451.html

相关文章

  • Linux权限管理及用户与用户组
    摘要:第一部分:Linux权限管理一、基本权限linux权限机制采用UGO模式。其中u(user)表示所属用户、g(group)表示所属组、o(other)表示除了所属用户、所属组之外的情况。u、g、o都有读(read)、写(write)、执...第一部分:Linux权限管理一、基本权限    linux权限机制采用UGO模......
  • mysql数据库表的自增id被删后的乱序重排问题
    在对数据库进行操作的时候遇到了这样一个问题,数据库的表里的id是自增的,当数据被删除或者添加时,ID便会一直增上去,id就会变得很乱,不会按照顺序,今天查找了各个网站,终于找到了解决办法altertabletablenamedropcolumnid;altertabletablenameaddidmediumint(8)notnullprim......
  • 各个数据库的特点
     redis(频繁访问的数据,缓存在redis当中,访问速度得到提升,响应速度也得到提升) mongoDB(存储大数据量的数据,大数据量的访问性能提升) elasticsearch(复杂的搜索功能) neo4j(比较复杂的关系数据,比较直观的看到数据) ......
  • oracle数据库跟踪
    --数据库跟踪SELECT*FROMv$sqlwherelast_active_time>TO_DATE('2019-7-1813:17:00','yyyy-mm-ddhh24:mi:ss')ORDERBYLAST_ACTIVE_TIMEDESC;selects.sql_text,b.name,b.position,b.dup_position,b.value_string,s.LAST_ACTIVE_TIME,s.SQL_......
  • 【数据库开发】国产数据库之涛思TDengine
    文章目录1、简介2、安装2.1安装TDengine服务2.2运行TDengine服务(taosd)2.3执行TDengine命令行(taos)3、测试3.1新建数据库(命令行命令)3.2新建数据库(脚本文件)3.3命令行参数3.4taosBenchmark命令(体验写入速度)3.5TDengineCLI命令(体验查询速度)3.6基础命令3.7节点管理3.8用户管......
  • nginx自定义负载均衡及根据cpu运行自定义负载均衡
    1.nginx如何自定义负载均衡在Nginx中,可以通过配置文件自定义负载均衡策略。具体步骤如下:首先,在Nginx配置文件中定义一个upstream模块,并设置负载均衡策略和后端服务器列表,例如:upstreammyapp{serverbackend1.example.comweight=3;serverbackend2.example.com;se......
  • node-red 在功能模块下自定义节点
    在目录下node-red\packages\node_modules\@node-red\nodes\core\function下创建compare.js和compare.html demo.js demo.html确保 data-template-name与RED.nodes.registerType的名称要一致 然后npmrunstart就可以看到 注:https://blog.csdn.net/wmjjjj/artic......
  • RBAC权限模型、建表及SQL语句编写
    RBAC权限模型RBAC权限模型(Role-BasedAccessControl)即:基于角色的权限控制。这是目前最常被开发者使用也是相对易用、通用权限模型。建表及SQL语句编写准备工作创建数据库SQL表CREATEDATABASE/*!32312IFNOTEXISTS*/`sg_security`/*!40100DEFAULTCHARACTERSETutf8......
  • 关于sql server数据库本地连接失败的问题的解决
    问题描述打开SQLServer使用时,需要连接到本地数据库;但是一直显示连接本地数据库失败;问题解决右键管理->服务与应用程序->服务->找到这个:右键打开它,再次连接,就能够成功运行啦!......
  • Liunx配置sudo使oracle用户有root权限执行脚本
    1、vi/etc/sudoers将%wheel两行前的注释#删除2. vi/etc/group将oracle用户加入wheel组......