首页 > 解决方案 > 如何设置自定义登录页面而不是spring security默认登录页面

问题描述

我将 Angular 与 Spring Boot 集成,我想设置自己的登录页面,但是当我运行我的应用程序时,它会显示 Spring Security 默认登录页面。我更改了配置文件中的所有内容,但它仍然显示 spring security 默认登录页面。如何设置自定义登录页面?

安全配置

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
     @Override
        protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
         auth.inMemoryAuthentication().withUser("nilmani").password("{noop}akj@159")
         .roles("USER");
        }

        @Override
        protected void configure(final HttpSecurity http) throws Exception {
            http
              .csrf().disable()
              .authorizeRequests()
              .anyRequest().authenticated()
              .and()
              .formLogin()
              .loginPage("/login.component.html")
              .loginProcessingUrl("/perform_login")
              .defaultSuccessUrl("/dashboard.component.html", true);
              //.failureUrl("/login.html?error=true")
        }

        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }

}

login.component.html

<div class="app-body">
  <main class="main d-flex align-items-center">
    <div class="container">
      <div class="row">
        <div class="col-md-8 mx-auto">
          <div class="card-group">
            <div class="card p-4">
              <div class="card-body">
                <form>
                  <h1>Login</h1>
                  <p class="text-muted">Sign In to your account</p>
                  <div class="input-group mb-3">
                    <div class="input-group-prepend">
                      <span class="input-group-text"><i class="icon-user"></i></span>
                    </div>
                    <input type="text" class="form-control" placeholder="Username" [(ngModel)]="username" [ngModelOptions]="{standalone: true}"  autocomplete="username" required>
                  </div>
                  <div class="input-group mb-4">
                    <div class="input-group-prepend">
                      <span class="input-group-text"><i class="icon-lock"></i></span>
                    </div>
                    <input type="password" class="form-control" placeholder="Password"[(ngModel)]="password" [ngModelOptions]="{standalone: true}"  autocomplete="current-password" required>
                  </div>
                  <div class="row">
                    <div class="col-6">
                      <button type="button" (click)="dologin()" class="btn btn-primary px-4">Login</button>
                    </div>
                    <div class="col-6 text-right">
                      <button type="button" class="btn btn-link px-0">Forgot password?</button>
                    </div>
                  </div>
                </form>
              </div>
            </div>
            <div class="card text-white bg-primary py-5 d-md-down-none" style="width:44%">
              <div class="card-body text-center">
                <div>
                  <h2>Sign up</h2>
                  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
                  <button type="button" class="btn btn-primary active mt-3">Register Now!</button>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </main>
</div>

标签: spring-bootspring-security

解决方案


您的 SecurityConfig 很好。我也是这样做的。你必须确保你有一个控制器,它接受这个 url 并提供正确的页面。通常你没有定义一个 html 页面!正确的 url 可能只是/login

所以你的 SecurityConfig 看起来像:

.formLogin()
  .loginPage("/login")

例如你的控制器:

@Controller
@RequestMapping(value="/login")
@Scope(value="session")
public class LoginController extends AbstractWebController {

    @GetMapping
    public ModelAndView loginView() {
        ModelAndView mav = this.getModelAndView("login");
        return mav;
    }

    // further code goes here
}

例如,此控制器返回一个 jsp 页面,您可以使用 Angular 或其他方式根据您的需要对其进行样式设置。


推荐阅读