spring security 表单登录loginPage和loginProcessingUrl

配置

.authorizeRequests()
.antMatchers("/", "/index").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/testpage.html")
.defaultSuccessUrl("/testS")
.permitAll()
.and()
.logout()
.permitAll()

testpage.html

<form class="form-signin" method="post" action="/login">
    <h2 class="form-signin-heading">Please sign in</h2>
    <p>
        <label for="username" class="sr-only">Username</label>
        <input type="text" id="username" name="username" class="form-control" placeholder="Username" required="" autofocus="">
    </p>
    <p>
        <label for="password" class="sr-only">Password</label>
        <input type="password" id="password" name="password" class="form-control" placeholder="Password" required="">
    </p>
    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
</form>

自己对loginPage和loginProcessingUrl做了下测试:
两者都不配置:默认都是/login
两者都配置:按自己的来
只配置loginProcessingUrl:loginPage默认提供的页面

这样想着,觉得loginProcessingUrl默认应该是/login,所以
只配置loginPage,action为/login
(代码上面)
结果发现就不行了

我想问一下,loginProcessingUrl默认值是什么?自定义配置了loginPage就必须同时配置上loginProcessingUrl吗?

初涉Spring Security,希望熟知的可以解下我的疑惑,thx

阅读 47.1k
4 个回答

我断点看了一下

class AbstractAuthenticationFilterConfigurer { 
........
protected final void updateAuthenticationDefaults() {
        if (loginProcessingUrl == null) {
            loginProcessingUrl(loginPage);//如果loginProcessingUrl为null,则设置loginPage默认值
        }
        if (failureHandler == null) {
            failureUrl(loginPage + "?error");
        }

        final LogoutConfigurer<B> logoutConfigurer = getBuilder().getConfigurer(
                LogoutConfigurer.class);
        if (logoutConfigurer != null && !logoutConfigurer.isCustomLogoutSuccess()) {
            logoutConfigurer.logoutSuccessUrl(loginPage + "?logout");
        }
....
    }

如果只配置loginPage而不配置loginProcessingUrl的话

那么loginProcessingUrl默认就是loginPage

你配置的loginPage("/testpage.html") ,那么loginProcessingUrl就是"/testpage.html"

先说看了Spring security源码后的结论吧~(没看文档,只是出于个人对代码和代码注释的理解得出的结论,可以自己再看看是不是这样):
如果你在重写WebSecurityConfigurerAdapter的configure方法时没有设置loginPage(),那么默认的访问页面就是"/login",如果你没有设置loginProcessingUrl(),那么默认的用户名密码后端校验逻辑的URL跟loginPage对应的地址一致。

首先可以根据代码注释解释下两个属性分别是干嘛用的:

loginPage the login page to redirect to if authentication is required (也就是说这个是定义校验页面路径的)
loginProcessingUrl the URL to validate username and password(这个是定义校验逻辑处理的后端URL的)

其次可以看看默认值:

 DEFAULT_LOGIN_PAGE_URL = "/login"(默认设置的页面路径为/login)
/**
     * Updates the default values for authentication.
     *
     * @throws Exception
     */
    protected final void updateAuthenticationDefaults() {
        if (loginProcessingUrl == null) {
            loginProcessingUrl(loginPage); //(默认设置与成loginPage路径相同的URL)
        }
        if (failureHandler == null) {
            failureUrl(loginPage + "?error");
        }

        final LogoutConfigurer<B> logoutConfigurer = getBuilder().getConfigurer(
                LogoutConfigurer.class);
        if (logoutConfigurer != null && !logoutConfigurer.isCustomLogoutSuccess()) {
            logoutConfigurer.logoutSuccessUrl(loginPage + "?logout");
        }
    }
新手上路,请多包涵

loginProcessingUrl默认好像是j_spring_secutity_check
跟loginPage的区别在这里
https://stackoverflow.com/que...

好像只要保持action和HttpSecurity里配置的loginProcessingUrl一致就可以了,也不用自己去处理

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin() // 表单登陆
                .loginPage("/login.html") // 登陆页面
                .loginProcessingUrl("/login/oneself") // 登陆表单提交请求
                .and()
                .authorizeRequests() // 对请求进行授权
                .antMatchers("/login.html") // 指定相应的请求
                .permitAll() // 不需要验证
                .anyRequest() // 任何请求
                .authenticated(); // 都需要身份认证
    }

为啥我这么配置,点击自己的登陆页面提交时,提示/login/oneself这个404

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题