Java 如何在Spring Security中为两个不同的URL指定两种不同的登录形式?
我有一个相对复杂的spring安全配置,如下所示。我正在努力实现以下目标: 对Java 如何在Spring Security中为两个不同的URL指定两种不同的登录形式?,java,spring,spring-boot,spring-security,Java,Spring,Spring Boot,Spring Security,我有一个相对复杂的spring安全配置,如下所示。我正在努力实现以下目标: 对/passport/**的请求将通过另一种formLogin()(“/passport/login”)进行身份验证。这与默认formLogin不同,默认formLogin在(“/login”) 这两种形式将使用相同的身份验证机制(或者在幕后非常相似) 目前,对/passport/123等的请求在某种程度上是“打开的”且未经验证的,而它们需要重定向到/passport/login是否有人看到我做错了什么或如何最好地实现这
/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
,该参数的值可以是PASSPORT
或DEFAULT
,如果不存在,则默认为DEFAULT
在
控制器
中读取此查询参数,并返回不同的视图,或返回相同的视图,其状态决定如何为正确的登录类型自定义页面。当有人尝试登录失败时,也会使用类似的方法,老式的servlet应用程序会添加一个error=true
,并显示一条错误消息,说明用户未能进行身份验证。/passport**
与您的URL不匹配。它应该是/passport/**
,以匹配。@M.Deinum-typo,同时将代码传递到Stackoverflow。必须匿名一些实际运行的bits代码确实有正向斜杠您实际上没有保护/passport
URL。您只定义了一个登录页面,因此安全性将不会生效。@M.Deinum super谢谢!。。。just.antMatchers(“/passport/**”).denyAll()?我的假设是.anyRequest().authenticated()就可以了。如果你denyAll
noone被允许访问。您需要在antMatcher(/passport/**)中使用anyRequest().authenticated()
。我告诉你没有安全规则。