有没有办法在Spring Security 4.x上禁用默认的“/ login”?

时间:2015-04-15 21:47:01

标签: spring spring-mvc spring-security

当Spring Security从版本3.2.x发展到4.0.0时,使用基于XML的配置时需要进行多项修改,如Migration reference中所述。在完成之后,我仍然在努力解决有关新form-login@login-processing-url属性的一些问题。即使我已将其指定为继续使用/j_spring_security_check作为路径,它也会使新的/login路径保持活动状态。

我一直在使用Spring Security和SpringMVC,并开始使用版本3.2.7进行开发。我有一个控制器将路径/login映射到显示登录表单的页面,并根据收到的可能参数显示某个错误消息。以下是我的控制器

@Controller
public class LoginController {

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login(@RequestParam(value = "error", required = false) String error,
                        @RequestParam(value = "logout", required = false) String logout,
                        Model model) {

        if (error != null) {
            model.addAttribute("error", "Usuário e senha inválidos.");
        }

        if (logout != null) {
            model.addAttribute("msg", "Logout bem sucedido.");
        }

        return "login";
    }
}

在版本3.2中,我的spring-security.xml文件将form-login@login-page参数指定为/login,因此显示了我的个性化登录表单(<logout>使用了相同的路径)。< / p>

现在,即使我已明确配置form-login@login-processing-url/login仍会重定向到spring security的默认登录页面。除此之外,即使我还指定了logout@logout-url属性,当登出spring时仍然会将我重定向到带有“logout successful”消息的默认登录表单,而不是我自己的控制器来显示我的个性化注销消息。

当我使用/login?路径时,应用程序会显示我自己的登录表单,但如果我调用/login?logout/login?error,它们将分别显示我的注销和错误消息, Spring重定向到默认登录页面。

问题:有没有办法完全禁用/login重定向?

我知道我可以简单地将我的个性化路径更改为其他内容,例如/signin并避免混淆,但我这样做是为了更多地了解Spring Security 4.x.此外,我担心用户输入URL而不是浏览链接只会放在spring的默认登录页面上。

此外,还有我的spring-security.xml文件的摘录,已经适应版本4.x.

<http auto-config="true" use-expressions="true" disable-url-rewriting="true">
    <access-denied-handler error-page="/403" />
    <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />
    <intercept-url pattern="/power/**" access="hasRole('ROLE_POWER_USER')" />
    <form-login 
        login-page="/login"  <!-- my controller -->
        default-target-url="/" 
        login-processing-url="/j_spring_security_check" <!-- to reproduce 3.2 behaviour -->
        authentication-failure-url="/login?error" 
        username-parameter="username"
        password-parameter="password" />
    <logout logout-success-url="/login?logout" 
            logout-url="/j_spring_security_logout"/>
    <headers disabled="true"/>
    <csrf disabled="false"/> <!-- I know it could be ommited -->
</http>

更新(2015年4月16日):看起来像4.0.0版的错误。检查我的答案。

2 个答案:

答案 0 :(得分:0)

您需要做的是实现自定义AuthenticationEntryPoint以关闭登录重定向(设置为默认值)。

以下是一些入门阅读信息:

http://docs.spring.io/spring-security/site/docs/4.0.0.RELEASE/reference/htmlsingle/#auth-entry-point

这里也是一个如何实现的例子:

http://krams915.blogspot.com.au/2010/12/spring-security-mvc-integration-using_26.html

答案 1 :(得分:0)

我已将登录控制器映射更改为/access。我的登录不仅有效(如预期的那样),但由于某种原因,应用程序在访问/login时停止返回Spring的默认登录表单。

它根本无法识别路径(404错误)。我之前描述的行为,使用/login时默认和自定义登录表单之间的混淆看起来就像一个错误。让我们希望在未来的版本中得到修复。

因此,我建议的“修复”是更改控制器映射,即使这反映在更改多个视图上的调用。