spring-security 重定向到登录页面或基于请求的URL给予403错误

dfuffjeb  于 2022-11-11  发布在  Spring
关注(0)|答案(2)|浏览(226)

我有一个使用安全性的Sping Boot 应用程序。这个应用程序使用MVC来显示一些页面,也使用一些REST接口来更新/获取对象。
现在,我在没有登录的情况下发出的每一个请求,我都会被重定向到**/login**页面。
当我尝试从Web浏览器访问时,这是按预期工作的。但我希望当我尝试从页面访问某些特定路径时,应用程序的React不同,例如“/api/customers”。
如果我尝试访问该路径,我希望删除HTTP 403错误,而不是重定向到登录页面。
这是我的安全配置:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.headers()
            .referrerPolicy(ReferrerPolicyHeaderWriter.ReferrerPolicy.SAME_ORIGIN);

    http.authorizeRequests()
            .antMatchers("/js/**", "/img/**")
            .permitAll()
            .antMatchers("/**").authenticated()
            .and()
            .csrf().disable()
            .formLogin()
            .loginPage("/login")
            .usernameParameter("email")
            .passwordParameter("password")
            .and()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login?logged-out")
            .and()
            .exceptionHandling()
            .accessDeniedPage("/access-denied")

    ;
}

这可能吗?

8hhllhi2

8hhllhi21#

您可以创建自定义的AuthenticationEntryPoint:
https://docs.spring.io/spring-security/site/docs/4.0.4.RELEASE/reference/htmlsingle/#auth-entry-point
如果使用者要求安全的HTTP资源,但未进行验证,就会呼叫AuthenticationEntryPoint。安全性拦截程式会在堆栈回退的更下层掷回适当的AuthenticationException或AccessDeniedException,触发进入点上的commend方法。这会将适当的回应呈现给使用者,让验证可以开始。

@Component
public class Http401UnauthorizedEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, 
                               AuthenticationException ex)
            throws IOException, ServletException {

        boolean somePath = request.getServletPath().equals("/somePath");

        if(somePath){
            response.sendError(SC_FORBIDDEN, "Access Denied");
        }
        else{
            response.sendRedirect("/login");
        }
    }
}

并将其注册到框架中:

http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint)
kmynzznz

kmynzznz2#

Spring Security有一个DelegatingAuthenticationEntryPoint,它允许基于RequestMatcher评估来选择具体的AuthenticationEntryPoint
https://docs.spring.io/spring-security/site/docs/5.7.x/api/org/springframework/security/web/authentication/DelegatingAuthenticationEntryPoint.html

相关问题