gpt4 book ai didi

java - 如何在Spring Security中为两个不同的URL指定两个不同的登录表单?

转载 作者:行者123 更新时间:2023-12-01 18:40:20 28 4
gpt4 key购买 nike

我有一个相对复杂的spring security配置,如下所示。我想要实现的目标如下:

/passport/** 的请求将通过替代的 formLogin() ("/passport/login") 进行身份验证。这与默认 formLogin 不同,默认 formLogin 解析为 ("/login")

两种形式都将使用相同的身份验证机制(或在幕后非常相似)。

目前,对 /passport/123 等的请求在某种程度上是“开放的”且未经身份验证,而它们需要重定向到 /passport/login 任何人都可以看到我做错了什么或者如何最好地实现这一目标?

我在线阅读的许多文档都建议使用两种不同的配置类,而我有一个,但登录逻辑是相似的。鉴于还有相当多的其他部分需要复制,如果可能的话,我只想只有一个配置。

 http

.antMatcher( "/passport/**" )
.authorizeRequests().and()
.formLogin().loginPage( "/passport/login" )
.successHandler( authSuccessHandler() )
.failureHandler( authFailureHandler() )
.and()
.antMatcher( "/**" )
.authorizeRequests()
.antMatchers( HttpMethod.OPTIONS, "/" ).permitAll()
.antMatchers( HttpMethod.GET, "/app/**" ).permitAll()
.antMatchers( LOGIN_DESTINATION + "**" ).permitAll()
.anyRequest().authenticated()
.and()
.oauth2Login()
.loginPage( LOGIN_DESTINATION )
.authorizationEndpoint()
.baseUri( "/oauth2/authorize" )
.authorizationRequestRepository( cookieAuthorizationRequestRepository() )
.and()
.redirectionEndpoint()
.baseUri( "/oauth2/callback/*" )
.and()
.userInfoEndpoint()
.userService( customOAuth2UserService )
.and()
.successHandler( oAuth2AuthenticationSuccessHandler )
.failureHandler( oAuth2AuthenticationFailureHandler )
.and()
.formLogin()
.loginPage( "/login" )
.successHandler( authSuccessHandler() )
.failureHandler( authFailureHandler() )
.and()
.logout()
.logoutUrl( "/logout" )
.logoutSuccessUrl( "/" )
.deleteCookies( "cookieLogin" )
.logoutSuccessHandler( ( httpServletRequest, httpServletResponse, authentication ) -> {
httpServletResponse.setStatus( HttpServletResponse.SC_OK );
} )
.and()
.rememberMe()
.rememberMeServices( new RememberMeServices( loginService, tokenService ) )
.key( TokenService.HASH_SECRET )
.and()

.csrf()
.csrfTokenRepository( new CsrfTokenRepository( tokenService ) )
.and()



.sessionManagement()
.sessionCreationPolicy( SessionCreationPolicy.STATELESS )

.and()
.addFilterBefore( new TokenFilter( tokenService, sessionManager ), CsrfFilter.class );

最佳答案

使用相同的 URL,但具有一个查询参数,例如:loginType,其值可以是 PASSPORTDEFAULT,以及默认值当它不存在时,将其设置为DEFAULT

在您的Controller中读取此查询参数并返回不同的 View ,或返回相同的 View ,其状态决定如何针对正确的loginType自定义页面。当有人尝试登录但失败时,会使用类似的方法,旧式 servlet 应用程序会添加 error=true 并显示用户无法验证的错误消息。

关于java - 如何在Spring Security中为两个不同的URL指定两个不同的登录表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59946131/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com