在Spring Security 4.0
中,有一个所谓的默认登录页面
,如下所示:
深入研究源代码我发现了过滤器 org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter
呈现该登录页面。实际上,它有 private StringgenerateLoginPageHtml(HttpServletRequest request, boolean loginError, boolean logoutSuccess)
方法,其中包含以下代码片段:
if (formLoginEnabled) {
sb.append("<h3>Login with Username and Password</h3>");
sb.append("<form name='f' action='").append(request.getContextPath()).append(authenticationUrl).append("' method='POST'>\n");
sb.append(" <table>\n");
sb.append(" <tr><td>User:</td><td><input type='text' name='");
sb.append(usernameParameter).append("' value='").append("'></td></tr>\n");
sb.append(" <tr><td>Password:</td><td><input type='password' name='").append(passwordParameter).append("'/></td></tr>\n");
if (rememberMeParameter != null) {
sb.append(" <tr><td><input type='checkbox' name='").append(rememberMeParameter).append("'/></td><td>Remember me on this computer.</td></tr>\n");
}
sb.append(" <tr><td colspan='2'><input name=\"submit\" type=\"submit\" value=\"Login\"/></td></tr>\n");
renderHiddenInputs(sb, request);
sb.append(" </table>\n");
sb.append("</form>");
}
问题是我想从过滤器链中删除该过滤器,以便自定义我的登录页面(位于 http://my-domain/login
网址)。可能吗?
我的安全配置:
<http auto-config="true">
<intercept-url pattern="/admin**"
access="hasRole('ROLE_USER')" />
<form-login login-page="/login"
default-target-url="/admin"
authentication-failure-url="/login?error=true"
username-parameter="user"
password-parameter="password"
login-processing-url="/login"/>
<logout logout-success-url="/login?logout" logout-url="/logout" />
</http>
最佳答案
为什么你要“深入研究源头”而不是 documentation ,它非常清楚地涵盖了这一点:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login");
}
仅当您未设置登录页面时才会生成默认登录页面。
如果您检查 source code of AbstractAuthenticationFilterConfigurer
你会看到:
protected T loginPage(String loginPage) {
this.loginPage = loginPage;
this.authenticationEntryPoint = new LoginUrlAuthenticationEntryPoint(loginPage);
this.customLoginPage = true;
return getSelf();
}
如果您查看 source code of FormLoginConfigurer
:
private void initDefaultLoginFilter(H http) {
DefaultLoginPageViewFilter loginPageGeneratingFilter = http.getSharedObject(DefaultLoginPageViewFilter.class);
if(loginPageGeneratingFilter != null && !isCustomLoginPage()) {
//stuff
}
}
所以你看,调用 loginPage
设置 customLoginPage = true
。这会禁用
DefaultLoginPageGenerateFilter
。
关于java - 如何从 Spring Security 中删除过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28658265/