如何使用Spring Security自定义登录页面?

时间:2017-01-22 04:04:10

标签: java jquery html spring-boot spring-security

我在我的应用程序中使用Spring Security,这是安全部分,用于验证用户,但登录页面由Spring Security提供:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    public void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
            .authorizeRequests()
                .antMatchers("/home*").hasRole("USER")
                .and()
            .formLogin();

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                 .withUser("user")
                 .password("password")
                 .roles("USER")
    }
}

而不是Spring的登录页面,我想使用下面的登录页面:

login.html

<html lang='en'>
    <head>
        <title>WebApp</title>
        <meta charset='utf-8' />

        <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
             <link rel="stylesheet" type="text/css" href="css/bootstrap.css" />
             <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" />
             <link rel="stylesheet" href="css/login.css" />  
    </head>

    <body>
        <div class="login-page">
            <img src='img/taxi_.jpg' style='width: 180px; margin-left: auto; margin-right: auto; display: block; padding-top: 20px; padding-bottom:20px;' />

            <div class="heading">
                <center>Dashboard</center>
            </div>
            <div class="form">
                <form action ="home.html" class="register-form">
                    <input type="text" placeholder="name"/>
                    <input type="password" placeholder="password"/>
                    <input type="text" placeholder="email address"/>
                    <button>create</button>
                    <p class="message">Already registered? <a href="#">Sign In</a></p>
               </form>
               <form action="home.html" class="login-form">
                    <input type="text" placeholder="username"/>
                    <input type="password" placeholder="password"/>
                    <button id="button_login">login</button>
                    <p class="message">Not registered? <a href="#">Create an account</a></p>
               </form>
            </div>
        </div>
    </body>
</html>

如何使用自定义登录页面而不是Spring Security的登录页面?

3 个答案:

答案 0 :(得分:1)

请参阅Spring Security Reference

  

虽然自动生成的登录页面便于快速启动和运行,但大多数应用程序都希望提供自己的登录页面。为此,我们可以更新我们的配置,如下所示:

     
protected void configure(HttpSecurity http) throws Exception {
  http
      .authorizeRequests()
          .anyRequest().authenticated()
          .and()
      .formLogin()
          .loginPage("/login") 1
          .permitAll();        2
}
     

1 更新的配置指定了登录页面的位置    2 我们必须授予所有用户(即未经身份验证的用户)访问我们的登录页面的权限。 formLogin()。permitAll()方法允许为与基于表单的登录相关联的所有URL授予对所有用户的访问权限。

您修改过的代码:

public void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity
        .authorizeRequests()
            .antMatchers("/home*").hasRole("USER")
            .and()
        .formLogin()
            .loginPage("/login.html")
            .permitAll();
}

答案 1 :(得分:0)

httpSecurity.authorizeRequests()
                .antMatchers("/home*").hasRo‌​le("USER").and()                                          
             .formLogin()
                 .loginPage("/login.html")
                 .permitAll();

loginFormUrl必须以&#34; /&#34;开头或绝对的网址。并确保可以正确处理请求/login.html

顺便说一句:如果您没有配置处理网址,则处理网址与login page/login.html)网址的方式相同post方法,但在您的登录页面中,操作网址为/home.html,请将处理网址配置为&#39; /home.html'

.formLogin()
    .loginProcessingUrl("/home.html")
    .loginPage("/login.html")
    .permitAll();

默认情况下启用CSRF,我无法在您的登录表单中找到任何CSRF令牌。您可以禁用csrf或使用令牌请求。

http.csrf().disable();

答案 2 :(得分:0)

只想指出此处未阐明的片刻。

1)首先,.loginPage("/login.html")不会解决问题(无论如何我都没有)。引号中的内容是将在控制器中搜索的URL路径。这是我的安全配置文件中的代码片段:

    .formLogin().loginPage("/login")
    .loginProcessingUrl("/authentication").permitAll();

在这里我写了"/login"。因此,现在在您的控制器中定义/login路径应指向您的login.html页面。

    @GetMapping("/login")
    public String login() {
        return "login";
    }

只有这样,它才应重定向到所需的视图页面。我通常将查看页面放在/webapp/WEB-INF/view文件夹下。
附言我希望您正确配置ViewResolver bean,否则cos否则将不起作用:)

2)还有一件事。我看到您想在页面上使用一些CSS。要为自定义登录页面启用CSS和其他静态资源,您应该添加此行

.antMatchers("/resources/**").permitAll()

因此,最终将是这样(非常简短和令人毛骨悚然的版本,但是您的自定义登录应该可以):

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/resources/**").permitAll()
            .anyRequest().authenticated()
            .and()

        .formLogin().loginPage("/login")
        .loginProcessingUrl("/authentication").permitAll();
}

仅供参考,请将您的资源放在/webapp/resources/下。另外,您应该在spring配置文件中配置资源处理程序。

我的解释很la脚,但希望有人能理解。希望它能工作:)

这里也是一个不错的链接,可以将您的头缠住:

https://docs.spring.io/spring-security/site/docs/current/guides/html5/form-javaconfig.html#grant-access-to-remaining-resources