首页 > 其他分享 >自定义权限校验方法、基于配置的权限控制、CSRF

自定义权限校验方法、基于配置的权限控制、CSRF

时间:2023-04-24 09:35:13浏览次数:43  
标签:http CSRF 自定义 校验 token csrf 权限

自定义权限校验方法

我们也可以定义自己的权限校验方法。在@PreAuthorize注解中使用我们的方法。

创建expression包,在该包下创建SGEexpression类

@Component("ex")
public class SGEexpression {

    public boolean hasAuthority(String authority) {
        // 获取当前用户的权限
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        List<String> permissions = loginUser.getPermissions();
        // 判断用户权限集合中是否存在authority
        return permissions.contains(authority);
    }

}

在SPEL表达式使用@ex相当于获取容器中bean的名字为ex的对象。然后再调用这个对象的方法

    @RequestMapping("/hello")
    @PreAuthorize("@ex.hasAuthority('system:dept:list')")
    public String hello(){
        return "hello";
    }

基于配置的权限控制

我们也可以在配置类中使用使用配置的方式对资源进行权限控制。

SecurityConfig配置类

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

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

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

        // 允许跨域
        http.cors();
    }

CSRF

CSRF是指跨站请求伪造(Cross-site request forgery),是常见的攻击之一。

https://blog.csdn.net/freeking101/article/details/86537087

SpringSecurity去放置CSRF攻击的方式就是通过csrf_token。后端会生成一个csrf_token,前端发起请求的时候需要携带这个csrf_token,后端会有过滤器进行校验,如果没有携带或者是伪造的就不允许访问。

我们可以发现CSRF攻击依靠的是cookie中所携带的认证信息。但是在前后端分离的项目中我们的认证信息其实是token,而token并不是存储到cookie中,并且需要前端代码去把token设置到请求头中才可以,所以CSRF攻击也就不用担心了。

标签:http,CSRF,自定义,校验,token,csrf,权限
From: https://www.cnblogs.com/wsfj/p/17348472.html

相关文章

  • c# 异步进阶———— 自定义 taskschedule[三]
    前言我们知道我们的taskasync和await是基于线程池进行调度的。但是async和await也就是使用了默认的task调度,让其在线程池中运行。但是线程池是榨干机器性能为本质的,但是有时候我们运行一些我们自己的需求,比如控制一下线程数(因为并不是线程数越高,就能有更高的性能),控制一......
  • 跨域问题解决、其他权限校验方法
    跨域问题解决浏览器出于安全的考虑,使用XMLHttpRequest对象发起HTTP请求时必须遵守同源策略,否则就是跨域的HTTP请求,默认情况下是被禁止的。同源策略要求源相同才能正常进行通信,即协议、域名、端口号都完全一致。前后端分离项目前端项目和后端项目一般都不是同源的,所以肯定会存在......
  • Springboot yml配置参数加密 ,jasypt自定义解密器
    原文链接:https://www.cnblogs.com/JCcccit/p/16868137.html前言 最近项目组开始关注一些敏感数据的明文相关的事宜,其实这些东西也是都有非常成熟的解决方案。既然最近着手去解决这些事情,那么也顺便给还未了解的大伙普及一下。Springbootyml配置参数数据加密(数据加密篇......
  • docker.sock 和 docker.socket 无操作权限的修复
     问题:第三软件jenkins等,甚至docker本身都有可能报如下无权限操作的错误:docker:GotpermissiondeniedwhiletryingtoconnecttotheDockerdaemonsocketatunix:///var/run/docker.sock:Posthttp://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create:dialuni......
  • 实现权限登录
    数据库校验用户​从之前的分析我们可以知道,我们可以自定义一个UserDetailsService,让SpringSecurity使用我们的UserDetailsService。我们自己的UserDetailsService可以从数据库中查询用户名和密码数据库CREATETABLE`sys_user`(`id`BIGINT(20)NOTNULLAUTO_INCRE......
  • Eclipse默认标签TODO,XXX,FIXME和自定义标签[转]
    1TODO表示需要实现,但目前还未实现的功能2XXX勉强可以工作,但是需要改进的功能3FIXME代码是错误的,不能工作,需要修复4.自定义标签window-->preferences-->java-->compiler-->tags选择new,输入tag,选择priority,ok上述所有注释都会被eclipseta......
  • 一统天下 flutter - widget Sliver: SliverPersistentHeader - 自定义可展开/收缩的标
    源码https://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widgetSliver:SliverPersistentHeader-自定义可展开/收缩的标题栏示例如下:lib\widget\sliver\sliver_persistent_header.dart/**SliverPersistentHeader-自定义可展开/收缩的标题栏......
  • 授权实现 封装权限信息
    限制访问资源所需权限​SpringSecurity为我们提供了基于注解的权限控制方案,这也是我们项目中主要采用的方式。我们可以使用注解去指定访问对应的资源所需的权限。​但是要使用它我们需要先开启相关配置我们前面在写UserDetailsServiceImpl的时候说过,在查询出用户后还要获取......
  • 自定义starter
    将redis生成分布式唯一id的功能封装成starter供其他模块使用1 编写业务类packagecom.yangkun.redis;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.StringRedisTemplate;importorg.springframework.tran......
  • 自定义注解获取当前登录信息
    登录注解/***@authorzhourui*@date2023/4/189:39*/importjava.lang.annotation.*;/***@authorzhourui*@date2023/4/1714:42*/@Documented@Target(ElementType.METHOD)@Retention(value=RetentionPolicy.RUNTIME)public@interfaceReLogin{}......