スプリングブートセキュリティチュートリアル に従いましたが、最終結果には、ログインに成功した後、ブラウザが/undefined
にリダイレクトされるという問題があります。 。
チュートリアルで参照されているコードのクローンを作成しました。何か間違った入力をしたか、コンポーネントなどを追加するのを忘れたと思っています。いいえ、同じ問題があります。
Stackoverflowで検索すると、次のようにconfigure
のWebSecurityConfigurerAdapter
メソッドでデフォルトの成功URLを定義する必要があることがわかりました。
.defaultSuccessUrl("/")
しかし、それでも行きません。保護されたリソースにアクセスするとログインページが表示され、ログインに成功しても保護されたリソースにリダイレクトされません。 '/ undefined'ページに移動します。ただし、成功を強制することは機能します。
.defaultSuccessUrl("/", true)
...しかし、ログインに成功した後、ユーザーは(最初に)要求された保護されたリソースにリダイレクトされる必要があるため、これは私が必要とするものではありません。
プロジェクトの関連部分は次のとおりです。
WebSecurityConfig:
package ro.rinea.andrei.Security;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
コントローラー:
package ro.rinea.andrei.Controllers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class WebController {
@RequestMapping("/")
public String index() {
return "index";
}
@RequestMapping("/salut")
public String salut() {
return "salut";
}
@RequestMapping("/login")
public String login() {
return "login";
}
}
index
、login
、およびsalut
に対して定義されたビューがあります(必要に応じて、それらのコンテンツを追加します)
およびbuild.gradleファイル:
buildscript {
ext {
springBootVersion = '1.4.0.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'Java'
apply plugin: 'idea'
apply plugin: 'spring-boot'
jar {
baseName = 'tstBut'
version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-devtools')
compile('org.springframework.boot:spring-boot-starter-jdbc')
compile('org.springframework.boot:spring-boot-starter-jersey')
compile('org.springframework.boot:spring-boot-starter-mobile')
compile('org.springframework.boot:spring-boot-starter-thymeleaf')
compile('org.springframework.boot:spring-boot-starter-validation')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-web-services')
compile('org.springframework.boot:spring-boot-starter-security')
runtime('org.postgresql:postgresql')
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.springframework.restdocs:spring-restdocs-mockmvc')
}
次のようにリダイレクトするsuccessHandlerを追加できます。
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
...
.formLogin()
.loginPage("/login")
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
redirectStrategy.sendRedirect(request, response, "/");
}
})
私は同じ問題を抱えていました、そしてこれは私が使用した回避策です。まず、保護されていないルート「/」のマッピングを作成します
@RequestMapping(value = { "/" }, method = RequestMethod.GET)
public ModelAndView projectBase() {
return new ModelAndView("redirect:/home");
}
たとえば、ユーザーが最初に家のように行きたい場所にリダイレクトするようにします
@RequestMapping(value = { "/home" }, method = RequestMethod.GET)
public ModelAndView getHome() {
ModelAndView model = new ModelAndView("account/home");
model.addObject("user", userFacade.getJsonForUser(userFacade.getUserForClient()));
return model;
}
次のようなセキュリティ構成でルートURLが開いていることを確認してください...
http.
authorizeRequests()
.antMatchers("/").permitAll()
これで、ルート/にヒットし、制限されているホームにリダイレクトされ、ホームのリターンURLを使用してログインページに送信されます。その後、最初にログインしたときに/ homeとして正しく書き込まれます
何らかの理由で、Spring Securityはデフォルトの成功URLを尊重しておらず、Webサーバーの構成の問題が原因である可能性があります。私のローカルマシンではこの問題は発生しませんが、他のいくつかのマシンでは発生します。常にreturnUrlが発生するため、回避策は両方の場所で機能します。