张童瑶 2023-06-07 16:55 采纳率: 81.8%
浏览 81

在gateway中,使用security webflux组件,其他鉴权都成功了,就是想通过@PreAuthorize注解做权限鉴权一直注解失效

想请教一下,在gateway中,使用security webflux组件,其他都成功了,就是想通过@PreAuthorize注解做权限鉴权一直注解失效,SecurityWebFluxConfig文件中也添加了@EnableReactiveMethodSecurity注解,就是不生效

img

img

完整配置:

@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
public class SecurityWebFluxConfig {

    //自定义的鉴权服务,通过鉴权的才能继续访问某个请求
    @Resource
    private MyRBACServiceWebFlux myRBACServiceWebFlux;

    // 无权限访问被拒绝时的自定义处理器
    @Resource
    private MyAccessDeniedHandlerWebFlux myAccessDeniedHandlerWebFlux;

    // 登录成功时自定义处理器
    @Resource
    private LoginSuccessHandlerWebFlux loginSuccessHandlerWebFlux;

    // 登录失败时调用的自定义处理类
    @Resource
    private LoginFailedHandlerWebFlux loginFailedHandlerWebFlux;

    // 成功登出时调用的自定义处理类
    @Resource
    private LogoutSuccessHandlerWebFlux logoutSuccessHandlerWebFlux;

    // 未登录访问资源时的处理类
    @Resource
    private NotLoginHandlerWebFlux customHttpBasicServerAuthenticationEntryPoint;

    @Autowired
    private MyConfig myConfig;

    @Bean
    SecurityWebFilterChain webFluxSecurityFilterChain(ServerHttpSecurity http) throws Exception {
        http
                .authorizeExchange()

                // 免登录访问,jwt和security共用
                .pathMatchers(myConfig.getNoAuth()).permitAll()
                // .pathMatchers(HttpMethod.OPTIONS).permitAll()

                //.pathMatchers("/whoAmI").hasAuthority("ROLE_ADMIN")

                .and()
                .authorizeExchange()

                //自定义的鉴权服务,通过鉴权的才能继续访问某个请求(就是url校验权限)
                /*.pathMatchers("/**").access(myRBACServiceWebFlux)
                .anyExchange().authenticated()*/


                .and()
                .formLogin()
                .loginPage("/console/login")
                .authenticationSuccessHandler(loginSuccessHandlerWebFlux) //认证成功
                .authenticationFailureHandler(loginFailedHandlerWebFlux) //登陆验证失败
                .and().exceptionHandling().authenticationEntryPoint(customHttpBasicServerAuthenticationEntryPoint)  //未登录访问资源时的处理类,若无此处理类,前端页面会弹出登录窗口
                .and().exceptionHandling().accessDeniedHandler(myAccessDeniedHandlerWebFlux)//访问被拒绝时自定义处理器
                .and() .csrf().disable()//必须支持跨域
                .logout().logoutUrl("/console/logout")
                .logoutSuccessHandler(logoutSuccessHandlerWebFlux).and()
                .httpBasic().disable();//成功登出时调用的自定义处理类

        return http.build();
    }
}
@RestController
public class BusinessController {
    @RequestMapping("/adminCall")
    public Mono<String> adminCall(WebSession session, ServerWebExchange exchange){

        return Mono.just("通过");
    }

    //用户登录后,会把UserDetails对象放入context中,此接口用于测试存放的用户信息
    @RequestMapping("/whoAmI")
    @PreAuthorize("hasAuthority('ROLE_ADMIN')")
    public String whoAmI(){
        return JSONObject.toJSONString(SecurityContextHolder.getContext().getAuthentication().getPrincipal());
    }
}

  • 写回答

1条回答 默认 最新

  • weixin_48484941 2023-06-07 17:30
    关注

    1、请求头有带token回去么
    2、断点鉴权的代码看有没有获取到token,以及鉴权哪里错了。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月7日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀